9.3动态加载Icon
如果要设置窗口的Icon为系统提供的格式,可以通过SetClassLong来实现,如果要动态的加载一个自定义的Icon,首先需要在Frame类的头文件中创建一个HICON类型的变量。
HICON m_icon;可以同时加载多个文件,则需要创建的HICON数组HICON m_iconl[],
然后调用LoadIcon函数。
1 hicon[0]=LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDI_ICON1));
2 hicon[1]=LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDI_ICON2));
书中给出了三种加载icon文件的方法,选择一个自己看着顺眼的方式。加载Icon文件之后,设置窗口的icon:
1 SetClassLong(m_hWnd,GCL_HICON,(LONG)hicon[0]);
9.4设置定时器
SetTimer函数属于标准消息,在Frame类上右键,可以看到所有的标准消息。
1 void CMainFrame::OnTimer(UINT nIDEvent)
2 {
3 // TODO: Add your message handler code here and/or call default
4 static int index=0;
5 index=++index%4;
6 CFrameWnd::OnTimer(nIDEvent);
7 }
这里有2个概念,一是创建一个静态变量的时候,在内存区域的全局对象与静态变量区域分派内存,只会创建一次。二是如果要在一个循环中将值限定在一个范围之内,可以将循环值和这个值取模。
创建一个定时器之后,需要在OnCreate函数中添加定时器的响应。在MSDN中可以看到SetTimer函数的说明:
1 UINT SetTimer( UINT nIDEvent, UINT nElapse, void (CALLBACK EXPORT* lpfnTimer)(HWND, UINT, UINT, DWORD) );
SetTimer函数的返回值也即是函数的编号(第一个参数),第二个参数为定时器的响应时间,以毫秒为单位,第三个参数通常设置为NULL,具体为什么,没看懂。
1 SetTimer(1,1000,NULL);