我创建了一个对话框(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_DYNAMIC
和IMPLEMENT_DYNAMIC
方法从CMyDialog继承。非常感谢你的帮助,亚当。
但我无法让问题的第二部分发挥作用。我想在子对话框CMyDialog1中添加一些额外的功能,例如添加“另存为”按钮,但我无法做到。是因为CMyDialog1是来自CMyDialog的继承对话框,因此,我无法添加新函数?如何在继承的对话框中添加新功能?
答案 0 :(得分: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.
答案 1 :(得分:0)
这可能被视为Adam Piece答案的附录。在从另一个对话框派生时理解DoDataExchange()
的作用也很重要。派生类(cMyDialog2)不应该实现这个函数,或者如果它被实现(推荐)它应该调用它的基本版本,如下所示:
void cMyDialog2::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
cMyDialog::DoDataExchange(pDX);
}
如果没有正确完成,则不会创建对话框上的控件,并且在调用/执行时对话框可能会因此而崩溃。