VC++程序设计与应用--菜单工具栏与状态栏

Posted Abro.

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了VC++程序设计与应用--菜单工具栏与状态栏相关的知识,希望对你有一定的参考价值。

目录

前言

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

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++程序设计与应用--菜单工具栏与状态栏的主要内容,如果未能解决你的问题,请参考以下文章

在VC 中工具栏的隐藏与显示

转在VC中实现程序不在任务栏显示按钮, 标题栏与菜单栏的不显示

PyQt界面编程应用与实践

PyQt5应用与实践

PyQt5不同方法创建菜单栏工具栏和状态栏

在PyQt中构建 Python 菜单栏菜单和工具栏