[Vb.net] 如何在表單顯示動態的圖示 Icon (二)

[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 就不會有問題了。


ku3