zoukankan      html  css  js  c++  java
  • 仿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就能弄出封装到类中的
    消息映射机制呢.这下卡就半个多月,没有师父就是这样,没人指点.
    签名:GreenLeaf1976
  • 相关阅读:
    第二月 day 2,内置函数
    第二月 day3 闭包,递归
    day4 装饰器
    第二月 day1生成器
    第一个月 总结
    day 16 迭代器
    day 15 编码
    Docker常用命令
    DRF源码刨析
    django中使用qiniu作为第三方存储
  • 原文地址:https://www.cnblogs.com/greenleaf1976/p/13688713.html
Copyright © 2011-2022 走看看