📄 untitled-23.txt
字号:
只要这个基础结构的位置合适,框架就可以调用GetMessageMap来获取一个指向CMainwin-
dow的messageMap结构的指针。然后它可以搜索.messageEntries数组来查看CMainwindow
是否具有此消息的处理程序。此外,如果需要,它还能够维持一个指向CFramewnd的mes-
sag6Map结构的指针并搜索基类的消息映射。
下面就是对当一个CMainwindow的消息抵达时所发生事件的相当详细的描述。要分派
此消息,框架调用了CMainwindow从CWnd继承下来的虚拟WindowProc函数。WindowProc
调用 OnwndMsg,而 OnwndMsg又调用 GetMessapeMap来获取一个指向 CMainwindow:: mes-
sageMap的指针,并搜索 CMainwindow::一messageEntries来获取一个其消息 ID与当前正等待
处理的消息的ID相匹配的条目。如果找到了该条目,对应的CMainwindow函数(其地址与
该消息ID一同存储在messageEntries数组中)就被调用。否则,onwndMsg参考CMainwin-
dow:: messageMap获得一个指向 CFramewnd:: messageMap的指针并为基类重复该过程。如果
基类没有该消息的处理程序,则框架将上升一个级别,参考基类的基类,相当系统地沿着继
承链向上走,直到它找到一个消息处理程序或者将该消息传递给Windows进行默认处理为
止。图回一5从CMainwindow的消息映射条目开始,用示意图阐明了CMainwindow的消息映
射,并表明了框架在搜索一个匹配特定消息ID的处理程序时所经过的路径。
MFC的消息映射机制的作用相当于,它是将消息连接到消息处理程序而不使用虚拟函
数的一种非常有效的方式。虚拟函数在空间上并不有效,因为它们需要虚表,而且即使虚表
中的函数没有被覆盖,虚表也会消耗内存。相反,消息映射所使用的内存的数量与它所包含
的条目的个数成比例。由于程序员要执行一个包含所有不同消息类型的处理程序的窗口类
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -