Можно ли добавить 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);
}
Другие вопросы по тегам