如何继承 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_DYNAMICIMPLEMENT_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 对话框?的主要内容,如果未能解决你的问题,请参考以下文章

无法在 mfc 对话框中删除文件

大家帮忙解决下这个关于MFC的拖拽文件问题

MFC 如何将一个对话框嵌入到视图中

vs2008 mfc 如何在对话框中加入一个menu

C ++ MFC:将常用控件分成一组

MFC中如何让静态控件响应鼠标移动的消息?