当前位置: 首页 > 图文教程 > 开发语言 > VC++ > 如何去掉浮动工具条中的“关闭”按钮

VC++
关于内联汇编的几个技巧
const使用详解
为什么要在operator=中返回*this的引用
如何在派生类中的隐藏基类的虚拟重载函数?
C++指针使用方法解惑
如何用编程获取CD-ROM的驱动器盘符?
声明函数指针并实现回调
定义函数对象
在名字空间中声明类和成员函数
自制性能测试类
为什么operator=操作符返回引用
单实例设计模式的实现
初始化类对象
C++编程杂谈之三:面向对象(续)
C++编程杂谈之二:面向对象
C++编程杂谈之一:编译器
解析动态联编(上篇) - 作者:tingya
解析动态联编(下篇) - 作者:tingya
创建和访问环境变量
在预先定义的内存位置构造一个对象

VC++ 中的 如何去掉浮动工具条中的“关闭”按钮


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-10-30   浏览: 112 ::
收藏到网摘: n/a

如何去掉浮动工具条中的“关闭”按钮


作者/NorthTibet

下载源代码

    在C++/MFC框架应用程序里,当浮动工具条被拖离主窗口后,一般都有一个“关闭”按钮,如图一所示:


图一 

    本来这个按钮完全是按照Windows应用程序的UI设计规范而设计的,也就是说所有的窗口都应该有一个地方让用户可以关闭这个窗口。但是有的用户提出来不想要这个“关闭”按钮。既然用户有这种需要,那么我们就想办法实现吧......
    首先,我们来确定实现的思路,因为我们要实现的功能与工具条有关,所以涉及的类肯定与 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;	}} 
下图是最终的运行结果图:


图二