自定消息处理函数5步走:
1.自定义消息号。在windows中系统是通过消息号区别不同的消息,再进行相应的处理。为了相不与系统预定义消息相冲突,自定义消息号应大于一个值,WM_USER,即WM_USER是系统的消息的最大号,只需加上一个整数就可以作为定义消息号了:
#define WM_NEW_MSG WM_USER+1 //放在头文件里,如demoDlg.h
2.在类的声明中添加消息处理函数的声明 afx_msg void xxxx(WPARAM wParam,LPARAM lParam);
3.在类的实现文件中消息映射部分添加消息映射 ON_MESSAGE(WM_xxx, xxxx);
4.自己编写消息处理函数。
5.在要发送此消息的函数中调用函数
BOOL PostMessage(
HWND hWnd, // handle of destination window
UINT Msg, // message to post
WPARAM wParam, // first message parameter
LPARAM lParam // second message parameter
);
把消息送到消息队列中。
定时器使用方法
MFC里面的预定义的消息WM_TIMER,则只需启动和关闭定时器,并定义一个定时器处理函数
开启定时器 SetTimer(1,1000,NULL);//定时器号为1,每一秒钟产生一次(以毫秒为单位)
关闭定时器 KillTimer(1); //关闭ID的1的定时器
从"class wizard"里添加对wm_timer的响应函数,并区分不同的消息号即可。
UINT SetTimer(
HWND hWnd, // 接收定时器消息的窗口句柄
UINT nIDEvent, // 定时器的ID号
UINT uElapse, // 定时时间
TIMERPROC lpTimerFunc // 指向消息处理函数的指针
);
在mfc中,由于是在cwnd或其子类中调用的且cwnd类中也有SetTimer函数的封装,定在mfc里调用SetTimer时不用传递窗口句柄,也就是有另一种SetTimer形式:
UINT SetTimer( UINT nIDEvent, UINT nElapse, void(CALLBACKEXPORT* lpfnTimer)(HWND, UINT, UINT, DWORD) );
关闭定时器也就对应有两种形式:
BOOL KillTimer(
HWND hWnd, // handle of window that installed timer
UINT uIDEvent // timer identifier
);
BOOL KillTimer( int nIDEvent );