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

2016-01-29 12:04 75 1 收藏

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

【 tulaoshi.com - C语言心得技巧 】

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


作者/NorthTibet

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com)

下载源代码

    在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;}}      
下图是最终的运行结果图:


图二

来源:https://www.tulaoshi.com/n/20160129/1484515.html

延伸阅读
标签: 电脑入门
浮动工具栏是Word2010中一项极具人性化的功能,当Word2010文档中的文字处于选中状态时,如果用户将鼠标指针移到被选中文字的右侧位置,将会出现一个半透明状态的浮动工具栏。该工具栏中包含了常用的设置文字格式的命令,如设置字体、字号、颜色、居中对齐等命令。将鼠标指针移动到浮动工具栏上将使这些命令完全显示,进而可以方便地设置文字格...
现在,有许多软件安装后会在IE浏览器的工具条上添加一个自定义按钮,为用户运行程序提供了方便,如“网络蚂蚁”、“金山词霸2000”等等。实际上添加这个自定义按钮并不难,只要找到了它在注册表中的位置和有关参数,通过手工或程序都可以轻易完成。而最方便的办法就是调用现成的ActiveX控件来完成这个功能,但Windows似乎没有提供这种控件。下面...
PrivateDeclareFunctionGetSystemMenuLib"User32"(ByValhwndAsLong,ByValbRevertAsLong)AsLong PrivateDeclareFunctionRemoveMenuLib"User32"(ByValhMenuAsLong,ByValnPositionAsLong,ByValwFlagsAsLong)AsLong PrivateDeclareFunctionDrawMenuBarLib"User32"(ByValhwndAsLong)AsLong PrivateDeclareFunctionGetMenuItemCountLib"Us...
增加一个真彩的位图,IDB_BITMAP1 在Frame头文件中定义一个变量:CBitmap m_ToolbarBMP; 把.cpp中的LoadToolBar(...)去掉,加上如下代码: m_ToolbarBMP.LoadBitmap(IDB_BITMAP1); m_wndToolBar.SetBitmap(m_ToolbarBMP); UINT IDArray[] = {ID_FILE_NEW, ID_FILE_NEW, ID_FILE_NEW}; m_wndToolBar.SetButtons(IDArray, 3);...
  <html <head <meta http-equiv="Content-Language" content="zh-cn" <meta http-equiv="Content-Type" content="text/html; charset=gb2312" <title仿Office 2003的工具条</title <script /*---------- 舜子制作 Menu Javascript Made by PuterJam E-mail:puterjam@etang.com -------------*/  var listnum=...

经验教程

639

收藏

49
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部