通俗的理解MFC消息机制


1. 消息是什么?

想象你家的门铃响了(比如有人按门铃、敲门、或者有快递),这些都是"消息"。
在 MFC 中 ,消息就是系统或用户触发的各种事件,比如鼠标点击(WM_LBUTTONDOWN)、键盘输入(WM_KEYDOWN)、窗口关闭(WM_CLOSE)等。


2. MFC 的消息机制如何工作?

整个过程分三步走,类似"快递收发站":

(1) 消息循环(快递分拣中心)
  • MFC 程序启动后 ,会运行一个"消息循环"(藏在 CWinApp 类里),像快递分拣中心一样,不断检查有没有新消息(比如鼠标点击、键盘输入)。
  • 当有消息时 ,分拣中心会把消息"打包"(封装成 MSG 结构),然后投递给对应的"收件窗口"。
(2) 窗口过程(快递员派送)
  • 每个窗口(比如按钮、对话框)都有一个"默认快递员"------窗口过程(WindowProc,负责接收消息。
  • 在 MFC 中 ,这个快递员已经被框架封装好了(比如 CWnd 类),它会根据消息类型,决定是"自己处理"还是"转交给其他快递员"。
(3) 消息映射(收件人处理包裹)
  • 关键点:MFC 用"消息映射表"(Message Map)把消息和对应的处理函数绑定。

  • 比如 :当收到"鼠标左键点击"消息(WM_LBUTTONDOWN),MFC 会查表找到你写的 OnLButtonDown 函数来处理。

  • 代码示例

    cpp 复制代码
    BEGIN_MESSAGE_MAP(MyWindow, CWnd)
      ON_WM_LBUTTONDOWN()  // 绑定消息和函数
    END_MESSAGE_MAP()
    
    void MyWindow::OnLButtonDown(UINT flags, CPoint point) {
      // 处理鼠标点击的逻辑,比如弹个对话框
      MessageBox(_T("你点击了鼠标!"));
    }

3. 为什么要用消息机制?

  • 解耦:就像快递系统把"发件人"和"收件人"分开,消息机制让"事件触发"和"事件处理"解耦。
  • 灵活性:你可以自由决定哪些消息需要处理(比如只关心按钮点击,不关心键盘输入)。
  • 效率:系统不会因为某个窗口"忙"而卡死,消息会被排队处理。

4. 实际场景举例

假设你做了一个按钮,点击后关闭窗口:

  1. 用户点击按钮 → 触发 WM_LBUTTONDOWN 消息。
  2. MFC 的消息循环将消息分发给按钮对应的窗口。
  3. 按钮的窗口过程通过消息映射找到你写的 OnClick 函数。
  4. 你在 OnClick 中调用 DestroyWindow() 关闭窗口。

5. 总结:MFC 消息机制的核心

  • 消息循环:不断"收快递"。
  • 窗口过程:默认的"快递分拣员"。
  • 消息映射:告诉系统"哪个快递(消息)由谁签收(处理函数)"。

就像生活中的快递系统,MFC 的消息机制让程序能高效、有序地响应各种事件!🚚

相关推荐
玖玥拾3 小时前
C/C++ 数据结构(七)栈、容器适配器
c语言·数据结构·c++··容器适配器
один but you4 小时前
constexpr函数
c++
凡人叶枫5 小时前
Effective C++ 条款41:了解隐式接口和编译期多态
java·开发语言·c++·effective c++
凡人叶枫5 小时前
Effective C++ 条款42:了解 typename 的双重意义
java·linux·服务器·c++
小胖xiaopangss5 小时前
BRpc使用
c++·rpc
-森屿安年-6 小时前
63. 不同路径 II
c++·算法·动态规划
chase_my_dream6 小时前
Cartographer详细讲解
c++·人工智能·自动驾驶
森G6 小时前
75、服务器源码解析---------云视频服务项目
linux·服务器·网络·c++·qt
碧海蓝天20226 小时前
C++法则24:在标准 C++ 中,没有任何可移植的方式判断指针 T* pt 指向的内存位置是否已经 构造了对象,程序员必须手动跟踪哪些元素已构造。
java·开发语言·c++
charlie1145141916 小时前
现代C++指南:Lambda,让我们用另一种方式持有函数
开发语言·c++