MST

星途 面试题库

面试题:C++ 消息映射中消息的传递过程是怎样的

在 C++ 的消息映射机制里,请详细阐述从消息产生到最终被处理函数响应的整个传递过程。例如在 MFC 应用程序中,当用户点击一个按钮时,消息是如何从操作系统传递到对应的消息处理函数的?
47.3万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试
  1. 操作系统层面
    • 当用户点击按钮,操作系统检测到这个鼠标点击事件。操作系统会根据窗口句柄,将这个消息放入与该窗口相关联的消息队列中。这个消息包含了消息类型(如鼠标点击对应的WM_LBUTTONDOWN等)、鼠标坐标等信息。
  2. MFC 的消息循环
    • 在 MFC 应用程序中,WinMain函数中通常会有一个消息循环,类似这样的代码:
    while (GetMessage(&msg, NULL, 0, 0)) {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    
    • GetMessage函数从消息队列中取出消息。TranslateMessage函数会将一些键盘消息(如WM_KEYDOWN等)翻译成字符消息(如WM_CHAR)。DispatchMessage函数会根据消息的窗口句柄,将消息发送到对应的窗口过程函数。
  3. 窗口过程函数
    • 在 MFC 中,窗口过程函数通常是CWnd::WindowProc。这个函数会接收消息,并开始查找对应的消息处理函数。它首先会检查是否有消息映射表。
  4. 消息映射表查找
    • MFC 使用消息映射宏来定义消息与处理函数之间的关系。例如,在一个CButton类(它继承自CWnd)对应的类定义中,可能有类似这样的消息映射宏:
    BEGIN_MESSAGE_MAP(CButton, CWnd)
        ON_BN_CLICKED(IDC_BUTTON1, &CMyDlg::OnButton1Click)
    END_MESSAGE_MAP()
    
    • CWnd::WindowProc函数会根据消息的类型(如WM_COMMAND,按钮点击通常会产生WM_COMMAND消息,其中HIWORD(wParam)BN_CLICKED表示按钮被点击),在消息映射表中查找对应的处理函数。在上述例子中,会找到CMyDlg::OnButton1Click函数。
  5. 调用消息处理函数
    • 一旦找到对应的消息处理函数,WindowProc函数就会调用该处理函数,将消息的参数(如wParamlParam等)传递给它。这样,消息就最终被处理函数响应并处理,完成从操作系统消息产生到处理函数响应的整个传递过程。