MFC中对话框的默认构造函数

Override default Constructor of Dialog in MFC

本文关键字:默认 构造函数 对话框 MFC      更新时间:2023-10-16

我想覆盖 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;
}

尝试:

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传递到基类构造函数中。

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();