是否可以将 CMFCToolBar 添加到对话框中?

问题描述 投票:0回答:3

我刚刚尝试了将

CToolbar
添加到新
CMFCToolBar
上的对话框的标准方法。但这不起作用。在我深入研究新的实现之前,我想知道它是否真的可行?

c++ visual-c++ mfc mfc-feature-pack
3个回答
8
投票

我不确定你所说的“标准方式”是什么意思,但你当然可以通过编程来做到这一点:

// 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 );
    }
...
}

2
投票

如果您只需要处理仅限对话框的命令,技巧是将

SetRouteCommandsViaFrame
设置为
FALSE
。然后所有者(通常是对话框)将用于命令而不是主框架。


1
投票

上面的

OnInitDialog
确实可以很好地工作,除非该命令是仅对话框命令。

如果没有应用程序或主机处理程序,按钮将自行禁用并且不会调用处理程序。请注意,上述代码路由正确,因为

ID_APP_ABOUT
ID_APP_EXIT
已经具有
CWinAppEx
处理程序。

不涉及覆盖

OnCmdMsg
的解决方法是在应用程序或主机级别添加处理程序。 然后工具栏保持活动状态,并将正确找到正确的对话框处理程序。 向
CMainFrame
添加一个简单的 void 处理程序就可以解决问题(下面的示例代码)。 未调用 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);
}
© www.soinside.com 2019 - 2024. All rights reserved.