📄 untitled-22.txt
字号:
保持它们与应用程序的内部状态同步的“更新处理程序”。下面的几个章节将向您介绍这些
消息映射宏和其他的消息映射宏。
我们再回到Hello程序,CMainwindow的OnPaint函数和消息映射是在Hello.h中使用下
面的语句声明的:
afx.msg void onPalnt();
DECLARE.MESSAGEMAP()
afnmsg醒目地暗示,OnPaint是一个消息处理程序。如果您愿意,您可以将它省略,因为在
编译时它将简化为空白。术语afX.msg是用来表示一个其行为很像虚拟函数但却不需要虚
表项的函数。在类声明中, DECLARE.MESSAGE.MAP通常是最后的语句,因为它使用 C+十
关键字来指定其成员的可见度。您可以在DECIARE.MESSAGE_MAP后面插人声明其他类
成员的语句,但是如果这样做了,您还应当使用关键字public、protected或者private开头,以
确保您希望为这些成员设置的可见度。
1.3.6消息映射的工作方式
您可以通过检查AfXwin.h中的DECLARE.MESSAGE_MAP、BEGIN.MESSAGE_MAP和
END.MESSAGE.MAP宏以及 Wincore. cpp中的 CWnd:: WindowProc代码,来找到消息映射是
如何工作的。下面就是当您在代码中使用消息映射时其内部所进行的内容的纲要,以及框
架是如何使用由宏生成的代码和数据将消息转换为对对应类成员函数的调用的。
MFC的 DECLARE.MESSAGE.MAP宏在类声明中添加 3个成员:一个名为一messageEn-
tries的私有的 AFX— MSGMAP ENTRY结构数组,其中包含将消息与消息处理程序相关联的
信息;一个名为messageMap的静态AFX.MSGMAP结构,其中包含一个指向类中的_s.
s的非Entries数组的指针和一个指向基类中的—ss。geMap结构的指针;以及一个名为GeiMes-
SSggMaP的虚拟函数,该函数返回messageMaP的地址(对于一个动态而不是静态链接到MFC
的MFC应用程序,其宏执行稍微有些不同,但工作原理是相同的)。BEGIN_MESSAGE_MAP
包含GetMessageMap函数的实现,和用来初始化messopMap结构的代码。BEGIN.MES-
SAGE.MAP和END.MESSAGE.MAP之间出现的宏填人到messageEntries数组中,而END一
MESSAGE.MAP使用一个NULL条目标记了数组的结尾。对于下面的语句:
人In the class declaration
DECLARE.MESSAGE.MAP()
人In the class implementation
BEGINMESSAGE.MAP(CMa。Mindow,CFrF。ewfld)
ONWM-PAINT()
ENDNESSAGE.AsP()
编译器的预处理程序将生成下面的代码:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -