多文档,有多个视图,多个工具栏。我想让mmView处于激活状态时,显示工具栏mm,隐藏工具栏nn;
nnView处于激活状态时,显示工具栏nn,而隐藏工具栏mm。我该怎么做??好象和菜单不一样。

解决方案 »

  1.   

    楼主,我是从上一个贴子来的
    以下供参考int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
    {
    if (CMDIFrameWnd::OnCreate(lpCreateStruct) == -1)
    return -1;

    if (!m_wndToolBar.Create(this) ||
    !m_wndToolBar.LoadToolBar(IDR_MAINFRAME))
    {
    TRACE0("Failed to create toolbar\n");
    return -1;      // fail to create
    } if (!m_wndMyToolBar.Create(this)||
    !m_wndMyToolBar.LoadToolBar(IDR_MYMAINFRAME))  //另外的资源
    {
    TRACE0("Failed to create MYtoolbar\n");
    return -1;      // fail to create
    } if (!m_wndStatusBar.Create(this) ||
    !m_wndStatusBar.SetIndicators(indicators,
      sizeof(indicators)/sizeof(UINT)))
    {
    TRACE0("Failed to create status bar\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);
    m_wndMyToolBar.SetBarStyle(m_wndMyToolBar.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);
    m_wndMyToolBar.EnableDocking(CBRS_ALIGN_ANY);
    EnableDocking(CBRS_ALIGN_ANY);         DockControlBar(&m_wndToolBar);
             DockControlBar(&m_wndMyToolBar);

    return 0;
    }我的想法:
    在切换view的时候,
    把对应的controlbar用ShowWindow(SW_SHOW)显示出来
    其它的controlbar用ShowWindow(SW_HIDE)隐藏即可
      

  2.   

    你在切换视图的时候动态的显示消除工具栏不就可以啦?具体代码可以参考MFC的源代码呀。
      

  3.   

    可以到CodeProject找找看。
    http://www.codeproject.com
      

  4.   

    用ShowWindow()我想是不完整的,因为还要Relayout Frame 和 Views.建议:向Frame发WM_COMMAND消息。
      

  5.   

    你可以用REBAR来连接所有工具懒,以后就可以很方便的显示和隐藏工具篮了
    具体的用法看看MSDN就可以了
      

  6.   

    如果是SDI,在自己切换VIEW的地方,切换工具栏就可以了。
      

  7.   

    你可以在切换视图时给主框架发消息,让主框架调用ShowControlBar()作工具栏的显示隐工作
      

  8.   

    TO:  siphonelee(sifone) ,
        我也那么做过,只是一到m_wndMyToolBar.ShowWindow(SW_SHOW)这就出错,我还试过SetFocus()、SetActiveView()、BringWindowToTop()等方法,但都是编译不报错,运行时到该语句就出错。由于我没经验,分析不出到底是什么原因。TO:  riverboat(诸葛不亮),
        我去codeproject看过,那上面有一个列子,还有一个Another solution。他的那个例子里要多建一个客户区的类,而且他的两个视图在切换的时候不能重绘,存在很多毛病。如果没有那些毛病的话,他的例子正是我要的效果。我对重绘这块搞的一塌糊涂,所以没敢用他的方法。如果您能帮我把那个例子的bug修正,我再另给您100分。对于他那儿的第二种解决方法,看去来很好,在SelectBar()中要动态清除并再生成工具栏。可是我这也是到了关键的地方m_myToolBar->LoadToolBar()就出错。  头晕!TO: Cline(营营) 、xt_jat(桑巴) ,
        我对消息这也不熟,我不清楚我的消息应该在哪儿发,消息又该在哪儿处理。比如我有mmView和nnView两个视图,当激活mmView时要发送消息,我的消息在mmView.cpp的OnSetFocus()中发吗? 消息又再哪儿处理?在MainFrm.cpp里建一个处理函数,在该函数中ShowWindow()或SetActiveView()吗??TO:  MasterGo(皮皮),
        能详细讲一下吗??TO: Mackz(在相互) ,
        我的是MDI非常感谢诸位的帮助。我先把上一个帖子结了。这个帖子再讨论两天。
    还望大哥大姐们继续指点。谢谢!!
      

  9.   

    就是等价于鼠标点了[View/Your bar]. 对了你加了消息映射 ON_COMMAND_EX(ID_YOUR_BAR, OnBarCheck)
    ON_UPDATE_COMMAND_UI(ID_YOUR_BAR, OnUpdateControlBarMenu)吗?-------------挖掘MFC代码--------------BOOL CFrameWnd::OnBarCheck(UINT nID)
    {
    ASSERT(ID_VIEW_STATUS_BAR == AFX_IDW_STATUS_BAR);
    ASSERT(ID_VIEW_TOOLBAR == AFX_IDW_TOOLBAR);
    ASSERT(ID_VIEW_REBAR == AFX_IDW_REBAR); CControlBar* pBar = GetControlBar(nID);
    if (pBar != NULL)
    {
    ShowControlBar(pBar, (pBar->GetStyle() & WS_VISIBLE) == 0, FALSE);
    return TRUE;
    }
    return FALSE;
    }void CFrameWnd::ShowControlBar(CControlBar* pBar, BOOL bShow, BOOL bDelay)
    {
    ASSERT(pBar != NULL);
    CFrameWnd* pParentFrame = pBar->GetDockingFrame();
    ASSERT(pParentFrame->GetTopLevelParent() == GetTopLevelParent());
    // parent frame of bar must be related if (bDelay)
    {
    pBar->DelayShow(bShow);
    pParentFrame->DelayRecalcLayout();
    }
    else
    {
    pBar->SetWindowPos(NULL, 0, 0, 0, 0,
    SWP_NOZORDER|SWP_NOMOVE|SWP_NOSIZE|SWP_NOACTIVATE|
    (bShow ? SWP_SHOWWINDOW : SWP_HIDEWINDOW));
    // call DelayShow to clear any contradictory DelayShow
    pBar->DelayShow(bShow);
    if (bShow || !pBar->IsFloating())
    pParentFrame->RecalcLayout(FALSE);
    } // show or hide the floating frame as appropriate
    if (pBar->IsFloating())
    {
    int nVisCount = pBar->m_pDockBar != NULL ?
    pBar->m_pDockBar->GetDockedVisibleCount() : bShow ? 1 : 0;
    if (nVisCount == 1 && bShow)
    {
    pParentFrame->m_nShowDelay = -1;
    if (bDelay)
    {
    pParentFrame->m_nShowDelay = SW_SHOWNA;
    pParentFrame->RecalcLayout(FALSE);
    }
    else
    pParentFrame->ShowWindow(SW_SHOWNA);
    }
    else if (nVisCount == 0)
    {
    ASSERT(!bShow);
    pParentFrame->m_nShowDelay = -1;
    if (bDelay)
    pParentFrame->m_nShowDelay = SW_HIDE;
    else
    pParentFrame->ShowWindow(SW_HIDE);
    }
    else if (!bDelay)
    {
    pParentFrame->RecalcLayout(FALSE);
    }
    }
    }
      

  10.   

    LoadToolBar()、ShowControlBar()、RecalcLayout()组合使用即可我这样做,成功了你可以试一下
      

  11.   

    一下子说不清楚
    把程序发给我[email protected]
    我帮你看看
      

  12.   

    siphonelee,对不起,昨天没查看信箱,没看到您给我发的程序,结帖慢了。
    再次感谢。请您到我新开的帖子领分:
    http://expert.csdn.net/Expert/topic/1590/1590896.xml?temp=.5631983