Выше OnInitDialog
работает хорошо, за исключением случаев, когда команда является командой только для диалога.
Если нет приложения или обработчика основного кадра, кнопка отключается сама и обработчик не вызывается. Обратите внимание, что вышеприведенный код работает правильно, потому что ID_APP_ABOUT
и ID_APP_EXIT
уже имеют обработчики CWinAppEx
.
Обходной путь, который не включает переопределение OnCmdMsg
, заключается в добавлении обработчика на уровне приложения или основного фрейма. Панель инструментов останется активной и правильно найдет путь к соответствующему обработчику диалогов. Добавление простого обработчика void к CMainFrame
делает свое дело (пример кода ниже). Обработчик void не вызывается.
BOOL CMyDlg::OnInitDialog()
{
...
m_ToolBar.InsertButton( CMFCToolBarButton( **ID_DLG_COMMAND**, -1, _T("DlgCommand") ) );
...
}
//CMainFrame
BEGIN_MESSAGE_MAP(CMainFrame, CMDIFrameWndEx)
...
ON_COMMAND(**ID_DLG_COMMAND**, VoidHandler)
END_MESSAGE_MAP()
void CMainFrame::VoidHandler()
{
assert(0);
}