2009-06-30 63 views

回答

6

我不知道你所说的“标准方法”的意思,但你一定可以做到这一点编程:

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

谢谢!这对我来说很好。 – mem64k 2009-07-01 08:15:14

0

以上OnInitDialog不除的情况下工作得很好,其中的命令是一个对话框 - 只有命令。

如果没有应用程序或主框架处理程序,则按钮将自行禁用并且不调用处理程序。请注意,上面的代码路由正确,因为ID_APP_ABOUTID_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); 
} 
1

如果你只需要处理对话框的命令只诀窍是SetRouteCommandsViaFrame设置为FALSE。然后,所有者(通常是对话框)将用于命令而不是主框架。

相关问题