📄 09.3.2 定时器的处理.txt
字号:
9.3.2 定时器的处理
接下来设置定时器。本例设置间隔 1000毫秒触发一次定时器消息,因此,在
CMainFrame类的 OnCreate函数中添加如例如9所示代码中加灰显示的那行代码。例 9-9
int CMainFrarne : :OnCreate(LPCREATESTRUCT lpCreateStruct)
{
// TODO : Delete these three lines if you don ' t want the toolbar t o
/ / be dockable
m_wndTool Bar . EnableDocking(CBRS_ALIGN_ANY) ;
EnableDocking(CBRS_ALIGN_ANY) ;
DockControlBar(&m_ wndToolBar) ;
SetClassLong(m_hWnd, GCL_H工 CON, (LONG)Loadlcon(NULL , IDI_ERROR)) ;
m_hlcons [0] =Loadlcon(AfxGet工 nstanceHandle(), MAKEINTRESOURCE(工 DI _ ICON1) )
m_hlcons[l]=Loadlcon(theApp .m_hlnstance , MAKEINTRESOURCE(IDI_ ICON2)) ;
m_hlcons [2]=Loadlcon(AfxGetApp()->m_ hlnst ance , MAKEINTRESOURCE(IDI_ ICON3));
SetTimer(1 , 1000 , NULL);
return 0 ;
然后,为 CMainFrame类添加定时器消息 (WM一TIMER )的响应函数,并在该响应函数中调用
SetClassLong函数改变应用程序窗口的图标。具体代码如例 9-10所示。
19IJ 9-10
void CMa inFrame : :OnTimer(UINT n工 DEvent)
// TODO : Add your rnessage handler code here and/or call default
static int i ndex =O ;
SetClassLong (m_hWnd , GCL_HICON , (LONG)m_hicons[index]) ;
index=++;
index < 3 ;
CFrarneWnd : :OnTimer(nIDEvent) ;
上述例如 10所示代码中,首先定义了一个国标索引变量 : index,并将其初始化为 0。然后调用
SetClassLong函数改变窗口的图标。本例是要循环显示三幅图标,因此 index这个索引值就需要在
0, 1和 2这三个值之间循环变化。并且因为程序每次发送定时器消息后,就会调用 OnTimer这个响
应函数,因此应该把 index变量定义为静态的。作为一个静态的局部变量,它将存放在程序的数据
区中,而不是在按中分配空间。当第一次调用 OnTimer函数时,系统会在数据区中为 index变量分
配空间,并根据它的定义将其初始化为 0。当以后再次调用 OnTimer函数时,因为 index变量的空
间已经存在了,程序将直接引用该地
址中己有的值。当然,本例也可以把 index变量定义为 CMainFrame类的成员变量。
E 小技巧:如果希望把某个数值始终限定在一个范围内,那么最好的办法当
然就是进行取模运算(% )。例如,如果希望某个变量的取值在 0-10之间变化,因为 0-10之间有 11
个数,所以就应该把这个变量对 11取模。实际上,取模运算就是取余。
另外,在上述如例弘 10所示代码中, SetClassLong函数的第三个参数需要一个 LONG型的值,而
m_hIcons[index]是 HICON类型,因此需要进行一个强制转换。 Build并运行 Sty]e程序,将会发现
程序初始启动时,显示的是应用程序原来的图标,然后就会动态地依次循环显示我们自定义的三幅
图标。
如果希望应用程序启动后不再显示原来的图标,而是直接显示我们自定义的图标,在上述例 9-10
所示 CMainPrame类的 OnCreate函数中,在加载图标之后,就应该调用 SetClassLong函数将应用程
序的图标设置为我们自定义的第一幅图标,结果如例 9-11所示。
例 9-11 .
int CMainFrarne : : OnCreate(LPCREATESTRUCT lpCreateStruct)
{
11 TODO : Delete these three lines if you don't want the toolbar to
11 be dockable
rn_wndToolBar . EnableDocking(CBRS_ALIGN_ANY) ;
EnableDocking(CBRS_AL工 GN一却~Y) ;
DockControlBar(&rn_ wndToolBar) ;
SetClassLong(ffi_ hWnd,GCL_HICON , (LONG) Loadlcon (NULL,工 DI_ERROR) ) ;
ffi_hlcons[O]=Loadlcon(AfxGetlnstanceHandle() , MAKEINTRESOURCE(IDI_ICONl)) ,
ffi_hlcons[l]=Load工 con(theApp . ffi_hlnstance, MAKEINTRESOURCE(IDI_ICON2)) ;
ffi_hlcons[2]=Loadlcon(AfxGetApp()->ffi_hlnstance , MAKEINTRESOURCE(IDI_ ICON3
) ) ., SetClassLong(m_hWnd, GCL_HICON , (LONG)ffi_ hlcons[O]); SetTimer(1 , 1000 , NULL) ;
return 0 ;
因为现在自定义图标数组中的第一幅图标已经被设置为窗口初始的图标了,在程序运行后应该接着
显示第二幅图标,所以在 OnTimer函数中,应该将 index变量的初始值修改为 1。之后,读者可以
再次运行一下 Style程序,看看程序现在的图标,将会发现程序一启动就显示了我们自定义的第一
幅图标,没有再显示原来的图标了,然后会依次循环显示自定义的三幅图标。
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -