非MFC工程实现消息映射

在纯 C++ 工程中不能直接使用 MFC 风格的BEGIN_MESSAGE_MAP消息映射

BEGIN_MESSAGE_MAP是 MFC(Microsoft Foundation Classes)中的宏,它是基于 MFC 框架的一种消息映射机制。MFC 是一个 C++ 类库,它对 Windows API 进行了封装,提供了面向对象的编程接口。MFC 中的消息映射机制依赖于 MFC 的框架结构,包括CWnd类、CCmdTarget类等一系列类的层次结构以及它们的内部实现。

纯 C++ 工程没有包含 MFC 的这些类和框架支持,所以编译器无法识别BEGIN_MESSAGE_MAP这些 MFC 特有的宏。
模拟消息映射机制

虽然不能直接使用 MFC 的消息映射,但可以在纯 C++ 工程中模拟类似的机制。

例如,可以使用一个结构体数组或者std::map来存储消息和对应的消息处理函数指针。

下面是一个简单的使用结构体数组模拟消息映射的示例:

cpp 复制代码
#include <iostream>
#include <windows.h>
#include <map>

// 定义消息处理函数类型
typedef LRESULT(CALLBACK* MessageHandler)(HWND, UINT, WPARAM, LPARAM);

// 全局消息映射表(使用std::map)
std::map<UINT, MessageHandler> messageMap;

// 示例消息处理函数
LRESULT CALLBACK MyMessageHandler(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) {
    std::cout << "Received message: " << message << std::endl;
    return 0;
}

// 自定义的消息处理函数,用于查找并调用对应的消息处理函数
LRESULT CALLBACK ProcessMessages(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) {
    auto it = messageMap.find(message);
    if (it != messageMap.end()) {
        return it->second(hWnd, message, wParam, lParam);
    }
    return DefWindowProc(hWnd, message, wParam, lParam);
}

int main() {
    // 注册消息和处理函数
    messageMap[WM_USER + 1] = MyMessageHandler;

    // 假设这里有窗口句柄hWnd和消息message等参数,调用ProcessMessages进行消息处理
    HWND hWnd = nullptr;
    UINT message = WM_USER + 1;
    WPARAM wParam = 0;
    LPARAM lParam = 0;
    ProcessMessages(hWnd, message, wParam, lParam);

    return 0;
}

非阻塞代码

cpp 复制代码
#include <iostream>
#include <windows.h>
#include <thread>
#include <vector>
#include <map>

// 定义消息处理函数类型
typedef LRESULT(CALLBACK* MessageHandler)(HWND, UINT, WPARAM, LPARAM);

// 全局消息映射表(使用std::map)
std::map<UINT, MessageHandler> messageMap;

// 示例消息处理函数
LRESULT CALLBACK MyMessageHandler(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) {
    std::cout << "Received message: " << message << std::endl;
    return 0;
}

// 消息分发线程函数,用于非阻塞地处理消息
void messageDispatchThread(HWND hWnd) {
    MSG msg;
    while (true) {
        if (PeekMessage(&msg, hWnd, 0, 0, PM_REMOVE)) {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
        else {
            // 当消息队列为空时,可以在这里添加其他非阻塞的操作,比如定时检查等
            // 这里简单休眠一小段时间,避免空转消耗过多CPU资源
            std::this_thread::sleep_for(std::chrono::milliseconds(10));
        }
    }
}

// 自定义的消息处理函数,用于查找并调用对应的消息处理函数
LRESULT CALLBACK ProcessMessages(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) {
    auto it = messageMap.find(message);
    if (it!= messageMap.end()) {
        return it->second(hWnd, message, wParam, lParam);
    }
    return DefWindowProc(hWnd, message, wParam, lParam);
}

int main() {
    // 注册消息和处理函数
    messageMap[WM_USER + 1] = MyMessageHandler;

    // 创建一个窗口示例(这里简单创建一个隐藏窗口用于演示,实际可根据需求替换)
    const char* className = "MyWindowClass";
    WNDCLASS wc = {};
    wc.lpfnWndProc = ProcessMessages;
    wc.hInstance = GetModuleHandle(NULL);
    wc.lpszClassName = className;
    if (!RegisterClass(&wc)) {
        std::cerr << "窗口类注册失败: " << GetLastError() << std::endl;
        return 1;
    }
    HWND hWnd = CreateWindow(className, "", WS_OVERLAPPEDWINDOW,
        CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
        NULL, NULL, GetModuleHandle(NULL), NULL);
    if (hWnd == NULL) {
        std::cerr << "窗口创建失败: " << GetLastError() << std::endl;
        return 1;
    }
    ShowWindow(hWnd, SW_HIDE);

    // 创建消息分发线程,在该线程中进行非阻塞的消息处理
    std::thread dispatchThread(messageDispatchThread, hWnd);
    dispatchThread.detach();

    // 主线程可以继续执行其他任务,这里简单模拟主线程有其他操作,比如每隔一段时间输出一些信息
    for (int i = 0; i < 10; ++i) {
        std::cout << "主线程正在执行其他任务,当前计数: " << i << std::endl;
        std::this_thread::sleep_for(std::chrono::seconds(1));
    }

    return 0;
}
相关推荐
2301_789015621 小时前
Linux基础指令(一)
linux·运维·服务器·c语言·开发语言·c++·linux指令
tankeven2 小时前
C++ 继承完全指南
c++
tankeven2 小时前
动态规划专题(11):区间动态规划之三角剖分问题
c++·算法·动态规划
zhangrelay2 小时前
三分钟云课实践速通--C/C++程序设计--
linux·c语言·c++·笔记·学习·ubuntu
小此方2 小时前
Re:从零开始的 C++ STL篇(十二)深度解析哈希函数设计、负载因子调节与两种冲突处理策略
c++·算法·哈希算法
Karle_2 小时前
为AI编辑器准备c++编译环境,onnxruntime、cmake、cl,网上坑太多备份记录后续方便使用。
开发语言·c++·编辑器
lcj25112 小时前
【数据结构精讲】堆与二叉树从底层原理到代码落地:堆的构建 / 调整 / 排序 + 二叉树遍历 / 操作(附完整 C++ 源码 + LeetCode 题解)
数据结构·c++·leetcode
努力努力再努力wz2 小时前
【MySQL 进阶系列】C/C++ 如何通过客户端库访问 MySQL?从连接原理到 API 调用流程详解(附完整demo代码)
服务器·c语言·数据结构·数据库·c++·b树·mysql
CSCN新手听安3 小时前
【Qt】Qt窗口(七)QColorDialog颜色对话框,QFileDialog文件对话框的使用
开发语言·c++·qt
A charmer3 小时前
从 C++ 到 Objective-C:零基础平滑转学专栏【总目录】
开发语言·c++·objective-c