如何在CMDIChildWndEx派生CChildFrame中创建工具栏?

时间:2010-03-07 00:37:57

标签: mfc

这个问题是我上一个问题的后续问题。 首先感谢链接和示例,它们可以在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

非常感谢任何帮助!

2 个答案:

答案 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。如果没有这个,您的工具栏将不会被鼠标停靠,只能静止对接。