写一个自己的CDialog基类,支持类向导添加映射函数

本文介绍了如何使用C++创建一个基类CBaseDialog,用于在所有Dialog界面中统一设置样式,如背景色,并展示了如何在CMyDlg继承类中应用这一基类,简化代码并便于添加个性化功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

有时候做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();

就可以显示你自己的对话框了。灰色背景色的对话框就是你的对话框。

 

现在你去对应的对话框资源上就可以用类向导添加自己的想要的消息函数和虚函数了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值