簡體   English   中英

什么時候System.Drawing.Bitmap不是System.Drawing.Bitmap?

[英]When is System.Drawing.Bitmap not System.Drawing.Bitmap?

在解決內存擴展問題時,遇到了一個讓我感到困惑的異常情況。

using (var theImage = ApplicationGlobalWinForm.Properties.Resources.LanguageIcon) {
    PictureBox1.Image = theImage;
    this.Icon = System.Drawing.Icon.FromHandle(theImage.GetHicon());
}

哪里

  • ApplicationGlobalWinForm.Properties.Resources.LanguageIcon是資源駐留映像,它作為System.Drawing.Bitmap加載
  • this.Icon是應用程序窗口的圖標
  • PictureBox1是一個客戶端區域圖像
  • using是我尋找該內存擴展問題的一部分
  • 該應用程序是WinForms(而不是WPF)應用程序,如這篇文章的標簽中所述

包含上述代碼的方法完成后 ,應用程序將遭受“在System.Drawing.dll中發生類型為'System.ArgumentException'的未處理的異常”。

PictureBox1.Image分配更深地移到代碼中,並theIcon.ToBitmap()分配theIcon.ToBitmap()而不是theImage解決以下問題:

using (var theImage = ApplicationGlobalWinForm.Properties.Resources.LanguageIcon) {
    var theIcon = System.Drawing.Icon.FromHandle(theImage.GetHicon());
    this.Icon = theIcon;
    PictureBox1.Image = theIcon.ToBitmap();
}

假設theImagetheIcon.ToBitmap都是同一類型( System.Drawing.Bitmap ),那是怎么回事?

進一步的困惑的是,除去using從有問題的代碼段

var theImage = ApplicationGlobalWinForm.Properties.Resources.LanguageIcon;
PictureBox1.Image = theImage;
this.Icon = System.Drawing.Icon.FromHandle(theImage.GetHicon());

效果很好,謝謝。

我很沮喪(我也沒有解決內存擴展問題),希望那里有一些WinForms專家可以解釋問題。

謝謝!

我不確定100%,但是這是我認為正在發生的事情。

在第一個示例中,您將Image分配給PictureBox1.Image ,將this.Icon設置為從theImage創建的新圖標(但不再引用theImage ),然后處理theImage (保留using塊)。 因此,現在PictureBox1.Image引用已處置的對象,以便在發生繪畫事件或類似事件時將其炸毀。

在第二個示例中,從theImage創建一個新圖標(再次不再引用theImage ),將this.Icon設置為上一步中創建的圖標,然后將PictureBox1.Image設置為一個由該圖標制成的新位圖,最后處置theImage但由於不再使用它了,所以不再重要。 我敢打賭,如果您調用PictureBox1.Image.Dispose()您將獲得與第一個代碼示例中相似的結果。 這也將解釋為什么刪除using語句會使所有內容再次工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM