您的位置:首页 > 汽车 > 新车 > 惠州网站外包_个人博客是什么_房地产估价师考试_磁力宅在线搜种子

惠州网站外包_个人博客是什么_房地产估价师考试_磁力宅在线搜种子

2024/12/27 11:42:16 来源:https://blog.csdn.net/doubleintfloat/article/details/144305175  浏览:    关键词:惠州网站外包_个人博客是什么_房地产估价师考试_磁力宅在线搜种子
惠州网站外包_个人博客是什么_房地产估价师考试_磁力宅在线搜种子

在纯 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来存储消息和对应的消息处理函数指针。
下面是一个简单的使用结构体数组模拟消息映射的示例:

#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;
}

非阻塞代码

#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;
}

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com