[Vb.net] 如何在表單顯示動態的圖示 Icon (二)
前一篇貼文用 Me.Icon = Icon.FromHandle(CType(PictureBox1.Image, Bitmap).GetHicon) 讓表單的 Icon 可以動態呈現,貼出後也沒有長時間測試,前天拿出來跑得久一點却會出現 GDI+ 錯誤。
對照 MSDN(MSDN 的說明 ) 後覺得有可能是垃圾處理的問題,改成下面這樣後就沒再出現錯誤了。
Public Class Form3
'---使用 WinAPI 處理垃圾--
<System.Runtime.InteropServices.DllImportAttribute("user32.dll")> _
Private Shared Function DestroyIcon(ByVal handle As IntPtr) As Boolean
End Function
Private Sub Form3_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
Timer1.Interval = 200
Timer1.Enabled = True
End Sub
'---使用 Timer 定時擷取變化中的圖像轉成 Icon---
Private Sub Timer1_Tick(sender As System.Object, e As System.EventArgs) Handles Timer1.Tick
Dim a As Bitmap = CType(PictureBox1.Image, Bitmap)
Dim HIcon As IntPtr = a.GetHicon()
Dim newIcon As Icon = System.Drawing.Icon.FromHandle(HIcon)
Me.Icon = newIcon
DestroyIcon(newIcon.Handle)
End Sub
End Class
不過用 Timer 去定時更新 icon 不是最好的方法,因為還有同步的問題,如果 GIF 原圖的畫格更新時間小於 Timer 的 Interval 時間時就會有畫格遺失的情形,雖然視覺上的影響不大,但如果原圖是有閃爍效果的,這時就有可能變成常暗或常亮,或閃爍週期不平均的現象了。
比較好一點的做法是自己寫 control 做圖片輪播,並且在換圖片畫格時自動刷新表單的 icon 就不會有問題了。