如何继承 MFC 对话框?
Posted
技术标签:
【中文标题】如何继承 MFC 对话框?【英文标题】:How can I inherit an MFC dialog box? 【发布时间】:2009-02-18 00:23:42 【问题描述】:我创建了一个对话框(cMyDialog)。我打算复制 cMyDialog 并将其命名为 cMyDialog2。如何在 MFC 中进行继承?我希望 cMyDialog2 从 cMyDialog1 继承所有 IDD,这样我就不必将代码从 cMyDialog1 复制并粘贴到 cMyDialog2。 cMyDialog2 的目的是继承 cMyDialog1 的所有功能,并在其中添加一些额外的功能。
非常感谢您的回复。我不太确定 IMPLEMENT_DYNAMIC。下面是我的代码的简短 sn-p。如果我误解了宏,请您检查一下并帮助我吗?
// cMyDialog1.cpp : implementation file
cMyDialog1::cMyDialog1(void * pMsgData, CWnd* pParent /*=NULL*/): CDialog(cMyDialog1::IDD, pParent)
//codes....
BOOL cMyDialog1::OnInitDialog()
CDialog::OnInitDialog();
...
//cMyDialog2.cpp
cMyDialog2::cMyDialog2(void * pMsgData, CWnd* pParent /*=NULL*/)
: CMyDialog1(cMyDialog2::IDD, pParent)
//codes....
IMPLEMENT_DYNAMIC(cMyDialog2, cMyDialog1)
我可以通过DECLARE_DYNAMIC
和IMPLEMENT_DYNAMIC
方法从CMyDialog 继承。非常感谢您的帮助,亚当。
但我无法解决问题的第二部分。我想在子对话框CMyDialog1中添加一些额外的功能,例如添加“另存为”按钮,但我无法做到。是因为 CMyDialog1 是从 CMyDialog 继承的对话框,因此我无法添加新功能吗?如何在继承对话框中添加新功能?
【问题讨论】:
【参考方案1】:是的,您可以从 CDialog 派生类继承。您只需要添加一些宏,如 DECLARE_DYNAMIC 和其他一些宏来满足 MFC。这是一个例子。您可以以此为起点:
在.h文件中:
class cMyDialog2
: public cMyDialog
DECLARE_DYNAMIC(cMyDialog2)
pulic:
cMyDialog2();
virtual ~cMyDialog2();
protected:
DECLARE_MESSAGE_MAP()
;
.cpp 文件中:
#include "cMyDialog2.h"
IMPLEMENT_DYNAMIC(cMyDialog2, cMyDialog)
BEGIN_MESSAGE_MAP(cMyDialog2, cMyDialog)
END_MESSAGE_MAP()
cMyDialog2::cMyDialog2()
...etc.
【讨论】:
【参考方案2】:这可能被视为 Adam Piece 答案的附录。从另一个对话框派生时,了解DoDataExchange()
的角色也很重要。派生类 (cMyDialog2) 不应实现此函数,或者如果已实现(推荐)它应该调用它的基本版本,如下所示:
void cMyDialog2::DoDataExchange(CDataExchange* pDX)
CDialog::DoDataExchange(pDX);
cMyDialog::DoDataExchange(pDX);
如果没有正确完成,对话框上的控件将不会被创建,并且对话框可能会在调用/执行时崩溃。
【讨论】:
以上是关于如何继承 MFC 对话框?的主要内容,如果未能解决你的问题,请参考以下文章