在WINDOWS程序中消息的处理是通过一个消息队列来管理的,但在实际的MFC编程的时候,我们要对程序进行一个消息响应的时候并不清楚ClassWizard具体为程序添加了什么,只看到了一个消息处理函数的实现接口.具体ClassWizard做了什么工作呢?
现在以一个例子说明一下MFC消息映射的原理.新建一个MFC工程,取名为Test,选择单文档就行.
打开ClassWizard,为类CTestView增加一个响应鼠标左键按下的消息.除了消息响应的实现处,我们发现以下2个地方加入了代码:
- 在类CTestView的头文件TestView.h中:
1 2 3 4 5 |
<span style="color: #666666;">//{{AFX_MSG(CTestView)</span> afx_msg <span style="color: #0000ff;">void</span> OnLButtonDown<span style="color: #008000;">(</span>UINT nFlags,CPoint point<span style="color: #008000;">)</span><span style="color: #008080;">;</span><span style="color: #666666;">//这里为增加内容.声明消息响应的函数原型.</span> <span style="color: #666666;">//}}AFX_MSG</span> |
- 在源文件TestView.cpp中:
1 2 3 4 5 6 7 8 9 10 |
BEGIN_MESSAGE_MAP<span style="color: #008000;">(</span>CTestView, CView<span style="color: #008000;">)</span> <span style="color: #666666;">//{{AFX_MSG_MAP(CTestView)</span> ON_WM_LBUTTONDOWN<span style="color: #008000;">(</span><span style="color: #008000;">)</span> <span style="color: #666666;">//新增加部分,用于关联OnLButtonDown和WM_LBUTTONDOWN</span> <span style="color: #666666;">//}}AFX_MSG_MAP</span> <span style="color: #666666;">// Standard printing commands</span> ON_COMMAND<span style="color: #008000;">(</span>ID_FILE_PRINT, CView<span style="color: #008080;">::</span><span style="color: #007788;">OnFilePrint</span><span style="color: #008000;">)</span> ON_COMMAND<span style="color: #008000;">(</span>ID_FILE_PRINT_DIRECT, CView<span style="color: #008080;">::</span><span style="color: #007788;">OnFilePrint</span><span style="color: #008000;">)</span> ON_COMMAND<span style="color: #008000;">(</span>ID_FILE_PRINT_PREVIEW, CView<span style="color: #008080;">::</span><span style="color: #007788;">OnFilePrintPreview</span><span style="color: #008000;">)</span> END_MESSAGE_MAP<span style="color: #008000;">(</span><span style="color: #008000;">)</span> |
在程序运行时消息的具体实现过程是这样的:
MFC维护了一个句柄与C++指针类的映射。通过句柄可以找到对应的类指针,把这个指针交给基类,调用函数WindowProc,再由函数WindowProc调用函数OnWndMsg,通过查找头文件里响应函数原型的声明和源文件的消息映射,进行消息处理.
转载请注明:爱开源 » VC++复习笔记3-MFC消息映射机制