自己简单封装的一个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程序设计有所帮助。