仿MFC的消息印射(全局函数的实现)

//弄了个仿MFC消息映射,这是全局函数都好弄,照着MFC就弄出来了,
//在vs2017上可以通过

#include <windows.h> #include "resource.h" #include "QDialog.h" #include "QWinDlg.h"
//全局实例句柄 HINSTANCE g_hInstance; //函数的前导声明 LRESULT OnInitDialog(HWND winHwnd, UINT uMsg, WPARAM wParam, LPARAM lParam); LRESULT OnPaintMain(HWND winHwnd, UINT uMsg, WPARAM wParam, LPARAM lParam); LRESULT OnClose(HWND winHwnd, UINT uMsg, WPARAM wParam, LPARAM lParam); LRESULT OnDestroy(HWND winHwnd, UINT uMsg, WPARAM wParam, LPARAM lParam); LRESULT OnCommand(HWND winHwnd, UINT uMsg, WPARAM wParam, LPARAM lParam); LRESULT OnIDOK(HWND winHwnd, UINT uMsg, WPARAM wParam, LPARAM lParam); LRESULT OnCancel(HWND winHwnd, UINT uMsg, WPARAM wParam, LPARAM lParam); //定义的函数指针的结构体
struct decodeUINT { UINT uCode;  //消息号码 LRESULT(*Fxn)(HWND, UINT, WPARAM, LPARAM);  //函数指针还是指针函数,有点晕这会 }; //消息映射宏,抄MFC的 #define MAIN_BEGIN_MSG() const struct decodeUINT MainWndMessage[] = { #define MAIN_END_MSG }; //消息映射数组 MAIN_BEGIN_MSG() WM_INITDIALOG,OnInitDialog, WM_PAINT,OnPaintMain, WM_CLOSE,OnClose, WM_DESTROY,OnDestroy, WM_COMMAND,OnCommand, IDWINOK,OnIDOK, IDC_ADD_BTN,OnCancel, MAIN_END_MSG
//计算消息数组的个数
#define MAIN_MSG_COUNT sizeof(MainWndMessage) / sizeof(decodeUINT) //过程函数的声明 INT_PTR CALLBACK WinProc(HWND winHwnd, UINT uMsg, WPARAM wParam, LPARAM lParam); //主函数 int WINAPI WinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPSTR lpCmdLine, _In_ int nShowCmd) { g_hInstance = hInstance; HWND hWnd = ::CreateDialog(hInstance, (LPCTSTR)IDD_DIALOG1, NULL, WinProc); if (hWnd == NULL) return 0; ShowWindow(hWnd, SW_SHOW); UpdateWindow(hWnd); MSG msg; while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return 0; }
//过程函数的实现 INT_PTR CALLBACK WinProc(HWND winHwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { //循环查找消息数组中的消息,有就返回执行找到的消息对应的函数
for (int i = 0;i< MAIN_MSG_COUNT;i++) { if (uMsg == MainWndMessage[i].uCode) return (*MainWndMessage[i].Fxn)(winHwnd, uMsg, wParam, lParam); }
//没有找到就返回默认的消息处理函数
return DefWindowProc(winHwnd, uMsg, wParam, lParam); }
//下面就是各个函数的实现 LRESULT OnInitDialog(HWND winHwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
return 0; } LRESULT OnPaintMain(HWND winHwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { return 0; } LRESULT OnClose(HWND winHwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { DestroyWindow(winHwnd); return 1; } LRESULT OnDestroy(HWND winHwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { PostQuitMessage(0); return 0; } LRESULT OnCommand(HWND winHwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { for (int i = 0; i < MAIN_MSG_COUNT; i++) { //这和上面的循环查找一样,只是条件改为wParam, if (LOWORD(wParam) == MainWndMessage[i].uCode) { return (*MainWndMessage[i].Fxn)(winHwnd, uMsg, wParam, lParam); } } return 1; } LRESULT OnIDOK(HWND winHwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { QWinDlg dlg; dlg.ShowDialog(winHwnd); return 0; } LRESULT OnCancel(HWND winHwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { return 0; } //这是全局函数都还好说,我想弄成MFC一样的在类中封装成这样的消息映射,就卡壳了,在网上查了许多,
都全是用静态函数来实现的,我在想静态其实也就是全局函数嘛,和这没有多大区别,为啥MFC就能弄出封装到类中的
消息映射机制呢.这下卡就半个多月,没有师父就是这样,没人指点.

 

posted @ 2020-09-18 01:22  初吻给了烟灬  阅读(196)  评论(0编辑  收藏  举报