[英]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
是我尋找該內存擴展問題的一部分 包含上述代碼的方法完成后 ,應用程序將遭受“在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();
}
假設theImage
和theIcon.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.