动感的图标
看了这么久的WINDOWS 单调而标准的界面,不知你是否会觉得有些烦。其实你只需要稍做改动,就可令你的应用程序增色不少。用一句流行的话来说,就是COOL极了。本文将介绍一种在窗口标题栏实现动态图标的方法,只需少量的代码,就可以得到一种奇妙的效果。就像超级解霸在运行时不断转动的图标一样。
下面就让我们开始吧。我们将用VISUAL C++来实现它。首先基于C++的面向对象的设计思想,我们应该建立一个自己的类来管理有关类对象的创建、运行、销毁等等工作。但是不要忘了使用VISUAL C++很关键的一条就是要善于使用微软的MFC(基本类库),在MFC中,封装了很多常用的类和一些WINDOWS的API函数。我们应该感谢这些优秀的程序员,感谢他们为我们所作的大量的工作。由于他们的努力使得很多复杂的问题变得简单。在本处我们可以发现在MFC中有一个叫做CImage List 的类对我们很有帮助。这个类用于有效地管理一系列的相似的位图或图标,它实现了WINDOWS的通用图像列表控制。我们应该在自己的应用程序的类中包含这个类的一个对象做为数据成员,再完成一些附加的工作就大功告成了。
我们所要使用的CImageList类的有关数据成员和成员函数的说明如下:
m_hImageList 是一个包含了与这个对象相关的图形列表的句柄create函数初始化一个图像链表并把它联接到CImageList类一个对象上它的第一个参数是包含了图标的位图资源ID值,第二个参数是指16×16点的位图,第三个参数使用默认值,第四个参数是颜色的RGB值。
具体的做法如下:
一、 把头文件和实现文件加入到你自己的项目中
二、 创建需要的位图资源(四个16×16像素点的图标)
三、 在主框架类的开头包含头文件
#include“myactive.h"
四、为主框架类加上如下数据成员
CMyactive m_active;//加入类对象UINT m_time;//设置时间
五、为主框架类的函数添加如下代码m-active.setimagelist(idb-anim-imglist,4,rgb(0,0,0));
上面函数的第一个参数是资源ID值,第二个是相似图像的数目,第三个参数设置颜色
m_time = this->settimer(99,500,null);
以上函数用于生成一个定时器
六、用ClassWizard为主框架类增加WM_DESTROY消息,增加ondestroy()成员函数,添加如下语句,回收系统资源。
CFrameWnd::OnDestroy();
if(m_time!= 0)
killtimer(m_time);
七、 用ClassWizard为主框架类增加WM_TIMER消息,添加成员函数,并加上如下代码,以实现动态图标m_active.shownextimage();
最后,编译、运行即可。
我们所定义的类的头文件和实现文件如下:
//myactive.h实现类的申明
#if !defined(AFX-MYACTIVE-H_-47E058AD-6F69-11D2-B59C-86DD54033006-INCLUD-ED-)
#define AFX- MYACTIVE-H-47E058AD-6F69-11D2-B59C-86DD54033006-INCLUDED-
class CMyactive
{
protected :
CImageList m_imgList;//构造对象
int m_Counter;//保存数据
int m_Images;
HICON hIcon;//图标句柄
HICON hPrevIcon ;
public:
CMyactive();
~CMyactive();
BOOL Set Image List(int IDResource,int number,COLORREF color);
BOOL ShowNextImage();
};
#endif//#define AFX-MYAC-TIVE-H-47E058AD-6F69-11D2-B59C-86DD54033006_-INCLUDED-
//实现文件
#include “stdafx.h"
#include “myactive.h"
CMyactive:: CMyactive ()//缺省构造函数
{
m_Counter = -1;
m_Images = -99;
m_imgList.m_hImageList = NULL;//初始化链表
}
CMyactive::~ CMyactive ()
{
if (hPrevIcon)
DestroyIcon(hPrevIcon);
//回收资源
}
BOOL CMyactive::SetImageList(int IDResource,int number,COLORREF color)
{
if(number<= 0)
return FALSE;
m-Images = number;
VERIFY(m-img List.Create(IDResource,16,1,color));
return TRUE;
}
BOOL CMyactive::ShowNextImage()//此函数将被反复调用,实现动态效果
{
if(m_imgList.m_hImageList == NULL)
return FALSE;
m_Counter++;
if(m_Counter >= m_Images)
m_Counter =0;
//从图像链表中创建图标
hIcon = m_imgList.ExtractIcon(m_Counter);
//向主窗口发送消息通知更新图标
HICON hPrevIcon = (HICON) AfxGetMainWnd()->SendMessage(WM_SETICON,TRUE,(LPARAM)hIcon);
//释放资源
if (hPrevIcon)
DestroyIcon(hPrevIcon);
return TRUE;
}(成都 飞扬 )