ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Dialog封装的消息映射(弄了好久终于弄过了,不是静态函数哦,和MFC一样,嘻嘻)

2020-09-18 02:33:41  阅读:252  来源: 互联网

标签:wParam lParam MFC 封装 HWND uMsg QDialog Dialog dlgHwnd


前面弄的是全局的仿消息映射,现在这是封装到类中的消息映射,一直弄不明白,现在也不太明白,就是今天在看
虚函数表的用法视频时有位老师用了个共有体转化全局函数为类成员函数,这就给我指了条明路,这不今晚又来弄,
来来回回错了无数,终于给过了,开心!

[QDialog.h]文件

#include <windows.h> class QDialog { public: QDialog(); ~QDialog(); INT_PTR ShowDialog(HWND _pHwnd); INT_PTR CALLBACK dlgProc(HWND, UINT, WPARAM, LPARAM); INT_PTR OnDlgClose(HWND dlgHwnd, UINT uMsg, WPARAM wParam, LPARAM lParam); BOOL OnDlgCommand(HWND dlgHwnd, UINT uMsg, WPARAM wParam, LPARAM lParam); BOOL OnSysCommand(HWND dlgHwnd, UINT uMsg, WPARAM wParam, LPARAM lParam); BOOL OnIDOK(HWND winHwnd, UINT uMsg, WPARAM wParam, LPARAM lParam); private: DWORD m_IDD; HWND m_hWind; };

[QDialog.cpp]文件

#include "QDialog.h" #include "resource.h" #include "QWinDlg.h"
//定义结构体 struct QMSG { UINT uCode;  //消息号码 BOOL (QDialog::*Fxn)(HWND, UINT, WPARAM, LPARAM);  //指针函数 };
//定义一个类的全局对象指针 QDialog *dlgApp; QDialog::QDialog() { m_IDD = IDD_DIALOG2; dlgApp = this; } QDialog::~QDialog() { dlgApp = NULL; } //消息映射数组,这就比较简洁了,没有宏了.这看得明白些 const QMSG dlgMsgs[] = { WM_SYSCOMMAND,&QDialog::OnSysCommand, WM_COMMAND,&QDialog::OnDlgCommand, IDC_QUIT_BTN,&QDialog::OnDlgClose, WM_CLOSE,&QDialog::OnDlgClose, IDOK,&QDialog::OnIDOK }; //计算数组大小 int msgCount = sizeof(dlgMsgs) / sizeof(QMSG); INT_PTR CALLBACK QdlgProc(HWND dlgHwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
//因窗口过程函数是全局的,所以这有一个过渡到类的窗口过程函数
dlgApp->dlgProc(dlgHwnd, uMsg, wParam, lParam); return 0; } //在别的地方调用类创建窗口 INT_PTR QDialog::ShowDialog(HWND _pHwnd) { return (INT_PTR)::DialogBox(GetModuleHandle(NULL), (LPCTSTR)m_IDD,_pHwnd, QdlgProc); }
//类的窗口过程函数,和全局的差不多,就是这指针函数前要加的类的对象指针,就这把人弄晕了好久,怎么都
转不过来,放了半个多月,才在今天看了一节虚函数表中寻地址中,那个老师就是这么弄的,
INT_PTR CALLBACK QDialog::dlgProc(HWND dlgHwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { m_hWind = dlgHwnd; for (int i=0;i<msgCount;i++) { if (uMsg == dlgMsgs[i].uCode) return (dlgApp->*dlgMsgs[i].Fxn)(dlgHwnd, uMsg, wParam, lParam); } return 1; }
//下面就是各个函数的实现 BOOL QDialog ::OnDlgClose(HWND dlgHwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { EndDialog(dlgHwnd, 0); return 1; } INT_PTR QDialog::OnDlgCommand(HWND dlgHwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
//这条件一定要记得是wParam,不是上面的uMsg了,我自己是复制的,也晕了半天,老是过不了.哈哈. for (int i = 0; i < msgCount; i++) { if (LOWORD(wParam) == dlgMsgs[i].uCode) return (dlgApp->*dlgMsgs[i].Fxn)(dlgHwnd, uMsg, wParam, lParam); } return 1; } BOOL QDialog::OnSysCommand(HWND dlgHwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { return 0; } BOOL QDialog::OnIDOK(HWND winHwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { QWinDlg dlg; dlg.ShowDialog(winHwnd); return 0; }

基本上就是这样了,可以在别的地方调用,这只是弄过了,还有好多还是不足,以后慢慢折腾吧.今天晚了,头也弄

晕了.睡觉了.

下面这图是点OK按钮弹出的对话框,

 

标签:wParam,lParam,MFC,封装,HWND,uMsg,QDialog,Dialog,dlgHwnd
来源: https://www.cnblogs.com/greenleaf1976/p/13688741.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有