面试题答案
一键面试1. C++消息映射基本概念
消息映射是一种机制,用于将Windows消息与类的成员函数相关联。在MFC(Microsoft Foundation Classes)中广泛应用,通过这种机制,当窗口接收到特定消息时,能够自动调用对应的消息处理函数。它使得代码结构更清晰,便于管理不同类型的消息响应逻辑。
2. 示例代码
以下是一个简单示例,展示在自定义类中初步实现消息映射机制,这里以处理WM_PAINT消息为例:
#include <windows.h>
#include <iostream>
// 自定义窗口类
class MyWindow {
public:
MyWindow() {}
~MyWindow() {}
// 注册窗口类
BOOL RegisterClass() {
WNDCLASS wc = {};
wc.lpfnWndProc = StaticWndProc;
wc.hInstance = GetModuleHandle(nullptr);
wc.lpszClassName = L"MyWindowClass";
return RegisterClass(&wc);
}
// 创建窗口
HWND Create(LPCTSTR title, int x, int y, int width, int height) {
return CreateWindow(
L"MyWindowClass",
title,
WS_OVERLAPPEDWINDOW,
x, y, width, height,
nullptr, nullptr, GetModuleHandle(nullptr), this
);
}
// 消息循环
void MessageLoop() {
MSG msg = {};
while (GetMessage(&msg, nullptr, 0, 0)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
// 窗口过程函数
static LRESULT CALLBACK StaticWndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) {
MyWindow* pThis = nullptr;
if (msg == WM_NCCREATE) {
CREATESTRUCT* cs = (CREATESTRUCT*)lParam;
pThis = (MyWindow*)cs->lpCreateParams;
SetWindowLongPtr(hwnd, GWLP_USERDATA, (LONG_PTR)pThis);
}
else {
pThis = (MyWindow*)GetWindowLongPtr(hwnd, GWLP_USERDATA);
}
if (pThis) {
return pThis->WndProc(hwnd, msg, wParam, lParam);
}
return DefWindowProc(hwnd, msg, wParam, lParam);
}
// 实际的窗口过程函数,处理消息
LRESULT WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) {
switch (msg) {
case WM_PAINT: {
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hwnd, &ps);
TextOut(hdc, 10, 10, L"Hello, Message Map!", 16);
EndPaint(hwnd, &ps);
return 0;
}
case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hwnd, msg, wParam, lParam);
}
};
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) {
MyWindow myWindow;
myWindow.RegisterClass();
HWND hwnd = myWindow.Create(L"Message Map Example", CW_USEDEFAULT, CW_USEDEFAULT, 300, 200);
ShowWindow(hwnd, iCmdShow);
myWindow.MessageLoop();
return 0;
}
上述代码中,MyWindow
类封装了窗口相关操作,通过RegisterClass
注册窗口类,Create
创建窗口,MessageLoop
处理消息循环。在WndProc
函数中,使用switch - case
结构来处理不同的消息,这里处理了WM_PAINT
消息用于在窗口客户区绘制文本,以及WM_DESTROY
消息用于退出程序。StaticWndProc
是一个静态函数,用于在窗口创建时设置窗口的GWLP_USERDATA
,以便在后续消息处理中获取MyWindow
对象指针,调用实际的WndProc
处理消息。