当前位置:C++技术网 > 资讯 > 图标的更换及计时器的应用实现

图标的更换及计时器的应用实现

更新时间:2015-09-05 18:44:09浏览次数:1+次

    当我们创建工程之后,应用程序会自动给我们创建一个图标,但我们不用应用程序给我们的,我们使用用户自定义的图标。

首先,我们创建工程之后,在资源视图(resooource view)中找到Icon项,点击右键,我们手动添加三个图标,

然后我们在CMainFrame类的构造函数中新增并定义:

我们双击红色的部分,进入源文件,黑色的就是构造函数,我们在里边定义并初始化变量等,绿色的箭头就是我们新增的变量数组,我们用它来接收我们手动添加的三个图标,接下来我们添加代码:

m_hIcons[0]=LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDI_ICON1));
m_hIcons[1]=LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDI_ICON2));
m_hIcons[2]=LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDI_ICON3));


这是在OnCreate()中添加的,上图也能找到,因为我们是在创建了工程之后修改图标,因此,我们需要在OnCreate()中修改代码,LoadIcon(....),有两个参数,第一个就是窗口句柄,以前我们可以默认NULL,但现在我们是要修改代码,我们需要获得应用程序实例的句柄,因此我们调用AfxGetInstanceHandle()得到当前实例句柄,第二个参数是要图标的名称,因为我们只有图标的ID号,因此我们需要转换,就调用MAKEINTRESOURCE()来实现。相关我们可以查询MSDN。

    之所以自定义三个图标,我们就是要来实现三个图标轮流跳转,因此,我们需要设置一个计时器,来设置多久跳转一次。

    

UINT_PTR SetTimer( 
   UINT_PTR nIDEvent, 
   UINT nElapse, 
   void (CALLBACK* lpfnTimer 
)
     第一个参数我们可以随便写,就1好了,第二个就是我们实现跳转的时间间隔,我们设置1000,表示1秒,最后我们设为NULL。



	SetTimer(1,1000,NULL);
SetClassLong(m_hWnd,GCL_HICON,(LONG)m_hIcons[0]);
第二句代码就是我们实现修改图标的关键,



DWORD WINAPI SetClassLong(
  _In_ HWND hWnd,
  _In_ int  nIndex,
  _In_ LONG dwNewLong
);
    第一个参数我们使用CWnd类共有的窗口句柄M_hWnd,第二个是索引,我们修改的是图标,因此设置为GCL_HICON,具体的索引值我们可以查MSDN,http://www.cjjjs.com/paper/gzsh/20158313181160.aspx,我们也可以进C++技术网,在线查MSDN,网站已给。第三个就是我们自己新创建的图标了也就是第一个图标m_hIcons[0],但它是HION类型的,我们需要的是LONG类型,于是强制类型转换,在m_hIcons[0]前加(LONG),使它转化为LONG型。这句代码实现我们数组的第一个m_hIcons[0]表示的图标作为图标。  


 设置好了计时器,接下来我们为它进行消息响应,我们就不手动添加代码了,直接在CMainFrame上点击右键,选择第五个,就是add windows message handle,进去之后,如图我们选择:

我们在左边选择WM_TIMER,点击后,WM_TIMER就会在绿色箭头所指的地方出现,添加好了消息响应,应用程序就会为我们自动添加,如下代码:

    

void CMainFrame::OnTimer(UINT nIDEvent) 
{


	// TODO: Add your message handler code here and/or call default
	


	CFrameWnd::OnTimer(nIDEvent);
}
     这是我们进行消息响应后,应用程序自己为我们添加的。然后就是实现图标的变化,因此我们需要数组来实现变化,接下来我们加上剩下的两个图标,使得三个图标变化:



	static int index;
	index=rand()%3;
	SetClassLong(m_hWnd,GCL_HICON,(LONG)m_hIcons[index]);
在这里我们用了随机数来实现三种图标的转化,关于随机数,请看这篇文章:http://www.cjjjs.com/paper/bcyy/201582145250833.aspx,我们设置了一个变量index使它的值在0-2变化,进而实现三种图标的转化。我们用的是随机数,因此,图标出现的次序是未可定的。我们在变量index前加了关键字static,将它设为静态,相当于全局变量,使它随着程序的结束而销毁内存,如果是局部变量,也就是单单就是int index,它的生命周期就只会在程序代码执行到OnTimer()函数的右括号时,就会销毁内存,而后就不能用了,局部变量就是在总程序的块程序中有用,执行完就没用了,得重新定义。因此我们设为静态的。