У меня есть класс, полученный из 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();
У меня была такая же проблема, я был очень озадачен и обнаружил, что в моем случае проблема была в следующем:
Если вы вызываете функцию-член 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 и не производный OnInitDialog от CWebNotificationDialog. Пытаться…
BOOL C1NotificationDialog::OnInitDialog()
{
CWebNotificationDialog::OnInitDialog();