MFC的记忆--图片版本

这是以前看侯捷书的读书笔记,把最重要的章节给截取的,方便以后回忆

MFC 把訊息分為㆔大類:

命令讯息(WM_COMMAND):命令讯息意味着「用户命令程序做某些动作」。

凡由 UI 对象产生的讯息都是这种命令讯息,可能来自选单或加速键或工具栏

深入 MFC 程序设计

按钮,并且都以 WM_COMMAND 呈现。如何分辨来自各处的命令讯息?SDK

程序主要靠讯息的 wParam 辨识之,MFC 程序则主要靠选单项目的标识符

menu ID)辨识之 -- 两者其实是相同的。

什么样的类别有资格接受命令讯息?凡衍生自CCmdTarget 之类别,皆有资格。从

command target 的字面意义可知,这是命令讯息的目的。也就是说,凡衍生自

CCmdTarget 者,它的骨子里就有了种特殊的机制。把整张 MFC 类别阶层图摊开

来看,几乎建构应用程序的最重要的几个类别都衍生自 CCmdTarget,剩的不能接

收讯息的,是像 CFileCArchiveCPointCDao(数据库)、Collection Classes(纯

粹数据处理)、GDI 等等「非主流」类别。

标准讯息 - WM_COMMAND 之外,任何以WM_ 开头的都算是这类。任何

衍生自CWnd 之类别,均可接收此讯息。

66:小结前者与窗口不直接相关,后者直接相关。前者区分考id,后者区分直接依靠宏。

66:wm_ create close destroy (想起后添加的窗口,终止方法by zcq), 左右键(单击否),滑鼠。

Control Notification - 这种讯息由控制组件产生,为的是向其父窗口(通常是对

话盒)通知某种情况。例如当你在 ListBox 选择其㆗㆒个项目,ListBox

会产生 LBN_SELCHANGE 传送给父窗口。这类讯息也是以 WM_COMMAND 形式呈现

万流归宗 Command TargetCCmdTarget

你可以在程序的许多类别之设计拦路虎(我是指「讯息映像表格」),接收并处理讯

息。只要是 CWnd 衍生类别,就可以拦任何 Windows 讯息。与窗口无关的MFC

别(例如 CDocument CWinApp)如果也想处理讯息,必须衍生自 CCmdTarget,并

且只可能收到 WM_COMMAND 命令讯息。

会产生命令讯息的,不外就是 UI 对象:选单项目和工具栏按钮都是。命令讯息必须有

个对应的处理函式,把讯息和其处理函式「绑」在块儿,这动作称为 Command

Binding,这个动作将由堆宏完成。通常我们不直接手工完成这些宏内容,也就是

说我们并不以文本编辑器撰写相关的码,而是藉助于ClassWizard

Command Target 对象如何知道它可以处理某个讯息?答案是它会看看自己的讯息映

射表。讯息映像表使得讯息和函式的对映关系形成份表格,进而全体形成张网,当

Command Target 对象收到某个讯息,便可由表格得知其处理函式的名称。

clip_image002

clip_image004

clip_image006

clip_image008clip_image010

clip_image012

1. MDI 主窗口( CMDIFrameWnd 收到命令讯息WM_COMMAND ID

ID_EDIT_CLEAR_ALL

2. MDI 主窗口把命令讯息交给目前作用 MDI 子窗口(CMDIChildWnd)。

3. MDI 子窗口给它自己的子窗口(也就是 View个机会。

4. View 检查自己的 Message Map

5. View 发现没有任何处理程序可以处理此命令讯息,只好把它传给 Document

6. Document 检查自己的 Message Map,它发现了个吻合项:

BEGIN_MESSAGE_MAP(CScribbleDoc, CDocument)

ON_COMMAND(ID_EDIT_CLEAR_ALL, OnEditClearAll)

...

END_MESSAGE_MAP()

于是呼叫该函式,命令讯息的流动路线也告终止。

如果述的步骤6 仍没有找到处理函式,那么就:

7. Document 把这个命令讯息再送到 Document Template 对象去。

8. 还是没被处理,于是命令讯息回到 View

9. View 没有处理,于是又回给 MDI 子窗口本身。

10. 传给 CWinApp 对象 -- 无主讯息的终极归属。

小结:截图,没有粘贴最难的hook mfc 消息的产生关系,当前就把 9-5理清楚就是啦

原文地址:https://www.cnblogs.com/titer1/p/2971968.html