我没有写过基于对话框的ToolBar,不过我觉得如果跟踪到CControlBar中看看,一定会有收获。我觉得你能不能换一种方式来解决你的问题?你是想关掉你的ToolBar吗?

解决方案 »

  1.   

    void ShowControlBar( CControlBar* pBar, BOOL bShow, BOOL bDelay );
    到msdn去查吧,一查就有。
    对于CControlBar来说,显示与隐藏不用ShowWindow,而是用ShowControlBar函数,里面的参数就不用解释了吧。
    GoodLuck!
      

  2.   

    ShowControlBar是CFrameWnd调用的.
    在CDialog中其实是GetDockingFrame()得到指针调用ShowControlBar.
    GetDockingFrame是在bar固定时,得到框架的指针,而浮动时就返回NULL.
    所以浮动时就隐藏不了bar???
      

  3.   

    其实它仍然是从窗口类中继承的,所以它有一般窗口的特性,那个按钮也跟就是通常的东东,不过在框架窗口中,由于有四方停靠栏的支持,因此一切正常,但在对话框中由于无停靠的支持,也就无法隐身了,你看看下面几个函数,与对话框比较一下就知道了:EnableDocking以及不可见的DockControlBar.
      

  4.   


        这么菜的问题还敢说“群雄束手”?呵呵。    在CFrameWnd里面有一个指针数组,记录着所有的ControlBar。当你调用CFrameWnd::ShowControlBar的时候,它就调用ShowWindow把那个ControlBar显示/隐藏掉。    当ControlBar浮动时(脱离主框架),这时它的停靠框架是浮动的框架CMiniFrameWnd。你说的那个小按钮属于这个框架,而不是ControlBar本身。事实上,ControlBar是一个没有标题栏的窗口,怎么会有这些东西呢?    如果你要在对话框中使用的话,最好直接使用CToolBarCtrl等控件,而不是使用MFC框架结构里面的那些。说实在的,我是头一次听说有人在对话框里加入框架,又加入ControlBar的。
      

  5.   

    在CFrameWnd中控制浮动或者是贴边的工具条的确容易,
    我不能实现的是:当工具条浮动时,按小按钮让它隐藏的功能!!
    你可以试试,当它浮动后,CFW窗口不会自动刷新,工具条无法隐藏...
    请继续指点.
      

  6.   


        ft,你还没明白?!你说的那个小按钮属于这个框架,而不是ControlBar本身。事实上,ControlBar是一个没有标题栏的窗口,怎么会有这些东西呢?    你用工具条是无法处理这一消息的,除非你重载CMiniFrameWnd。
      

  7.   

    andygood,那怎么控制CMiniFrameWnd的那个按扭呢?比如CDialog是不是也是放在CMiniFrameWnd上?
    我重载OnClose就可以,但在toobar中就不行.而在一个单纯的文档视我根本就不用考虑这些鬼问题.:(
      

  8.   

    我对这个问题很感兴趣,用SPy++查了一下,现在将我的结果贴在这儿,可能会对你有帮助。
    当工具条被拖出来时,主窗口会建立一个新的子窗口,就是浮动的那个,而它本身的工具条窗口会隐藏,用的是SetWindowsPos函数,参数cy=0(零高度的窗口,当然看不见拉),因为我看到了WM_WINDOWPOSCHANGED消息。停靠的过程将建立的子窗口 Destroy,恢复工具条的尺寸。所以按下浮动窗口上的关闭按钮还是产生了WM_CLOSE消息,子窗口出现时有WM_CREATE消息
      

  9.   


        当工具条被拖出来时,创建的是CMiniFrameWnd(派生于CFrameWnd),然后把那个toolbar停到它里面。至于详细的过程,直接看看MFC源代码就完了,需要什么spy++吗?呵呵。    我发现回答这个问题的人多半没有看过MFC源代码。
      

  10.   

    zyj_vc:真有WM_CLOSE消息么?我试了重载CToolBar的OnClose,怎么没有用处?
    andygood:那怎么控制CMiniFrameWnd的那个按扭呢?如果能得到控制,
    我简单的加个showwindow就可以解决问题...高手们指点啊!!
      

  11.   

    andygood 故意在买弄,说来说去没说出到底怎么解决。
      

  12.   

    我没看上面人的回答,对问题可能有理解差异,但还是说说我的观点。这个CControlBar上的小按钮没必要做到CControlBar上面去。
    完全可以是做一个dialogbar大小等于小按钮大小(完全承载一个按钮)
    然后m_dlgwnd->MoveWindow...把这个dialogbar移动到CControlBar上面你所需要的位置。
    重载RecalcLayout在里面Move这个dialogbar就行,反正toolbar也是在客户区的。这样小按钮的消息就能接收到了。