SDK的消息实现机制:
1)Windows的消息和线程是相对应的,即windows会把消息发送给和消息相对应的线程。
2)在SDK模式下,程序是通过GetMessage函数从某个线程相对应的消息队列中取出来并放到MDG里面
3)TranslateMessage函数把消息翻译成字符消息并放到响应的消息队列中,最后DispachMessage函数把消息分发到相关的窗口过程。窗口过程根据消息类型对不通消息进行处理
MFC的消息实现机制:上实例(trafficlight)
BEGIN_MESSAGE_MAP(CInheritClass, CBaseClass)
ON_COMMAND(ID_FILE_PRINT, &CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_DIRECT,
&CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_PREVIEW,
&CView::OnFilePrintPreview)
ON_WM_TIMER()
ON_COMMAND(ID_START, &CthirdView::OnStart)
ON_COMMAND(ID_STOP, &CthirdView::OnStop)
END_MESSAGE_MAP()
函数AfxWndProc接收Windows操作系统发送的消息。
函数AfxWndProc调用函数AfxCallWndProc进行消息处理,这里是把对句柄的操作转换成对CWnd对象的操作。
函数AfxCallWndProc调用CWnd类的函数WindowProc进行消息处理。注意AfxWndProc和AfxCallWndProc都是AFX的API函数。而WindowProc已经是CWnd的一个方法。所以可以注意到在WindowProc中已经没有关于句柄或者是CWnd的参数了。WindowProc调用方法OnWndMsg进行正式的消息处理,即把消息派送到相关的方法中去处理。
常用消息:
WM_COMMAND(0x0111 )选择窗口菜单项或某个控件发送一条消息给它的父窗口或按下一个快捷键时产生此消息;
WM_TIMER(0x0113 )发生了定时器事件;
WM_LBUTTONDOWN(0x0201)按下鼠标左键;
WM_LBUTTONDBLCLK(0x0203)双击鼠标左键;
WM_RBUTTONDOWN(0x0204)按下鼠标右键;
WM_RBUTTONDBLCLK(0x0206)双击鼠标右键;
WM_MBUTTONDOWN(0x0207)按下鼠标中键;