当前位置: 首页 > 图文教程 > 开发语言 > VC++ > 用线程实现动态改变图标

VC++
在类VC的界面实现中加入目录树
软件换肤技术在 BCB 中的实现
利用非模窗口生成MDI介面
报表输出轻松搞定
Windows 中不规则窗体的编程实现
解说Win32的窗口子类化
使用测试优先方法开发用户界面
一个简单的登录对话框的实现
一个简单的日记本程序
从资源中加载皮肤
一个在RichEdit中添加表情图象的类
ActiveSkin 4.3 软件换肤在VC中的实现
一种另类“关于(About)”对话框的动态显示方法
对话框打印预览及打印
关于如何换肤、子类化的解决方案
制作 MSN、QQ 的消息提示窗口
如何对 BCGControlBarPro 进行换肤
定制个性化的对话框窗口类
改变窗口中的光标形状
更新MFC中的视图,跟踪.NET Framework中的事件

VC++ 中的 用线程实现动态改变图标


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-10-30   浏览: 60 ::
收藏到网摘: n/a

用线程实现动态改变图标
作者: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编译通过!