在CDialog的后代中没有调用OnInitDialog

时间:2015-09-23 16:45:12

标签: c++ mfc cdialog

我有一个源自CDialog(CNotificationDialog)的类,它在选择Add Class选项时由Visual Studio自动生成。

我还有另一个派生自CNotificationDialog(CWebNotificationDialog)的课程。

我的代码类似于:

CNotificationDialog* dlg = new CWebNotificationDialog();
dlg->Display();

显示对话框但未调用CWebNotificationDialog :: OnInitDialog方法。只调用CNotificationDialog :: OnInitDialog方法。

在你问之前,是的,它被宣布为虚拟。 我已经尝试添加DECLARE_DYNAMIC,BEGIN_MESSAGE_MAP和所有其他自动生成的宏,但没有运气。

我做错了什么?

这就是CNotificationDialog :: OnInitDialog的样子。

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

   HICON hIconBig = (HICON)LoadImage(AfxGetResourceHandle(), MAKEINTRESOURCE(IDR_MAINFRAME), IMAGE_ICON, 32, 32, LR_SHARED); 
   CStatic *pPictureCtrl = (CStatic*)GetDlgItem(IDS_NOTIFICATION_DLG_LOGO);
   pPictureCtrl->SetIcon(hIconBig);

   return TRUE;
}

声明如下:

protected:
virtual BOOL OnInitDialog();

2 个答案:

答案 0 :(得分:1)

我刚遇到同样的问题,非常困惑,发现在我的情况下,问题是:

如果在类构造函数中调用成员函数Create()函数,如MSDN中所推荐的那样,它必须在派生类构造函数中。根据这个问题,要避免在基类构造函数中调用虚函数:

Calling virtual functions inside constructors

我发现在以下代码中,在实例化派生类的对象时未调用派生类OnInitDialog():

class BaseDialog : public CDialog{
public:
    BaseDialog(UINT resourceID, CWnd *pParent) : CDialog(resourceID, pParent){
        Create(resourceID, pParent);
    };
};

class DerivedDialog : public BaseDialog{
public:
   DerivedDialog(UINT resourceID, CWnd *pParent) : BaseDialog(resourceID, pParent){};

    BOOL OnInitDialog(){ /* NOT CALLED */};
};

从派生类构造函数调用Create()时,派生类OnInitDialog()按预期调用:

class BaseDialog : public CDialog{
public:
    BaseDialog(UINT resourceID, CWnd *pParent) : CDialog(resourceID, pParent){
      //  Create(resourceID, pParent);
    };
};

class DerivedDialog : public BaseDialog{
public:
   DerivedDialog(UINT resourceID, CWnd *pParent) : BaseDialog(resourceID, pParent){
        Create(resourceID, pParent);
    };

    BOOL OnInitDialog(){ /* This was called */ };
};

答案 1 :(得分:0)

您正在从CWebNotificationDialog调用CDialog的基类和派生的OnInitDialog。尝试...

BOOL C1NotificationDialog::OnInitDialog()
{
   CWebNotificationDialog::OnInitDialog();