在Visual C++自动生成的MFC框架应用程序中,当浮动工具条被拖离主框架窗口后,一般都会在工具条的右上角有一个"关闭"按钮,应该说这个按钮完全是按照 Windows应用程序的用户界面(UI)设计规范而设计的,也就是说所有的窗口都应该有一个地方让用户可以关闭这个窗口。但是有的开发人员偏偏提出来不 想要这个"关闭"按钮。本实例通过自定一个扩展的工具条类,实现了删除工具条中"关闭"按钮的目的。程序编译运行后的界面效果如图一所示:

80ACB1C0919DE455B50AF20519E0A3D2.jpg
图一、没有"关闭"按钮的浮动工具条
  一、实现方法

   首先,针对删除工具条上"关闭"按钮的问题我们来确定一下实现的思路,因为我们要实现的功能与工具条有关,所以涉及的类肯定与 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,用它来判断父窗口类型是否是CMiniFrameWnd,该类代表了浮动工具条周围的框架窗口。经过上述处理后,我们就可以放心地 从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;
 }
}

  二、编程步骤

  1、 启动Visual C++6.0,生成一个单文档视图结构的应用程序,将程序命名为"FltTBClsBtn";

  2、 使用Class Wizard在项目中添加一个新类CtoolBarEx,其基类选择为CToolBar;

  3、 在CMainFrme类中将成员变量m_wndToolBar的类型修改为CtoolBarEx;

  4、 添加代码,编译运行程序。

  三、程序代码

/
// ToolBarEx.h : header file
#ifndef __TOOLBAREX_H__
#define __TOOLBAREX_H__
#if _MSC_VER >= 1000
#pragma once
#endif // _MSC_VER >= 1000

class CToolBarEx : public CToolBar
{
 DECLARE_DYNAMIC(CToolBarEx)
 // Construction
 public:
  CToolBarEx();
  // Attributes
 protected:
  BOOL m_bMenuRemoved;
  // Operations
 public:
  // Overrides
  // ClassWizard generated virtual function overrides
  //{{AFX_VIRTUAL(CToolBarEx)
  //}}AFX_VIRTUAL
  // Implementation
 public:
  virtual ~CToolBarEx();
  // Generated message map functions
 protected:
  //{{AFX_MSG(CToolBarEx)
   afx_msg void OnWindowPosChanged(WINDOWPOS FAR* lpwndpos);
  //}}AFX_MSG
  DECLARE_MESSAGE_MAP()
};
#endif // __TOOLBAREX_H__

ToolBarEx.cpp : implementation file
#include "StdAfx.h"
#include "ToolBarEx.h"
#include
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

CToolBarEx::CToolBarEx()
{
 // TODO: add construction code here.
 m_bMenuRemoved = FALSE;
}

CToolBarEx::~CToolBarEx()
{
 // TODO: add destruction code here.
}

IMPLEMENT_DYNAMIC(CToolBarEx, CToolBar)
BEGIN_MESSAGE_MAP(CToolBarEx, CToolBar)
//{{AFX_MSG_MAP(CToolBarEx)
ON_WM_WINDOWPOSCHANGED()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()

// CToolBarEx message handlers

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;
 }
}
  四、小结

  本实例通过一个自定义类,处理Windows中窗口位置变化消息,实现了删除浮动工具条上"关闭"按钮的目的,在上述过程中,最主要的工作还是判断当前窗口的父窗口是否为浮动工具条的框架窗口类-CMiniFrameWnd类。

转载于:https://www.cnblogs.com/todd/archive/2005/08/10/211587.html

VC++删除浮动工具条中“关闭”按钮相关推荐

  1. 金蝶云标准版 单张凭证无法反过账,反过账按钮在工具条中不显示

    7.5版本已在凭证查询列表添加过账和反过账按钮,需要进入BOS设计器设置可见性. [操作步骤] 1.依次进入[BOS设计器]→[财务会计]→[总账]选择凭证扩展. 2.右下方属性中找到[列表菜单]进入 ...

  2. CToolBar工具条控制方法

    所 谓工具条就是具有位图和分隔符组成的一组命令按钮,位图按钮部分可以是下推按钮.检查盒按钮.无线按 钮等.工具条对象类派生于主窗口架框类CframeWnd或CMDIFrameWnd,其类控制CTool ...

  3. 13_MFC工具条和状态栏

    MFC工具条和状态栏 Windows控制窗口 Windows (Windows95或者以上版本) 提供了系列通用控制窗口,其中包括工具条(ToolBar).状态栏(StatusBar).工具条提示窗口 ...

  4. MFC 教程【13_MFC工具条和状态栏 】

    MFC工具条和状态栏 Windows控制窗口 Windows (Windows95或者以上版本) 提供了系列通用控制窗口,其中包括工具条(ToolBar).状态栏(StatusBar).工具条提示窗口 ...

  5. MFC的工具条和状态栏

     Windows控制窗口 Windows (Windows95或者以上版本) 提供了系列通用控制窗口,其中包括工具条(ToolBar).状态栏(StatusBar).工具条提示窗口(ToolTip ...

  6. arcgis mxt模板 创建工具条无法保存_【从零开始学GIS】ArcGIS中的绘图基本操作(二)...

    大家好,我是肝教程肝到熊猫眼的三三. 本系列教程的发布,受到了很多同学的鼓励,大家在后台或微信上表达出对教程的喜爱,这便是更新教程的最大动力. 上回教程讲解了"GIS基本操作".& ...

  7. 怎么将arcgis新建工具条如何保存_ArcGIS中寻找最短路径的方法

    1 流程图  将两个道路数据统一坐标系,然后合并建立数据集,将未联通的道路路线进行结合,对接便后的道路数据集构建网络,使用追踪分析查找两点间最短路径,流程图如图1-1所示. 图1-1 流程图 2 操作 ...

  8. VC6中工具条的新特色

      加入时间:01-1-8 下午 09:10:32 在Visual C++ 版本6中工具条的新特色 作者: Dave Schmitt 微软在www.microsoft.com/visualc已经推出V ...

  9. VC6中工具条的新特色 (转)

    VC6中工具条的新特色 (转)[@more@] VC6中工具条的新特色 加入时间:01-1-8 下午 09:10:32 在Visual C++ 版本6中工具条的新特色 作者: Dave Schmitt ...

最新文章

  1. define的多行定义
  2. 让vs中网站的sln文件使用相对路径的办法
  3. Java中PreparedStatement和Statement的用法区别
  4. 开始认真学习Android了
  5. golang错误处理机制(异常处理)
  6. FastReport人民币大写转换
  7. Ext Ajax:如何调用Ext.Ajax.request方法和使用Java Servlet进行处理
  8. Metropolis Hastings MCMC when the proposal and target have differing support
  9. ●BZOJ 2393 Cirno的完美算数教室
  10. H3C GRE over IPSec配置(comware v7)
  11. python 修改文件名 修改日期_python实现批量修改文件名
  12. LitJson扩展基础类型
  13. 上位机与下位机进行交互
  14. BMP(DIB)图片格式
  15. 共焦显微镜技术原理、参数及其应用
  16. 计算机中常用的数学知识
  17. 插入字符到指定字符数组中指定位置
  18. WinSockAPI
  19. Linux 之pureftp 的部署和优化
  20. Unity使用Package Manager管理自定义插件

热门文章

  1. 《Linux高性能服务器编程》——2.4 IP路由
  2. 《Nmap渗透测试指南》—第6章6.6节源端口欺骗
  3. Linux内存调试工具初探-MEMWATCH
  4. iphone 如何成功的把three20成功的添加到xcode中去。
  5. LeetCode 5382. HTML 实体解析器
  6. LeetCode 5380. 数组中的字符串匹配
  7. 利用gensim在simulink中建立神经网络模型
  8. Harris角点检测和Shi-Tomasi角点检测
  9. python判断奇数偶数
  10. python encodings模块_python-ImportError:没有名为“ encodings”的模块