这个问题是我上一个问题的后续问题。 首先感谢链接和示例,它们可以在CMDIChildWnd派生的CChildFrame类中工作,但不能用于CMDIChildWndEx派生的类。
我想做什么:
我想在CChildFrame窗口中创建一个工具栏(从CMDIChildWndEx派生!!)
到目前为止我做了什么: 1)使用VS2008Pro App-wizard创建了一个MDI选项卡式文档CView项目。 2)在CChildFrame中,我添加了OnCreate()
int CChildFrame :: OnCreate(LPCREATESTRUCT lpCreateStruct) { if(CMDIChildWndEx :: OnCreate(lpCreateStruct)== -1) 返回-1;
// TODO: Add your specialized creation code here
if (!m_wndToolBar.Create(this) ||
!m_wndToolBar.LoadToolBar(IDR_CHILDFRAME))
{
TRACE0("Failed to create toolbar\n");
return -1; // fail to create
}
// TODO: Remove this if you don't want tool tips or a
// resizeable toolbar
m_wndToolBar.SetBarStyle(m_wndToolBar.GetBarStyle() |
CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC);
// TODO: Delete these three lines if you don't want the toolbar
// to be dockable
m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
EnableDocking(CBRS_ALIGN_ANY);
DockControlBar(&m_wndToolBar); // Goes wrong here !!
return 0;
}
它编译并运行并停止在winfrm2.cpp中的ASSERT(行 92):
void CFrameWnd :: DockControlBar(CControlBar * pBar,CDockBar * pDockBar, LPCRECT lpRect) { ENSURE_ARG(pBar!= NULL); //确保已调用CControlBar :: EnableDocking ASSERT(pBar-> m_pDockContext!= NULL);
if (pDockBar == NULL)
{
for (int i = 0; i < 4; i++)
{
if ((dwDockBarMap[i][1] & CBRS_ALIGN_ANY) ==
(pBar->m_dwStyle & CBRS_ALIGN_ANY))
{
pDockBar = (CDockBar*)GetControlBar(dwDockBarMap[i][0]);
/ * --------&gt;这里出错------&gt; * / ASSERT(pDockBar!= NULL); //当bar的初始CBRS_没有时,断言失败 //匹配可用的停靠站点,由EnableDocking()设置 打破; } } } ENSURE_ARG(pDockBar!= NULL); ASSERT(m_listControlBars.Find(pBar)!= NULL); ASSERT(pBar-> m_pDockSite == this); //如果发生这个断言,那是因为pBar的父亲是 不是最初的 //当调用pBar的OnCreate时,这个CFrameWnd //即该控件栏应该是用不同的创建的 父母最初
pDockBar->DockControlBar(pBar, lpRect);
}
第92行:
ASSERT(pDockBar!= NULL); //当bar的初始CBRS_没有时,断言失败 //匹配可用的停靠站点,由EnableDocking()
设置这里的消息来源甚至可以解释这里出了什么问题 但我不知道如何匹配'初始CBRS_的酒吧与那些设置 EnableDocking()''
这是否适用于CMDIChildWndEx派生的CChildFrame类?
那么我的问题是,是否有人知道如何添加工具栏 CMDIChildWndEx派生了CChildFrame类? 有关如何使这项工作的任何建议?
我的项目在这里: http://www.4shared.com/file/235762968/49b8b97a/GUI50.html
非常感谢任何帮助!
答案 0 :(得分:2)
这似乎适用于CMFCToolBar
int CChildFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CMDIChildWndEx::OnCreate(lpCreateStruct) == -1)
return -1;
m_wndToolBar.Create(this, AFX_DEFAULT_TOOLBAR_STYLE, IDR_CHILDFRAME);
m_wndToolBar.LoadToolBar(IDR_CHILDFRAME, 0, 0, TRUE );
m_wndToolBar.SetPaneStyle( CBRS_TOOLTIPS | CBRS_FLYBY| CBRS_BOTTOM);
m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
EnableDocking(CBRS_ALIGN_ANY);
DockPane(&m_wndToolBar);
return 0;
}
答案 1 :(得分:1)
您应该在MDIChild构造函数中设置m_bEnableFloatingBars = TRUE。如果没有这个,您的工具栏将不会被鼠标停靠,只能静止对接。