代码之家  ›  专栏  ›  技术社区  ›  mem64k

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

  •  2
  • mem64k  · 技术社区  · 15 年前

    我刚刚尝试了将ctoolbar添加到新cmfctoolbar的对话框中的标准方法。但它不起作用。在深入研究新的实现之前,我想知道它是否实际可行?

    3 回复  |  直到 12 年前
        1
  •  6
  •   blindauer    15 年前

    我不知道你所说的“标准方式”是什么意思,但你当然可以通过编程来实现:

    // 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
  •  1
  •   Pål Kristian Tønder    12 年前

    如果只需要处理对话命令,技巧是将setroutecommandsviaframe设置为false。然后,所有者(通常是对话框)将用于命令而不是主框架。

        3
  •  0
  •   Mysticial rexford    12 年前

    这个 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);
    }