显示或者隐藏工具栏和状态栏

这里讨论显示或者隐藏工具栏、状态栏的操作,以及工具栏、状态栏被显示/隐藏时,相关的两个菜单项ID_VIEW_STATUS_BAR、ID_VIEW_TOOLBAR的状态更新。这两个菜单命令及对应的状态更新命令是标准命令消息所包含的。MFC边框窗口实现了菜单命令消息的处理和菜单项状态的更新。

CFrameWnd提供了OnBarCheck来响应与ID_VIEW_STATUS_BAR、ID_VIEW_TOOLBAR菜单项对应的命令。

消息映射:

ON_COMMAND_EX(ID_VIEW_STATUS_BAR, OnBarCheck)

ON_COMMAND_EX(ID_VIEW_TOOLBAR, OnBarCheck)

这里,使用了扩展命令消息映射宏把ID_VIEW_STATUS_BAR和ID_VIEW_TOOLBAR命令映射给同一个函数OnBarCheck处理。

OnBarCheck函数的实现:

BOOL CFrameWnd::OnBarCheck(UINT nID)

{

ASSERT(ID_VIEW_STATUS_BAR == AFX_IDW_STATUS_BAR);

ASSERT(ID_VIEW_TOOLBAR == AFX_IDW_TOOLBAR);

//得到工具条或者状态条

CControlBar* pBar = GetControlBar(nID);

if (pBar != NULL)

{

//若控制条可见,则隐藏它;否则,显示它

ShowControlBar(pBar, (pBar->GetStyle() & WS_VISIBLE) == 0, FALSE);

//处理完毕

return TRUE;

}

//可以让下一个命令目标继续处理

return FALSE;

}

由于是扩展映射宏定义的消息处理函数,所以OnBarCheck函数有一个UINT类型的参数和一个BOOL返回值。

当用户从“View”菜单选择打了钩的“Toolbar”时,消息处理函数OnBarCheck被调用,参数就是菜单项的ID号ID_VIEW_TOOLBAR,它等于工具条的子窗口IDAFX_IDW_TOOLBAR。处理结果,工具条被隐藏;当再次选择该菜单项则工具条被显示。

处理状态条的过程类似于工具条的处理。

ShowControlBar是CFrameWnd的成员函数,参数1表示控制条对象指针,参数2表示显示(TRUE)或者隐藏(FALSE),参数3表示是立即显示(FALSE)或者延迟显示(TRUE)。

如果工具条或者状态条被隐藏,则相应的菜单项ID_VIEW_STATUS_BAR 或者ID_VIEW_TOOLBAR 变成uncheked(菜单项被标记为没有选择),否则,checked(菜单项被标记选择)。CFrameWnd实现了这两个菜单项的状态更新处理,列举其中一个如下:

声明处理ID_VIEW_TOOLBAR的状态更新消息:

ON_UPDATE_COMMAND_UI(ID_VIEW_TOOLBAR, OnUpdateControlBarMenu)

函数的实现:

void CFrameWnd::OnUpdateControlBarMenu(CCmdUI* pCmdUI)

{

ASSERT(ID_VIEW_STATUS_BAR ==

AFX_IDW_STATUS_BAR);

ASSERT(ID_VIEW_TOOLBAR == AFX_IDW_TOOLBAR);

CControlBar* pBar = GetControlBar(pCmdUI->m_nID);

//存在工具栏

if (pBar != NULL)

{

//工具条窗口被显示则checked,被隐藏则uncheked

pCmdUI->SetCheck((pBar->GetStyle() & WS_VISIBLE) != 0);

return;

}

pCmdUI->ContinueRouting();

}

GetControlBar是CFrameWnd的成员函数,用来返回边框窗口的指定ID的控制条对象(指定ID是控制条的子窗口ID)。

泊位和漂浮

工具条可以泊位在边框窗口的任一边(上、下、左、右),或者漂浮在屏幕上的任何地方。

实现泊位的方法

首先,边框窗口调用CFrameWnd::EnableDocking函数使控制条泊位在边框窗口中有效,指明在边框窗口的哪边接受泊位。如果想在任何边都可以泊位,则使用参数CBRS_ALIGN_ANY。

然后,工具条调用ControlBar::EnableDocking使泊位对工具条有效,如果在调用ControlBar::EnableDocking时指定的泊位目的边和边框窗口能够泊位的边不符合,那么工具条不能泊位,它将漂浮。

最后,边框窗口调用CFrameWnd::DockControlBar泊位工具条。

泊位后形成窗口层次关系

边框窗口、泊位条、工具条的包含关系如下:

边框窗口

泊位条1

工具条1

工具条2

泊位条2

边框窗口包含1到4个泊位条子窗口,每个泊位条包含若干个控制条子窗口。

泊位的实现

CFrameWnd::EnableDocking指定哪边接受泊位,则为泊位准备一个泊位条。泊位条用CDockBar描述,派生于CControlBar。如果指定任何边都可以泊位,则创建四个CDockBar对象和对应的HWND窗口。然后,调用ControlBar::EnableDocking在对应的泊位条内安置工具条。

MFC设计了CDockBar类和CFrameWnd的一些函数来实现泊位,具体代码实现在此不作详细讨论。

实现漂浮工具条的方法:

边框窗口调用FloatControlBar实现工具条的漂浮。

漂浮的实现:

首先,创建一个微型漂浮边框窗口,该边框窗口有一个泊位条。

然后,在微型边框窗口的泊位条内放置工具条。

MFC设计了微型边框类CMiniFrameWnd,在此基础上派生出微型泊位边框窗口类CMiniDockFrameWnd。CMiniDockFrameWnd增加了一个CDockBar类型成员变量m_wndDockBar,即泊位条。

在CMiniDockFrameWnd对象被创建时,创建泊位条m_wndDockBar。泊位条m_wndDockBar的父窗口如同CMiniDockFrameWnd的父窗口一样,是调用FloatControlBar的边框窗口,而不是微型泊位边框窗口。微型边框窗口和泊位条创建完成之后,调用ControlBar::DockControlBar泊位工具条在CMiniDockFrameWnd窗口。

文章出处:DIY部落(http://www.diybl.com/course/3_program/c++/cppjs/200834/102726_10.html)

VC 显示 隐藏 工具栏 状态栏相关推荐

  1. Eclipse自定义设置显示隐藏工具栏toolbar

    Eclipse通过此方法可以自定义设置显示隐藏工具栏toolbar. 具体案例如下: 在Java Perspective界面解决消失的debug工具栏: 打开Window ->Customize ...

  2. 工具栏,状态栏(VC_MFC)

    目录 工具栏 状态栏 (本章节中例子都是用 VS2005 编译调试的) 工具栏 [对话框][单/多文档] 相关类:     CToolBar   ,  CToolBarCtrl   对话框 相关函数: ...

  3. html 状态栏显示,网页屏蔽状态栏 打开的网页怎么隐藏浏览器的状态栏

    打开网页,状态栏不显示怎么办 网页浏览器的状态栏不见了怎么弄出来? 答;在网页浏览器里最上端,"查看"菜单下点击工具栏,勾选状态栏它就出来了 .如果还不行,那就试试重置IE浏览器. ...

  4. setSystemUiVisibility() 与 getSystemUiVisibility() 显示隐藏状态栏

    Android  4.4  Camera 源码里面有一个操作界面的方法: [java] view plaincopy /** * If {@param visible} is false, this  ...

  5. Android全屏显示隐藏状态栏

    1,概论 工作中经常需要用到全屏的页面,还要隐藏系统状态栏或沉浸式 2,设置全屏 2.1,设置有代码中设置,也有Mainfest.xml中设置theme 2.2,要是全局生效就在application ...

  6. echarts工具栏增加自定义按钮显示隐藏其他按钮(更多操作)

    项目中遇到一个需求,要求再echarts toolbox工具栏增加自定义按钮来隐藏显示其他按钮,因为此部分资料较少,耗了不少时间,这里分享给大家. 效果图: 其实关键的就是改变按钮属性后要重新渲染一次 ...

  7. android输入法隐藏状态栏,android 输入法设置显示隐藏

    Android是一个针对触摸屏专门设计的操作系统,当点击编辑框,系统自动为用户弹出软键盘,以便用户进行输入. 那么,弹出软键盘后必然会造成原有布局高度的减少,那么系统应该如何来处理布局的减少?我们能否 ...

  8. 如何将word中的对象怎么显示到工具栏_职场必备!Word实用技巧最全总结(五)...

    1. 用目录快速定位 目录通常是长文档不可缺少的部分,有了目录,阅读者就能很容易地知道文档中有什么内容,如何查找这些内容.下面介绍使用内部标题样式创建目录的方法: 1.单击要建立目录的地方,通常是文档 ...

  9. excel中显示隐藏的行_在Excel中显示或隐藏用户提示

    excel中显示隐藏的行 When you set up a worksheet for other people to use, data validation messages can help ...

最新文章

  1. 【AI战略】2019年美国国家人工智能战略报告(中文翻译版)
  2. 【信息抽取】介绍一种端到端的关系抽取方法
  3. bat 启动 不弹出对话框_CAD中转换出的PDF文件模糊要怎么办
  4. 手把手教学,平衡小车详细教程,平衡车
  5. 算法与数据结构(六):堆排序
  6. 微软SQLHelper.cs类 中文版
  7. Commons-Collections4 集合工具类的使用(一):集合操作
  8. 单片机蜂鸣器编程音乐_单片机系统硬件调试方法
  9. 【springmvc】传值的几种方式postman接口测试
  10. 关于微信服务号使用百度地图获取定位不准问题
  11. “1+7+N”改革工作体系介绍
  12. 关于sigmoid函数几点介绍
  13. caution: filename not matched:xxx
  14. Java - GC是什么?为什么要有GC?
  15. r导入txt乱码_R中导入excel乱码的解决办法
  16. 破解帐户后,黑客重现如何榨干用户的最终价值
  17. SincNet 原始波形的说话人识别
  18. 本地文件上传FTP或远程目录
  19. 极智AI | 全场景算力产品矩阵 看算能系列AI产品
  20. accept的阻塞与非阻塞

热门文章

  1. 什么是DCS系统?DCS和SCADA的区别
  2. 全国计算机三级网络技术电子版,全国计算机三级网络技术最新版笔试电子教材(完全免费版).doc...
  3. 基于asp.net181艺术品在线交易系统
  4. 求1!+2!+...+10!的值
  5. 希望计算机专业都知道这些优质比赛
  6. [MSDN版本][32bit/64bit]Windows 2003 R2 With Sp2[中/英][标准/企业/数据中心]
  7. 怎么定义电子商务,电子商务这个词是如何进入大众视线的?
  8. 【转】深入理解 TLB 原理
  9. linux查看某个nas盘io,nas(网络附加存储)与san知识解释
  10. 基于MATLAB的说话人识别系统