自己简单封装的一个CDialog类实例
本文实例讲述了自己简单封装的一个CDialog类实例。分享给大家供大家参考。具体如下:
该代码比较短小,实现了消息映射。
Dialog.h头文件如下:
#include<windows.h> classCDialog { public: //一条消息所包含的信息 structMAP { UINTMsg; bool(*pf)(HWNDhwndDlg,UINTuMsg,WPARAMwParam,LPARAMlParam); intlen; MAP*pNext; }; public: WORDm_wRes;//Dialog资源的ID //头、尾指针,用来操作消息列表 staticMAP*m_pHead; MAP*m_pEnd; public: boolShow(HINSTANCE,HWND); voidAddMsg(bool(*fp)(HWNDhwndDlg,UINTuMsg,WPARAMwParam,LPARAMlParam),UINT); staticboolOnClose(HWNDhwndDlg,UINTuMsg,WPARAMwParam,LPARAMlParam); staticboolOnInit(HWNDhwndDlg,UINTuMsg,WPARAMwParam,LPARAMlParam); CDialog(); private: staticINT_PTRCALLBACKDialogProc(HWNDhwndDlg,UINTuMsg,WPARAMwParam,LPARAMlParam); voidInitMap(); }; intWINAPIWinMain(HINSTANCEhInstance,HINSTANCEhPrevInstance,LPSTRlpCmdLine,intnCmdShow);
Dialog.cpp源文件如下:
#include"Dialog.h" CDialog*pThis;//保存基类指针 CDialog::MAP*CDialog::m_pHead=NULL; //窗口过程函数 INT_PTRCDialog::DialogProc(HWNDhwndDlg,UINTuMsg,WPARAMwParam,LPARAMlParam) { //遍历消息列表以查找是否有相应的响应函数 CDialog::MAP*pTemp=m_pHead; for(inti=1;i<=m_pHead->len;++i) { if(uMsg==pTemp->Msg) { pTemp->pf(hwndDlg,uMsg,wParam,lParam); returnFALSE; } pTemp=pTemp->pNext; } returnFALSE; } //创建消息列表 voidCDialog::InitMap() { m_pHead=newMAP; m_pHead->len=2; m_pHead->Msg=WM_CLOSE; m_pHead->pf=OnClose; MAP*pNew=newMAP; pNew->Msg=WM_INITDIALOG; pNew->pf=OnInit; pNew->pNext=NULL; m_pHead->pNext=pNew; m_pEnd=pNew; } //消息响应函数 boolCDialog::OnClose(HWNDhwndDlg,UINTuMsg,WPARAMwParam,LPARAMlParam) { EndDialog(hwndDlg,0); returntrue; } CDialog::CDialog() { InitMap(); } //程序入口函数 intWINAPIWinMain(HINSTANCEhInstance,HINSTANCEhPrevInstance,LPSTRlpCmdLine,intnCmdShow) { pThis->Show(hInstance,NULL); return0; } //显示Dialog boolCDialog::Show(HINSTANCEhIns,HWNDhParent) { DialogBox(hIns,MAKEINTRESOURCE(m_wRes),hParent,DialogProc); returntrue; } //由子类重写此函数以在对话框初始化时进行一些操作 boolCDialog::OnInit(HWNDhwndDlg,UINTuMsg,WPARAMwParam,LPARAMlParam) { returntrue; } //向消息列表中增加消息 voidCDialog::AddMsg(bool(*fp)(HWNDhwndDlg,UINTuMsg,WPARAMwParam,LPARAMlParam),UINTuMsg) { MAP*pNew=newMAP; pNew->Msg=uMsg; pNew->pf=fp; pNew->pNext=NULL; m_pEnd->pNext=pNew; m_pEnd=pNew; ++m_pHead->len; }
使用时,只需要把这2个文件包含进去,用资源编辑器创建一个Dialog,然后再自己写一个类,继承我的CDialog类,把m_wRes这个成员变更设为你创建的Dialog的ID,再extern一个全局变量m_pThis并把this指针赋给它就可以了。
要增加消息响应函数的话,只要在你的类的构造函数里调用AddMsg()这个函数,然后再写你的消息响应函数就好了。
AddMsg有两个参数,第一个参数是你的消息响应函数名,第二个参数是你要响应的消息。
示例如下:
#include"MyDlg.h" #include"resource.h" //定义一个指向CDialog的指针并在下面的构造函数中赋值为this externCDialog*pThis; MyDlgApp; MyDlg::MyDlg() { m_wRes=IDD_DIALOG1; pThis=this; AddMsg(OnCommand,WM_COMMAND); } //WM_COMMAND消息响应函数 boolMyDlg::OnCommand(HWNDhwndDlg,UINTuMsg,WPARAMwParam,LPARAMlParam) { MessageBox(hwndDlg,"","",0); returntrue; } //WM_INITDIALOG消息响应函数 boolMyDlg::OnInit(HWNDhwndDlg,UINTuMsg,WPARAMwParam,LPARAMlParam) { MessageBox(hwndDlg,"","",0); returntrue; }
希望本文所述对大家基于MFC的win32程序设计有所帮助。