前面弄的是全局的仿消息映射,现在这是封装到类中的消息映射,一直弄不明白,现在也不太明白,就是今天在看
虚函数表的用法视频时有位老师用了个共有体转化全局函数为类成员函数,这就给我指了条明路,这不今晚又来弄,
来来回回错了无数,终于给过了,开心!
[QDialog.h]文件
#include <windows.h>
//定义消息函数的标识,没啥意思的,只为区分消息函数和普通函数的 #define Afx_MSG
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);
Afx_MSG BOOL OnDlgCommand(HWND dlgHwnd, UINT uMsg, WPARAM wParam, LPARAM lParam); Afx_MSG BOOL OnSysCommand(HWND dlgHwnd, UINT uMsg, WPARAM wParam, LPARAM lParam); Afx_MSG 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按钮弹出的对话框,