OnInitDialog не вызывается в потомке CDialog

У меня есть класс, полученный из CDialog (CNotificationDialog), который автоматически генерируется Visual Studio при выборе опции Add 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();

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 */ };
};
1

Другие решения

Вы называете базовый класс CDialog и не производный OnInitDialog от CWebNotificationDialog. Пытаться…

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

По вопросам рекламы [email protected]