我刚刚尝试了将 CToolbar 添加到新 CMFCToolBar 上的对话框的标准方法。但它不起作用。在我进入新的实现之前,我想知道它是否真的可能?
问问题
4282 次
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 );
}
...
}
于 2009-06-30T20:19:18.950 回答
1
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);
}
于 2012-09-01T02:28:00.300 回答
1
如果您只需要处理仅限对话框的命令,则技巧是将 SetRouteCommandsViaFrame 设置为 FALSE。然后所有者(通常是对话框)将用于命令而不是主框架。
于 2013-01-03T10:02:46.740 回答