面试题答案
一键面试- 操作系统层面:
- 当用户点击按钮,操作系统检测到这个鼠标点击事件。操作系统会根据窗口句柄,将这个消息放入与该窗口相关联的消息队列中。这个消息包含了消息类型(如鼠标点击对应的
WM_LBUTTONDOWN
等)、鼠标坐标等信息。
- 当用户点击按钮,操作系统检测到这个鼠标点击事件。操作系统会根据窗口句柄,将这个消息放入与该窗口相关联的消息队列中。这个消息包含了消息类型(如鼠标点击对应的
- MFC 的消息循环:
- 在 MFC 应用程序中,
WinMain
函数中通常会有一个消息循环,类似这样的代码:
while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); }
GetMessage
函数从消息队列中取出消息。TranslateMessage
函数会将一些键盘消息(如WM_KEYDOWN
等)翻译成字符消息(如WM_CHAR
)。DispatchMessage
函数会根据消息的窗口句柄,将消息发送到对应的窗口过程函数。
- 在 MFC 应用程序中,
- 窗口过程函数:
- 在 MFC 中,窗口过程函数通常是
CWnd::WindowProc
。这个函数会接收消息,并开始查找对应的消息处理函数。它首先会检查是否有消息映射表。
- 在 MFC 中,窗口过程函数通常是
- 消息映射表查找:
- 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
函数。
- MFC 使用消息映射宏来定义消息与处理函数之间的关系。例如,在一个
- 调用消息处理函数:
- 一旦找到对应的消息处理函数,
WindowProc
函数就会调用该处理函数,将消息的参数(如wParam
和lParam
等)传递给它。这样,消息就最终被处理函数响应并处理,完成从操作系统消息产生到处理函数响应的整个传递过程。
- 一旦找到对应的消息处理函数,