簡體   English   中英

在CDialog的后代中未調用OnInitDialog

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM