[英]Is there any function called after the OnInitDialog function in MFC?
[英]OnInitDialog not called in descendant of CDialog
我有一個派生自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();
我只是遇到了同樣的問題,感到非常困惑,發現就我而言,問題是這樣的:
如果要在類構造函數中調用成員函數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 */ };
};
您正在調用CDialog的基類,而不是從CWebNotificationDialog派生的OnInitDialog。 嘗試...
BOOL C1NotificationDialog::OnInitDialog()
{
CWebNotificationDialog::OnInitDialog();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.