OnInitDialog 未在 CDialog 的后代中调用
OnInitDialog not called in descendant of CDialog
我有一个 class 派生自 CDialog (CNotificationDialog),它是在选择添加 Class 选项时由 Visual Studio 自动生成的。
我还有另一个 class 派生自 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();
您正在调用 CDialog 的基 class 而 不是 来自 CWebNotificationDialog 的派生 OnInitDialog。尝试...
BOOL C1NotificationDialog::OnInitDialog()
{
CWebNotificationDialog::OnInitDialog();
我刚刚遇到了同样的问题,非常困惑,发现在我的情况下,问题是这样的:
如果您在 class 构造函数中调用成员函数 Create() 函数,按照 MSDN 中的建议,它必须进入派生的 class 构造函数。根据这个问题,要避免从 base-class 构造函数中调用虚函数:
Calling virtual functions inside constructors
我发现在下面的代码中,在实例化派生class的对象时没有调用派生class 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 */};
};
从派生的 class 构造函数调用 Create() 时,派生的 class 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 */ };
};
我有一个 class 派生自 CDialog (CNotificationDialog),它是在选择添加 Class 选项时由 Visual Studio 自动生成的。
我还有另一个 class 派生自 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();
您正在调用 CDialog 的基 class 而 不是 来自 CWebNotificationDialog 的派生 OnInitDialog。尝试...
BOOL C1NotificationDialog::OnInitDialog()
{
CWebNotificationDialog::OnInitDialog();
我刚刚遇到了同样的问题,非常困惑,发现在我的情况下,问题是这样的:
如果您在 class 构造函数中调用成员函数 Create() 函数,按照 MSDN 中的建议,它必须进入派生的 class 构造函数。根据这个问题,要避免从 base-class 构造函数中调用虚函数:
Calling virtual functions inside constructors
我发现在下面的代码中,在实例化派生class的对象时没有调用派生class 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 */};
};
从派生的 class 构造函数调用 Create() 时,派生的 class 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 */ };
};