Можно ли добавить CMFCToolBar в диалог?
Я только что попробовал стандартный способ добавления CToolbar в диалог на новом CMFCToolBar. Но это не работает. Прежде чем окунуться в новую реализацию, я хочу знать, возможно ли это на самом деле?
3 ответа
Я не уверен, что вы подразумеваете под "стандартным способом", но вы, безусловно, можете сделать это программно:
// In MyDlg.h
class CMyDlg : public CDialog
{
...
CMFCToolBar m_ToolBar;
...
};
// In MyDlg.cpp
BOOL CMyDlg::OnInitDialog()
{
...
if( m_ToolBar.Create( this, AFX_DEFAULT_TOOLBAR_STYLE, 100 ) )
{
m_ToolBar.SetPaneStyle( m_ToolBar.GetPaneStyle()
& ~(CBRS_GRIPPER | CBRS_SIZE_DYNAMIC | CBRS_BORDER_ANY) );
m_ToolBar.InsertButton( CMFCToolBarButton( ID_APP_ABOUT, -1, _T("About") ) );
m_ToolBar.InsertButton( CMFCToolBarButton( ID_APP_EXIT, -1, _T("Exit") ) );
CSize sizeToolBar = m_ToolBar.CalcFixedLayout( FALSE, TRUE );
m_ToolBar.SetWindowPos( NULL, 0, 0, sizeToolBar.cx, sizeToolBar.cy,
SWP_NOACTIVATE | SWP_NOZORDER );
}
...
}
Если вам нужно иметь дело только с командами только для диалога, уловка состоит в том, чтобы установить SetRouteCommandsViaFrame в FALSE. Тогда владелец (обычно диалоговое окно) будет использоваться для команд вместо основного кадра.
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);
}