1

我有一个派生自 CDialog (CNotificationDialog) 的类,它是在选择“添加类”选项时由 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();
4

2 回答 2

1

我刚刚遇到了同样的问题,非常困惑,发现就我而言,问题是这样的:

如果您在类构造函数中调用成员函数 Create() 函数,按照 MSDN 中的建议,它必须放在派生类构造函数中。根据这个问题,应避免从基类构造函数中调用虚函数:

在构造函数中调用虚函数

我发现在下面的代码中,在实例化派生类的对象时,没有调用派生类 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 */ };
};
于 2016-05-12T02:15:36.500 回答
0

您正在调用 CDialog 的基类,而不是从 CWebNotificationDialog 派生的 OnInitDialog。尝试...

BOOL C1NotificationDialog::OnInitDialog()
{
   CWebNotificationDialog::OnInitDialog();
于 2015-09-23T17:25:06.260 回答