使用gdi+和之前寫的 CTimerMgr 寫了一個播放gif動畫的小控件。原理就是使用gdi+解碼gif,讀出動畫幀間隔,使用CTimerMgr
設(shè)置定時器。定時器超在新創(chuàng)建的線程中設(shè)置當(dāng)前應(yīng)該播放的幀(SelectActiveFrame()),并要求控件重繪(Invalidate())。
使用中發(fā)現(xiàn)debug下output窗口總是輸出 First-chance exception at 0x4aeee2e0
0x80000001: 尚未實現(xiàn),但并不影響程序運行。后來發(fā)現(xiàn)問題就源自于在 定時器線程中調(diào)用了 GDI+ 的Image類的
SelectActiveFrame()。應(yīng)該是 Image不是線程安全的類導(dǎo)致的。
解決方案很簡單,使用WM_Timer做定時器。其實從一開始的實現(xiàn)上就應(yīng)該使用WM_TIMER,而不是定時器線程。當(dāng)初使用定時器線程是怕UI線程中有耗時操作會導(dǎo)致gif卡。
但是定時器線程并不能解決這個問題,因為定時器線程僅僅是設(shè)置了應(yīng)當(dāng)繪制的下一幀,具體的繪制還是在UI線程中處理的。