生活随笔
收集整理的這篇文章主要介紹了
用线程实现动态改变图标
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
用線程實現動態改變圖標
作者:cj_ict
下載本文示例代碼
前幾天看了一個《如何在標題欄中顯示動態圖標》文章,作者為重慶建設集團一所 唐星彬。覺得用SetTimer實現起來麻煩,且占用資源。手頭一癢將其改為線程實現,并且把線程封裝在類里。使用簡單,不需要設置SetTimer在OnTimer函數里調用。只需直接調用
m_animIcon.SetImageList(IDB_BITMAP_ANIM,6,RGB(0,0,0));
m_animIcon.Draw(this);
即可。
程序其他部分,是采用唐星彬的,我只是把有OnTimer實現的部分,改成用線程實現。
class CAnimateIcon
{
protected://創建一個列表變量,用于保存圖像列 CImageList m_imgList;//當前圖像序號int m_iImageCounter;//圖像總數int m_nMaxNumOfImages;//關閉線程bool m_bExit; //擁有圖標的窗口的窗口類指針CWnd * m_pWnd;//圖標刷新間隔DWORD m_dwMilliseconds;public:void ChangeInterval(DWORD dwTimes);//改變圖標刷新時間間隔BOOL Draw(CWnd *pWnd,DWORD dwTimes=1000);CAnimateIcon();~CAnimateIcon();bool SetImageList(int IDOfImageListResource,int numberOfImages,COLORREF transparentColor);
protected:static UINT WINAPI _ThreadAnimation(LPVOID pParam);};BOOL CAnimateIcon::Draw(CWnd *pWnd,DWORD dwTimes)
{//擁有圖標的窗口的窗口類指針m_pWnd=pWnd;ASSERT(m_pWnd);//圖標刷新間隔m_dwMilliseconds=dwTimes; unsigned int nDummy;//注意:傳遞給線程本實例的指針HANDLE hThread = (HANDLE) _beginthreadex(NULL,0,_ThreadAnimation,this,CREATE_SUSPENDED,&nDummy);if (!hThread) {TRACE(_T("Draw: Couldn''t start a ICON animation thread/n"));return false;} else {ResumeThread(hThread);}CloseHandle(hThread);//不再需要線程句柄,將其關閉return true;
}UINT WINAPI CAnimateIcon::_ThreadAnimation(LPVOID pParam)
{//從傳遞過來的實例指針,可以操作不同的實例,//注意線程函數是唯一和靜態的。CAnimateIcon &p=*(CAnimateIcon *)pParam;while(!p.m_bExit){if(p.m_imgList.m_hImageList==NULL)return 0;p.m_iImageCounter++;if(p.m_iImageCounter>=p.m_nMaxNumOfImages)p.m_iImageCounter=0;HICON hIcon=p.m_imgList.ExtractIcon(p.m_iImageCounter);HICON hPrevIcon=(HICON)p.m_pWnd->SetIcon(hIcon,false);DestroyIcon(hPrevIcon);Sleep(p.m_dwMilliseconds);}return 1;
}
在VC6.0+WIN2000+SP3編譯通過!
總結
以上是生活随笔為你收集整理的用线程实现动态改变图标的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。