3

我创建了一个对话框(cMyDialog)。我打算复制 cMyDialog 并将其命名为 cMyDialog2。如何在 MFC 中进行继承?我希望 cMyDialog2 从 cMyDialog1 继承所有 IDD,这样我就不必将代码从 cMyDialog1 复制并粘贴到 cMyDialog2。cMyDialog2 的目的是继承 cMyDialog1 的所有功能,并在其中添加一些额外的功能。


非常感谢您的回复。我不太确定 IMPLEMENT_DYNAMIC。下面是我的代码的一小段。如果我误解了宏,请您复习一下并帮助我吗?

// 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_DYNAMICandIMPLEMENT_DYNAMIC方法从 CMyDialog 继承。非常感谢你的帮助,亚当。

但是我无法解决问题的第二部分。我想在子对话框CMyDialog1中添加一些额外的功能,例如添加“另存为”按钮,但我无法做到。是因为 CMyDialog1 是从 CMyDialog 继承的对话框,因此我无法添加新功能吗?如何在继承对话框中添加新功能?

4

2 回答 2

6

是的,您可以从 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.
于 2009-02-18T00:34:01.907 回答
0

这可能被视为 Adam Piece 答案的附录。DoDataExchange()了解从另一个对话派生时的角色也很重要。派生类 (cMyDialog2) 不应实现此函数,或者如果已实现(推荐)它应该调用它的基本版本,如下所示:

void cMyDialog2::DoDataExchange(CDataExchange* pDX)
{
    CDialog::DoDataExchange(pDX);
    cMyDialog::DoDataExchange(pDX);
}

如果这没有正确完成,对话框上的控件将不会被创建,并且对话框可能会在调用/执行时崩溃。

于 2013-09-05T05:10:20.867 回答