有时候做Diaglog界面是发现很相同的代码处理部分,比如,在OnInitDialog成员方法中,同一个项目所有的界面都会有相同的风格设置,比如说背景色设置统一等等。
那么我们不妨就自己先写一个基类吧。
我这个基类是CBaseDialog继承于CDialogEx。
下面是我写的一个类,里面有一部分是参考CDialogEx源代码翻译过来的。
CBaseDialog.h的内容
#include <afxdialogex.h>
#ifdef _AFX_PACKING
#pragma pack(push, _AFX_PACKING)
#endif
#ifdef _AFX_MINREBUILD
#pragma component(minrebuild, off)
#endif
class CBaseDialog :
public CDialogEx
{
public:
CBaseDialog();
CBaseDialog(UINT nIDTemplate, CWnd* pParent = NULL);
CBaseDialog(LPCTSTR lpszTemplateName, CWnd* pParentWnd = NULL);
//下面两个函数其实是DECLARE_DYNAMIC(CBaseDialog)的替换内容
public:
static const CRuntimeClass classCBaseDialog;
virtual CRuntimeClass* GetRuntimeClass() const;
BOOL OnInitDialog();
//下面两个函数其实是DECLARE_MESSAGE_MAP()的替换内容
protected:
static const AFX_MSGMAP* __stdcall GetThisMessageMap();
virtual const AFX_MSGMAP* GetMessageMap() const;
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
};
#ifdef _AFX_MINREBUILD
#pragma component(minrebuild, on)
#endif
#ifdef _AFX_PACKING
#pragma pack(pop)
#endif
CBaseDialog.cpp的内容
#include "pch.h"
#include "CBaseDialog.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
__declspec(selectany) const CRuntimeClass CBaseDialog::classCBaseDialog =
{
"CBaseDialog",
sizeof(class CBaseDialog),
0xFFFF,
NULL,
RUNTIME_CLASS(CDialogEx),
NULL,
NULL
};
CRuntimeClass * CBaseDialog::GetRuntimeClass() const
{
return RUNTIME_CLASS(CBaseDialog);
}
BOOL CBaseDialog::OnInitDialog()
{
CDialogEx::OnInitDialog();
SetBackgroundColor(RGB(175,175,175), 1);
return TRUE; // 除非将焦点设置到控件,否则返回 TRUE
}
#pragma warning(disable : 4355)
CBaseDialog::CBaseDialog()
:CDialogEx()
{
}
CBaseDialog::CBaseDialog(UINT nIDTemplate, CWnd* pParent/*= NULL*/) : CDialogEx(nIDTemplate, pParent)
{
}
CBaseDialog::CBaseDialog(LPCTSTR lpszTemplateName, CWnd* pParentWnd/*= NULL*/) : CDialogEx(lpszTemplateName, pParentWnd)
{
}
#pragma warning(default : 4355)
void CBaseDialog::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
AFX_MSG_CALL
}
//BEGIN_MESSAGE_MAP(CBaseDialog, CDialogEx)
__pragma(warning(push))
__pragma(warning(disable : 4867))
const AFX_MSGMAP* CBaseDialog::GetMessageMap() const
{
return GetThisMessageMap();
}
const AFX_MSGMAP* __stdcall CBaseDialog::GetThisMessageMap()
{
typedef CBaseDialog ThisClass;
typedef CDialogEx TheBaseClass;
__pragma(warning(push))
__pragma(warning(disable: 4640))
/* message maps can only be called by single threaded message pump */
static const AFX_MSGMAP_ENTRY _messageEntries[] =
{
//------------------------------------
//END_MESSAGE_MAP()
{ 0, 0, 0, 0, AfxSig_end, (AFX_PMSG)0 }
};
__pragma(warning(pop))
static const AFX_MSGMAP messageMap =
{
&CDialogEx::GetThisMessageMap, &_messageEntries[0]
};
return &messageMap;
}
__pragma(warning(pop))
写好基类后,就可以写自己的实例Dialog类了,首先要添加一个窗口资源IDD_DLG_TEST,然后先要新建一个继承于CDialogEx的类CMyDlg,因为VS默认不会让你选自定义的基类的。生成之后,我们再把基类改成我自己的类。
下面是CMyDlg.h的内容
#pragma once
#include"CApp.h"
#include "CBaseDialog.h"
// CMyDlg 对话框
class CMyDlg : public CBaseDialog
{
DECLARE_DYNAMIC(CMyDlg)
public:
CMyDlg(CWnd* pParent = nullptr); // 标准构造函数
virtual ~CMyDlg();
// 对话框数据 这个非常重要的要加上,为了方便用类向导添加映射函数
#ifdef AFX_DESIGN_TIME
enum { IDD = IDD_DLG_TEST };
#endif
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
DECLARE_MESSAGE_MAP()
};
CMyDlg.cpp的内容
#include "pch.h"
#include"CBaseDialog.h"
#include "CMyDlg.h"
// CMyDlg 对话框
IMPLEMENT_DYNAMIC(CMyDlg, CDialogEx)
CMyDlg::CMyDlg(CWnd* pParent /*=nullptr*/)
: CBaseDialog(IDD_DLG_TEST, pParent)
{
}
CMyDlg::~CMyDlg()
{
}
void CMyDlg::DoDataExchange(CDataExchange* pDX)
{
CBaseDialog::DoDataExchange(pDX);
}
BEGIN_MESSAGE_MAP(CMyDlg, CDialogEx)
END_MESSAGE_MAP()
在另外一个合适的地方直接写入一下代码
CMyDlg mydlg;
mydlg.DoModal();
就可以显示你自己的对话框了。灰色背景色的对话框就是你的对话框。
现在你去对应的对话框资源上就可以用类向导添加自己的想要的消息函数和虚函数了。