目录

前言

一、菜单、工具栏与状态栏

1.1 菜单

1.1.1  菜单的类型

1.1.2  编辑菜单

1.1.3  建立消息映射

1.1.4  菜单的有效控制

1.1.5  快捷菜单

1.1.6  创建动态菜单

1.1.7  创建基于对话框的菜单

1.2 工具栏

1.2.1  编辑工具栏

1.2.2  建立消息映射

1.2.3  自定义工具栏的操作

1.3 状态栏

1.3.1  状态栏类的继承关系

1.3.2 状态栏类的成员函数

1.3.3 状态栏操作

总结


前言

本篇文章介绍菜单、工具栏与状态栏


一、菜单、工具栏与状态栏

1.1 菜单

1.1.1  菜单的类型

常见菜单有3:主菜单、弹出菜单和快捷菜单

1.主菜单

指出现在应用程序主窗口或最上层窗口的菜单。通常对应有一个弹出菜单作为它的子菜单。

2.弹出菜单

         指选择主菜单或一个菜单项时弹出的子菜单

3.快捷菜单

右击某个界面对象时,通常会弹出快捷菜单,它出现在鼠标箭头的位置,快速展示当前对象可用的命令功能

菜单设计一般需要经过下面两步:

(1) 使用菜单编辑器编辑菜单资源;

(2) 使用ClassWizard进行消息映射,编辑成员函数,完成菜单所要实现的功能。

1.1.2  编辑菜单

使用菜单编辑器来编辑菜单资源。双击ResourceView视图中的Menu菜单资源,打开菜单编辑器。

1.插入新菜单项

  • 在当前空白菜单项位置插入--选定窗口中的空白菜单项后按回车键(或双击空白菜单项),系统弹出菜单属性对话框。
  • 在某菜单项前插入--选中该菜单项并按Ins键,再双击该空白菜单项进行编辑。

2.属性对话框的设置

用于输入菜单项的标识符(ID)标题(Caption)和菜单项在状态栏上显示的提示(Prompt)信息等

3.调整菜单项位置

选中某菜单项将其拖至适当位置。

4.删除菜单项

用鼠标单击菜单项或用上、下、左、右光标键选择菜单项,然后单击Cut按钮或按Del键删除。

1.1.3  建立消息映射

在上例中仅添加了菜单,并没有实现菜单的功能,即没有对应的命令处理函数与菜单项对应,因此,添加的菜单项是灰色的,即处于当前不可用状态

         添加新的菜单项后,还应该为菜单项指定一个处理函数,即利用ClassWizard类向导添加一个消息处理函数。

1.1.4  菜单的有效控制

一般情况下,菜单项都不止一种状态。

例如,在没有选择任何内容时,Edit菜单下的CopyCut等菜单项是无效的(灰色显示)。有时,我们还会看到,在菜单项旁边可能还会有检查标记,表示它是选中的还是不选中的。比如,在Word的视图菜单项下,当用户选用网格线标尺时,相应菜单项前会出现一个

MFC通过消息映射机制和CCmdUI类更新菜单项的显示

在类向导ClassWizardMessage Map标签中,如果选择一个菜单ID,在Messages列表框中就会出现以下两项: 

COMMAND

UPDATE_COMMAND_UI

其中UPDATE_COMMAND_UI是更新命令用户接口消息,专门用于处理菜单项和工具条按钮的更新。

1.1.5  快捷菜单

为应用程序创建快捷菜单主要有以下两种方法。

1.使用Component Gallery创建快捷菜单

Component Gallery(组件画廊)是一个组件库,它保存着可以共享或重用的代码。这些代码包括由Visual C++自带的组件和从用户工程中增加到Gallery中去的用户自定义组件。

1.1.6  创建动态菜单

动态创建菜单分为以下3个步骤。

(1) 利用CreateMenu( )函数创建一个空的弹出式菜单,该函数的原型为: 

HMENU CreateMenu()

该函数没有参数,它的返回值是一个菜单句柄。

(2) 调用AppendMenu( )InsertMenu( )函数在菜单中加入菜单项。

(3) 调用函数SetMenu( )加载动态菜单。

1.1.7  创建基于对话框的菜单

从MFC的内容可知,利用MFC AppWizard[exe]向导工具可以生成基于对话框的应用程序。

基于对话框的应用程序在运行时并没有菜单栏。

    下面我们通过实例来讨论如何给它创建一个菜单。

1.2 工具栏

MFC中,工具栏的功能由类CToolBar实现。工具栏资源和工具栏类CToolBar是工具栏的两个要素。创建工具栏的基本步骤是:

  1. 创建工具栏资源;
  2. 构建一个CToolBar对象;
  3. 调用CToolBar::Create( )CreateEx( )函数创建工具栏窗口;
  4. 调用CToolBar::LoadToolBar载入工具栏资源。

1.2.1  编辑工具栏

使用工具栏编辑器来编辑工具栏资源。双击ResourceView视图中的Toolbar工具栏资源,即可打开工具栏编辑器。

1.添加按钮

双击工具条上的空白按钮或单击空白按钮后,选择【View|Properties】菜单项,弹出如图所示的Toolbar Button Properties属性对话框,在此对话框中编辑按钮的标识符、宽度与高度值。

2.删除按钮

将按钮拖出工具栏外,即可删除该按钮。

3.编辑按钮位图

设置按钮位图有以下两种方法。

  1. 利用绘图工具与调色板直接进行绘制
  2. 先利用专用绘图软件制作,然后粘贴到按钮上

1.2.2  建立消息映射

通常,只需让一个按钮的ID值与同样功能菜单项的ID值相同即可。

        如果按钮没有对应菜单项,则必须利用ClassWizard类向导添加一个消息处理函数。

1.2.3  自定义工具栏的操作

向导生成的标准工具栏的ID值为IDR_MAINFRAME。        对一些功能复杂的应用程序,需要创建多个不同的工具栏。生成工具栏的基本步骤:

       (1)添加工具栏资源

2)参照MFC应用程序框架添加工具栏的方法,构造一个CToolBar类的对象,调用CToolBar::Create( )CreateEx( )函数创建工具栏窗口;

3)调用CToolBar::LoadToolBar( )函数载入工具栏资源。

1.创建工具栏窗口

调用CToolBar::Create( )CreateEx( )函数创建并初始化工具栏窗口对象。若创建成功,函数返回TRUE,否则返回FALSE

2.装载工具栏资源

调用LoadToolBar( )函数装载工具栏资源。用Create( )或者CreateEx( )函数创建工具栏,其实只是获得了一个窗口句柄,工具栏窗口中位图按钮的加载是靠LoadToolBar( )函数来完成的。若加载成功,将返回TRUE,否则返回FALSE

3.设置工具栏风格

如果在调用初始化函数CToolBar::Create( )或者CreateEx( )时设置的工具栏风格不满足需要,可以再用SetBarStyle( )函数重新进行设置。

4.设置工具栏停靠特性

设置工具栏停靠特性,需要调用EnableDocking( )函数。既要调用CControlBar:: EnableDocking( )函数设置工具栏的停靠特性,还要调用框架类的成员函数EnableDocking( )函数来设置框架窗口以允许它的子窗口控制栏可以以何种方式停靠。不管一个框架窗口中有多少个子窗口控制栏,该函数只需调用一次。

5. 设置工具栏的初始停靠位置

通过调用CFrameWnd::DockControlBar( )函数定位一个工具栏的初始停靠位置。

6.移动工具栏

调用CFrameWnd::FloatControlBar( )函数来移动、定位一个工具栏。

7. 工具栏隐显控制

通过对函数CWnd::SetStyle( )的调用可以改变某些工具栏窗口的风格,但该函数不能改变WS_VISIBLE,只能通过父类CWndShowWindow( )成员函数来显示或隐藏工具栏。

1.3 状态栏

状态栏实际上是一个窗口,一般分为几个窗格,每个窗格显示不同的信息。

使用AppWizard创建的单文档应用程序,接受默认选项时,生成的应用程序自动创建带有默认窗格的状态栏。

1.3.1  状态栏类的继承关系

MFC中,状态栏的功能由CStatusBar类实现。

1.3.2 状态栏类的成员函数

1.3.3 状态栏操作

利用MFC AppWizard向导创建应用程序时,首先在CMainFrame类中定义一个成员变量m_wndStatusBar,它是状态栏类CStatusBar的对象。其次在MFC应用程序框架的实现文件MainFrm.cpp中,为状态栏定义一个静态数组indicators,如下所示: 

static UINT indicators[ ]=
{ID_SEPARATOR,            //显示命令功能提示ID_INDICATOR_CAPS,      //显示大写锁定键状态ID_INDICATOR_NUM,    //显示数字锁定键状态ID_INDICATOR_SCRL,   //显示滚动锁定键状态
};

这个全局的提示符数组indicators中的每个元素代表状态栏上一个窗格的ID值,这些ID在应用程序的串表资源String Table中进行了说明。

         通过增加新的ID标识来增加用于显示状态信息的窗格。状态栏显示的内容由数组indicators决定,需要在状态栏中显示的各窗格的标识符、位置以及个数也由该数组决定,状态栏显示的内容是可以修改的。

最后CWnd::Create( )函数以主框架窗口为父窗口创建状态栏,创建后默认停靠在主框架窗口的底部。CWnd::SetIndicators(indicators,sizeof(indicators)/sizeof(UINT))函数将创建后的状态栏分隔为sizeof(indicators)/sizeof(UINT)个窗格,窗格的ID分别为indicators数组中的元素值。

一个应用程序只有一个状态栏,所以对状态栏的操作主要是对状态栏上窗格的操作。

为了把一个窗格添加到默认的状态栏中,一般要完成下列步骤:

  1. 为新建窗格创建一个命令ID和默认字符串;
  2. 将该窗格的命令ID添加到状态栏的静态数组indicators中;
  3. 为该窗格创建一个命令更新处理程序。

总结

机会就像坐公交车,有人上车早,有人上车晚,有人直达车,有人要转车。只要你有决心去目的地,一定可以找到自己的路线!

VC++程序设计与应用--菜单、工具栏与状态栏相关推荐

  1. C语言菜单工具栏在哪里,[c语言-菜单工具栏与状态栏.ppt

    [c语言-菜单工具栏与状态栏 第 6 章 菜单.工具栏与状态栏 参数nflags的含义 Evaluation only. Created with Aspose.Slides for .NET 3.5 ...

  2. c语言菜单栏隐藏,c语言-菜单工具栏与状态栏.ppt

    c语言-菜单工具栏与状态栏 第 6 章 菜单.工具栏与状态栏 参数nflags的含义 岂绩护围汞囊昌懦禁埠逼虫墒帅称惦尊瘫饿剿栏弧历置烂宣茵卑沃琉姐钻c语言-菜单工具栏与状态栏c语言-菜单工具栏与状态 ...

  3. 【Qt】菜单栏、工具栏、状态栏、右键菜单的实现

    在QMainWidget基础上实现菜单栏.工具栏.状态栏.右键菜单. 头文件: #ifndef GWDEMO_H #define GWDEMO_H#include <QMainWindow> ...

  4. 第四章 菜单、工具栏和状态栏(第8课)

    第8课:菜单.工具栏和状态栏 概述: 三者都是界面元素:Windows文档应用程序框架的界面元素 三者是框架窗口的组成部分 MFC中,用框架窗口类CMainFrame来控制这些框架界面元素→三者的基本 ...

  5. MFC应用的菜单,工具栏和状态栏(vs2019)

    继续MFC的应用学习记录: 这次是菜单,工具栏,状态栏这三个功能实现: 第一步还是创建基于单文档的应用程序: 创建好后,打开资源视图: 功能1:菜单 在资源视图中找到Menu,打开ID_MAINFRA ...

  6. 南京工程学院C++/VC程序设计大作业

    南京工程学院C++/VC程序设计大作业 源码下载 链接:源码下载链接 提取码:1111 学生成绩输入及统计分析 模拟自动取款机 C++/VC程序设计大作业任务书 一.课外大作业要求: 1.每人从附件1 ...

  7. python界面不同按钮实现不同功能-三、PyQt5不同方法创建菜单栏、工具栏和状态栏...

    创建菜单栏.工具栏和状态栏可以直接通过代码实现,也可以通过Qt Designer中的属性编辑器等实现.通过两种方法的学习可以加深理解,更好的掌握PyQt5. 一.菜单栏与状态栏 状态栏的设置比较简单, ...

  8. 菜单工具栏wxPython菜单与工具栏基础示例

    这两天一直在学习菜单工具栏之类的问题,上午正好有机会和大家讨论一下. 1.基本的api介绍 Package wx :: Class Menu Type Menu Method Summary Menu ...

  9. Qt学习三 - 菜单栏、工具栏、状态栏

    MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow) {ui->setupUi( ...

  10. python没有上方工具栏_PyQt5快速上手基础篇8-菜单栏、工具栏和状态栏

    前言 本节我们学习使用Qt Designer设计菜单栏.工具栏和状态栏,并完成一个串口工具的界面设计,在接下来教程中,我们将逐步实现一个串口调试助手,并详细介绍相关的其他知识点. 一.基础知识 1.菜 ...

最新文章

  1. 关于从Image字段读取图片流并显示在PictureBox控件时报‘参数无效’异常的解决方法...
  2. Android开机logo修改方法
  3. php怎么从文件中读取数据库连接,PHP连接 读取 写入mysql数据库的方法 附常用代码...
  4. oracle 代码 字段映射,将ORACLE TIMESTAMP(9)字段映射到java.util.Date
  5. AES加密 — 详解
  6. 数平精准推荐 | OCR技术之系统篇
  7. 两个数据库表同步的可视化WEB同步程序
  8. Spring Boot学习总结(7)——SpringBoot之于Spring优势
  9. python re 简单实例_python的re正则表达式实例代码
  10. 【2031】求一元三次方程的解
  11. python 安装包时出现:SyntaxError: invalid syntax
  12. excel文件修复工具_Excel文件打开后出错,部分内容丢失的修复技巧
  13. java--------------
  14. java并发机制_Java并发机制的底层实现原理.PDF
  15. Docker神器之百度云下载(群辉 LEDE)
  16. go语言爬虫解析html,Python爬虫【如何爬取内容(html)和解析内容】-Go语言中文社区...
  17. 1.3读论文笔记:M. Raissi a等人的Physics-informed neural networks:A deep learning framework for solving forw..
  18. HTML哪个单位是角度,css 角度单位有哪些?
  19. ASM安装和sqlplus管理
  20. Mac Chrome 访问证书有问题的https网站时无法忽略风险继续浏览

热门文章

  1. OSPF详解(六)特殊区域类型
  2. vue防止用户恶意点击按钮
  3. 用cpolar发布Ubuntu上的网页(2)
  4. C语言每日一练——第50天:八进制转十进制
  5. ORA-1652: unable to extend temp segment by 128 in tablespace TEMP解决
  6. OA系统高性能解决方案(史上最全的通达OA系统优化方案)
  7. Jenkins之工作流程原理
  8. Oracle 、SqlServer 根据日期逐日、逐月递增累加、逐行累加
  9. Android Logcat输出为何能自动换行输出的原因以及多\n的作用
  10. 爆炒猪肚的做法 爆炒猪肚怎样炒才脆