Можно ли добавить CMFCToolBar в диалог? - PullRequest
2 голосов
/ 30 июня 2009

Я просто попробовал стандартный способ добавления CToolbar в диалог на новом CMFCToolBar. Но это не работает. Прежде чем я окунусь в новую реализацию, я хочу знать, возможно ли это на самом деле?

Ответы [ 3 ]

6 голосов
/ 01 июля 2009

Я не уверен, что вы подразумеваете под "стандартным способом", но вы, безусловно, можете сделать это программно:

// 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 );
    }
...
}
1 голос
/ 03 января 2013

Если вам нужно иметь дело только с командами только для диалога, уловка состоит в том, чтобы установить SetRouteCommandsViaFrame в FALSE. Тогда владелец (обычно диалоговое окно) будет использоваться для команд вместо основного кадра.

1 голос
/ 01 сентября 2012

Выше 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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...