【问题标题】:Override default Constructor of Dialog in MFC覆盖 MFC 中对话框的默认构造函数
【发布时间】:2017-04-18 19:58:09
【问题描述】:

我想重写 CTestDialog 的默认构造函数,以便可以在其中传递 CString。

如何通过

CTestDialog(CString strValue = NULL);

这在 MFC 中是可能的还是只是我的想象?

class CTestDialog : public CDialog
{
    DECLARE_DYNAMIC(CTestDialog)

public:
    CTestDialog(CWnd* pParent = NULL);   // standard constructor
    CTestDialog(CString strValue = NULL); // Custom Constructor
    virtual ~CTestDialog();

    // Dialog Data
#ifdef AFX_DESIGN_TIME
    enum { IDD = IDD_TESTDIALOG };
#endif

protected:
    CString _filename;
    virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support

    DECLARE_MESSAGE_MAP()
public:
    virtual BOOL OnInitDialog();
};

用法:

 CString str = _T("Some Text");

 CTestDialog dlg(str);
 dlg.doModal();

更新 1

在线:

dlg.DoModal();

调试断言失败。显示 Microsoft Visual C++ 运行时库对话框。

更新 2

IMPLEMENT_DYNAMIC(CTestDialog, CDialog)

CTestDialog::CTestDialog(CWnd* pParent /*=NULL*/)
    : CDialog(IDD_TESTDIALOG, pParent)
{

}

CTestDialog::CTestDialog(CString str)
    : CDialog(CTestDialog::IDD, NULL)
{
    _filename = str;
}

CTestDialog::~CTestDialog()
{
}

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


BEGIN_MESSAGE_MAP(CTestDialog, CDialog)
END_MESSAGE_MAP()

BOOL CTestDialog::OnInitDialog()
{
    CDialog::OnInitDialog();

    // TODO:  Add extra initialization here
    AfxMessageBox(_filename.GetBuffer());
    return TRUE;
}

【问题讨论】:

  • 是的,这是可能的。你做这件事有什么困难吗?
  • 是的,每当我编写上述代码时,都会显示调试断言对话框。我找不到正确的方法。任何样本都会很有帮助
  • @TheUndeadFish in dlg.doModal() -> 出现调试断言。不知道怎么解决。
  • @crashmstr 我已经按照我的方式分享了代码。但我不知道我是对还是错。我正在指定新的构造函数,而不是编辑默认构造函数。

标签: c++ mfc


【解决方案1】:

试试:

class CTestDialog : public CDialog
{
    DECLARE_DYNAMIC(CTestDialog)

   public:
      CTestDialog(CWnd* pParent = NULL);   // standard constructor

      CTestDialog(CWnd* pParent, CString strValue); // Custom Constructor

      virtual ~CTestDialog();

   // Dialog Data
   #ifdef AFX_DESIGN_TIME
        enum { IDD = IDD_TESTDIALOG };
   #endif

   protected:
      CString _filename; 
      virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support

      DECLARE_MESSAGE_MAP()
   public:
      virtual BOOL OnInitDialog();
};

还有:

IMPLEMENT_DYNAMIC(CTestDialog, CDialog)

CTestDialog::CTestDialog(CWnd* pParent /*=NULL*/)
    : CDialog(IDD_TESTDIALOG, pParent)
{

}

CTestDialog::CTestDialog(CWnd* pParent, CString str)
    : CDialog(IDD_TESTDIALOG, pParent)
{
     _filename = str;
}

CTestDialog::~CTestDialog()
{
}

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


BEGIN_MESSAGE_MAP(CTestDialog, CDialog)
END_MESSAGE_MAP()

BOOL CTestDialog::OnInitDialog()
{
    CDialog::OnInitDialog();

    // TODO:  Add extra initialization here
    AfxMessageBox(_filename.GetBuffer());
    return TRUE; 
}

注意:

CTestDialog::CTestDialog(CWnd* pParent, CString str)
    : CDialog(IDD_TESTDIALOG, pParent)
{
     _filename = str;
}

原来是这样:

CTestDialog dlg(NULL, "filename");
dlg.DoModal();

你看,你的自定义构造函数首先被调用。然后将所需的pParent 传递给基类构造函数。

【讨论】:

  • 使用构造函数将值从一个对话框传递到另一个对话框是数据传输的好方法,或者任何其他更好的方法也存在。还有一个疑问。在自定义构造函数中传递 pParent 是必需的,也可以省略
【解决方案2】:
class CTestDialog : public CDialog
{
    DECLARE_DYNAMIC(CTestDialog)

   public:
      CTestDialog(CWnd* pParent = NULL);   // standard constructor

      CTestDialog(CString strValue); // Custom Constructor

      virtual ~CTestDialog();

   // Dialog Data
   #ifdef AFX_DESIGN_TIME
        enum { IDD = IDD_TESTDIALOG };
   #endif

   protected:

      virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support

      DECLARE_MESSAGE_MAP()
   public:
      CString _filename; 
      virtual BOOL OnInitDialog();
};

正在使用中

 CTestDialog dlg(NULL, stingtopass);
 dlg.doModal();

【讨论】:

  • 拥有两个默认构造函数仍然是糟糕的设计。您现在无需指定参数即可创建对象。那么它将使用哪个构造函数?正如我在 cmets 中提到的,您应该从第二个构造函数的声明中删除 = NULL。通常最好将变量保持私有并添加公共的 Get 或 Set 方法。最后,我不明白为什么您不只是将变量作为参数添加到原始构造函数中。你不需要两个。
  • @AndrewTruckle 我接受你的观点。小问题让我发痒,问题是是否覆盖默认构造函数或按照您的指导使用 Get 或 Set 方法。在 mfc 中哪一个更合乎逻辑和更好的做法。
  • 要么,要么两者兼而有之。它们都是很好的练习技巧。
猜你喜欢
  • 2017-11-10
  • 1970-01-01
  • 2011-01-18
  • 1970-01-01
  • 1970-01-01
  • 2013-10-27
  • 1970-01-01
  • 2017-04-21
  • 2011-09-24
相关资源
最近更新 更多