用线程实现动态改变图标

2016-01-29 11:54 30 1 收藏

用线程实现动态改变图标,用线程实现动态改变图标

【 tulaoshi.com - C语言心得技巧 】

用线程实现动态改变图标
作者:cj_ict

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com)

下载本文示例代码

前几天看了一个《如何在标题栏中显示动态图标》文章,作者为重庆建设集团一所 唐星彬。觉得用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 threadn"));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编译通过!

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com)

来源:https://www.tulaoshi.com/n/20160129/1483848.html

延伸阅读
void __fastcall TForm1::btnGetClick(TObject *Sender) { int x,y; x = GetSystemMetrics(SM_CXSCREEN); y = GetSystemMetrics(SM_CYSCREEN); ShowMessage("显示器水平分辨率:" + AnsiString(x) + "\n\n显示器垂直分辨率:" + AnsiString(y)); } //--------------------------------------------------------...
标签: Web开发
注:以下内容基于IE中GIF的onload事件的基础上,故所有测试IE only 需要用到的几个图片 先看一个简单的事实: 代码如下: SCRIPT LANGUAGE="JavaScript" var img=new Image(); img.src="attachment/1178365293_0.gif"; img.onload=function() { alert("如要关闭请按住ESC键不放,并点击关闭按钮"); } /SCRIPT 如果不出所料...
标签: PHP
PHP中实现多线程? 看到这个标题, 你一定以为我疯了..但是事实上我真的这么做了. 下面是我的一些做法, 已经实验过. 确实可以的. 我们知道PHP本身是不支持多线程的, 但是我们的WEB服务器是支持多线程的. 也就是说可以同时让多人一起访问. 这也是我在PHP中实现多线程的基础. 假设我们现在运行的是a.php这个文件. 但是我在程序中...
当前流行的Windows操作系统能同时运行几个程序(独立运行的程序又称之为进程),对于同一个程序,它又可以分成若干个独立的执行流,我们称之为线程,线程提供了多任务处理的能力。用进程和线程的观点来研究软件是当今普遍采用的方法,进程和线程的概念的出现,对提高软件的并行性有着重要的意义。现在的大型应用软件无一不是多线程多任务处理...
http://tailsherry.javaeye.com/blog/176152 熟悉编写JavaScript的人,都习惯在页面写入setTimeOut来实现web页面的定时监控或事务处理。但是如何在Java服务端来实现这样一个监控机制呢?一般大家都会想到线程。但是一直以来,都没有亲身动手实践过。趁着工作间隙,自己也搬出一段代码来,与大家一起分享线程编程的神奇魔力。 &n...

经验教程

725

收藏

68
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部