我有一个动态创建得工具栏(具体来说就是视图全屏后的一个退出全屏的按钮),使用如下代码进行创建:
         m_pwndFullScrnBar=new CToolBar;
         if (!m_pwndFullScrnBar->Create(this,CBRS_SIZE_DYNAMIC|CBRS_FLOATING) ||
    !m_pwndFullScrnBar->LoadToolBar(IDR_FULLSCREEN))
         {
         TRACE0("Failed to create toolbar\n");
    return;      // fail to create
        }这样出来的工具栏按钮,带有“×”,要是哪个SB用户点击这个按钮关闭了工具栏,那么就找不到退出全屏的办法了。
请问:有什么办法使创建的这个工具栏没有“×”按钮?

解决方案 »

  1.   

    http://www.vckbase.com/document/viewdoc.asp?id=533
      

  2.   

    首先,我们来确定实现的思路,因为我们要实现的功能与工具条有关,所以涉及的类肯定与 CToolBar有关。其次,为了判断工具条浮动后“关闭”按钮的状态,我们需要一个表示状态的成员变量;第三,实现工具条的浮动特性,需要对工具条窗口的ON_WM_WINDOWPOSCHANGED消息进行处理。这个消息负责CToolBar窗口大小、位置或Z坐标的变化,这里为什么不用WM_SIZE/OnSize来处理窗口大小的改变呢?因为仅当涉及窗口大小改变而不涉及窗口位置也改变时才这样调用,所以当浮动工具条时不一定每次都调用处理WM_SIZE/OnSize。我们可以利用 CControlBar 基类的m_pDockBar成员来调用GetParent()以获取工具条的父窗口。从而改变父窗口的式样——屏蔽系统菜单——来达到我们的目的——去掉“关闭”按钮。
        有了思路,下面来看看具体的实现代码,我们先从CToolBar派生一个新类CToolBarEx,因为我们的目的是在浮动工具条时去掉“关闭”按钮,所以仅仅判断工具条是否浮动就可以了,这一点用CControlBar类的属性判断函数可以做到: BOOL IsFloating() const;      
    在新类中添加一个成员变量,用它表示“关闭”按钮的状态: BOOL m_bMenuRemoved;
    当我们去掉主框架的系统菜单属性时,它的值为TRUE。
    接着,我们需要一个m_pDockBar成员父窗口的指针,以便检查它是否确实为CDockFrameWnd,此时我们用到了 m_pDockBar,用它来判断父窗口类型,注意保证它是一个有效指针。这样我们就可以放心地从CToolBar中去掉系统菜单。下面是处理ON_WM_WINDOWPOSCHANGED消息的代码: void CToolBarEx::OnWindowPosChanged(WINDOWPOS FAR* lpwndpos) 
    {
    CToolBar::OnWindowPosChanged(lpwndpos);

    // should only be called once, when floated.
    if( IsFloating() )
    {
    if( m_pDockBar && !m_bMenuRemoved )
    {
    CWnd* pParent = m_pDockBar->GetParent();
    if( pParent->IsKindOf(RUNTIME_CLASS(CMiniFrameWnd)))
    {
    pParent->ModifyStyle( WS_SYSMENU, 0, 0 );
    m_bMenuRemoved = TRUE;
    }
    }
    }
    else if( m_bMenuRemoved ) {
    m_bMenuRemoved = FALSE;
    }
    }      
    这是我在VCKbase上看到的,你看能不能用?
      

  3.   

    多谢楼上两位,不过还是不行。
    因为我是采用了拆分窗口,将其中一个view放大为全屏时,才动态创建了一个“退出全屏”的浮动工具栏,此时屏幕上除了这一个按钮之外没有其他任何菜单或控件。所以需要在该工具栏创建的时候就设置属性,而不是等到“工具栏被拖动”的消息才来判断是否浮动。
      

  4.   

    要是哪个SB用户点击这个按钮关闭了工具栏,那么就找不到退出全屏的办法了。
    --------------------------------------------------------------------
    那也是不一定要去掉关闭按钮,其他方法用ESC键退出也可以啊!
    处理OnKeyDown消息,判断键值
    if(nChar==VK_ESCAPE)
      ....//退出全屏
      

  5.   

    你也可以直接在创建的时候就指定为浮动的。
    工具条类CToolBar::Create 的调用格式如下:
    BOOL Create( CWnd* pParentWnd, DWORD dwStyle = WS_CHILD | WS_VISIBLE | CBRS_TOP, 
    UINT nID = AFX_IDW_TOOLBAR );其中参数pParentWnd用来确定指向工具条父窗口的指针;参数dwStyle用来确定工具条的风格,其取值如下;参数nID用来确定工具条子窗口的标识符。
    CBRS_TOP 表示工具条在框架窗口的顶部
    CBRS_BOTTOM 表示工具条在框架窗口的底部
    CBRS_NOALIGN 表示工具条在父窗口改变大小时不响应
    CBRS_TOOLTIPS 表示工具条具有动态提示功能
    CBRS_SIZE_DYNAMIC 表示工具条是静态的不能改变
    CBRS_SIZE_FIXED 表示工具条是动态的可以改变
    CBRS_FLOATING 表示工具条是浮动的
    CBRS_FLYBY 表示状态条上显示工具条中按钮的信息 
    CBRS_HIDE_INPLACE 表示工具条隐藏
      

  6.   

    我也是初学者谢谢lixiaosan(小三) 、 laiyiling(最熟悉的陌生人) 当然还有njtlxm (似是故人来) 
      

  7.   

    http://dev.csdn.net/develop/article/12/12038.shtm
    既然你已经指定了浮动属性,上面的判断它也可以满足吧!