MST
星途 面试题库

面试题:C++消息映射:简述与简单应用

简述C++消息映射的基本概念,并给出一个简单示例代码,展示如何在一个自定义类中初步实现消息映射机制,处理简单的消息响应。
39.0万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试

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处理消息。