C++Builder菜单,工具栏和状态栏
下载
第4章 菜单、工具栏和状态栏
在标准Wi n d o w s应用程序的窗体中,通常要包括菜单栏、工具栏和状态栏,有时还可以
通过右键弹出菜单实现快捷操作。本章的主要内容就是关于如何在应用程序中添加、定制菜
单、工具栏和状态栏,并配以例程加以说明,最后是有关方法与技巧。
4.1 菜单
菜单为Wi n d o w s应用程序和用户之间提供了统一的交互方式,并且操作方便、简单。菜
单有多种样式,比如固定式、下拉式和弹出式等。
通常Wi n d o w s中的菜单由顶层的水平列表项以及分别与各项相连的下拉式...
下载
第4章 菜单、工具栏和状态栏
在标准Wi n d o w s应用程序的窗体中,通常要包括菜单栏、工具栏和状态栏,有时还可以
通过右键弹出菜单实现快捷操作。本章的主要内容就是关于如何在应用程序中添加、定制菜
单、工具栏和状态栏,并配以例程加以
,最后是有关方法与技巧。
4.1 菜单
菜单为Wi n d o w s应用程序和用户之间提供了统一的交互方式,并且操作方便、简单。菜
单有多种样式,比如固定式、下拉式和弹出式等。
通常Wi n d o w s中的菜单由顶层的水平列
项以及分别与各项相连的下拉式菜单所组成,
当用户选择了顶层某个列表项时,就会弹出其相连的菜单——我们称为子菜单。下拉式的子
菜单由多个菜单项组成,可以将多个菜单项进行分组,把相关的菜单项作为一组,组与组之
间以分隔线隔开。菜单项一般可以分成三种情况:一种只是菜单项名称,这种菜单项直接导
致完成某种操作;另一种是菜单项名称后还有省略号,表示选择它将要弹出一个对话框,用
户需要在对话框中做进一步工作;还有一种就是菜单项名称后有一个右箭头,这表示选中它
后又会弹出一个菜单,这样就可以形成多级菜单。
图4-1 典型应用程序(Word 2000)菜单
图4 - 1是一典型的应用程序菜单,一般的菜单项具有下面的一些特征:
第4章 菜单、工具栏和状态栏 135
下载
1. 定义加速键
也就是在菜单的说明文字中有一个带有下划线的字符。这样用户可以用键盘来选择菜单:
对于顶层的菜单,只要同时按下 A l t键和带有下划线的字符键,就会激活该菜单,并弹出其子菜
单;当子菜单弹出后,只要按下其中的某个带下划线的字符键,即可选择该菜单项。
对于英文菜单,可以选择某个具有代表性的字符作为加速键;对于中文菜单,可在说明文
字之后增加一个括号,括号中添加一个具有代表性的字符作为加速键。如果要使某个字符带有
下划线,也就是将相应的字母作为加速键,可以在该字母前加一个 &符号。在同一个子菜单中,
每个菜单项的快捷键不可以一样。
2. 定义快捷键
也就是定义由C t r l、A l t或S h i f t键与某个字符键的组合。比如: C t r l + O组合键通常用来打开文
件。
3. 设置加速按钮和提示图标
如果有些菜单项对应的命令是常用命令,可以考虑在工具栏上创建相应的加速按钮。同时
在该菜单项前添加一个图标,图标应该与相应的加速按钮具有相同的图形标志。
具体在C + + B u i l d e r中,首先设置菜单组件的 I m a g e s属性,指定一个 I m a g e L i s t;然后分别设
置每个菜单项的 I m a g e I n d e x属性即可。
4. 分组或增加分隔条
可以将功能相近的一些菜单项放在一起作为一组,同一子菜单的不同组以分隔条隔开。同
组的菜单项可以作为复选菜单存在 (可以同时将多个菜单项设置为选中方式 ),也可以作为单选菜
单存在 (同时只有一个菜单项可被选中 )。只要将菜单项的 C a p t i o n属性设置为减号“-”,该菜单
项就会以分隔条形式出现了。
5. 多级菜单
将菜单项分组的另一种方法就是制作多级菜单。在菜单编辑器中选中某个菜单项,按下
C t r l +→组合键,就可以方便地添加多级菜单了。
6. 设置菜单的检查状态
可以在设计阶段或运行阶段将某个菜单项的 C h e c k e d属性设置为Tr u e,就在该菜单项的前面
添加了一个勾号或点号;将C h e c k e d属性为F a l s e,则取消勾号或点号。通常,这样的菜单项会和
工具栏中的某个弹起 /按下类型的按钮相关联。并且,检查位图还可以自己指定。
4.1.1 主菜单
通常,在应用程序的标题栏下就是主菜单栏。在主菜单栏中基本上要包括该应用程序中的
所有操作。比如说,对于在窗体中可以通过右键弹出菜单实现的操作,一般在主菜单中也要有
相应的菜单项。
在窗体中添加主菜单也就是添加 M a i n M e n u组件,该组件是 S t a n d a r d组件页中的第二个。在
窗体中添加了M a i n M e n u组件后,双击该组件或在其右键弹出菜单中选择 Menu Designer. . .命令,
将打开菜单编辑器。可以在对象观察器中设置每一项的属性,比如 C a p t i o n属性。设置了一个菜
单项的属性后,在其下面或右面会出现一些新的菜单项。选中这些新的菜单项后可以接着设置
136 第二部分 C + + B u i l d e r编程通用技术
下载
属性,这样就可以创建一个完整的菜单体系了。
注意:
• 要进行菜单项属性的设置和事件处理过程的生成,可以双击菜单组件或通过右键菜单命令
打开菜单编辑器,然后选中具体的菜单项,在对象观察器中进行修改 。
• 在菜单设计窗口中,可以设置菜单的 S h o r t C u t属性,为菜单项设置一个热键。
• 可以在窗体中添加一个 I m a g e L i s t组件,实现对一些图标的管理。然后在窗体 (不是菜单编
辑器窗口 )中选中M a i n M e n u组件,在对象观察器中设置该菜单的 I m a g e属性,与 I m a g e L i s t
组件关联。然后在菜单编辑器中选中具体的菜单项后,在对象观察器中修改 I m a g e I n d e x属
性,就可以在该菜单项前显示 I m a g e L i s t组件中具有相应索引值的图标。另外,在菜单编辑
器窗口中选中某个菜单项,设置对象观察器中的 B i t m a p属性,也可以为该菜单项指定一个
图形。
4.1.2 鼠标右键弹出式菜单
应用程序中的鼠标右键弹出式菜单可以方便用户的操作,灵活性也很好。可以给窗体添加
弹出式菜单,也可以给具体的某个控件添加弹出式菜单。另外,窗体中的某几个组件可以共用
一个弹出式菜单,只要将这几个组件的 P o p u p M e n u属性设置成同一个弹出式菜单的名称就可以
了。
弹出式菜单可以通过 P o p u p M e n u组件实现,该组件位于 S t a n d a r d组件页中的第三个。同
M a i n M e n u组件的设计方法一样,双击 P o p u p M e n u组件或在其上单击鼠标右键,在弹出菜单中选
择Menu Designer. . .命令,打开菜单编辑器。
如果要在某个窗体上实现单击鼠标右键弹出菜单,可以在该窗体上添加弹出式菜单,设计
完毕后,还要在窗体的 P o p u p M e n u属性中选中该弹出式菜单。对于组件来说,也要设置
P o p u p M e n u属性。
4.1.3 使用菜单模板
C + + B u i l d e r中预定义了一些菜单模板(如图 4 - 2),在设计阶段可以方便地利用这些菜单模板
往菜单中添加菜单项,而且添加的菜单项具有统一的风格。
图4-2 预定义菜单模板 图4-3 菜单设计加速菜单
第4章 菜单、工具栏和状态栏 137
下载
1. 使用菜单模板
在设计菜单时,要往菜单中添加菜单模板中定义的菜单项时,可以在菜单编辑器中进行。
双击窗体中的菜单组件或通过右键弹出的菜单命令 Menu Designer. . .,打开菜单编辑器。单击鼠
标右键,弹出菜单设计加速菜单(如图 4 - 3),在弹出菜单中选择 Insert From Te m p l a t e . . .,在接着
出现的 Insert Te m p l a t e对话框中,可以选择需要添加的模板菜单。单击 O K按钮后,则将定义好
的菜单添加到了正在设计的菜单中了。
注意,默认方式下的菜单模板是英文方式,不符合中文风格,还要做进一步的修改。但是
在定义了中文菜单模板后,使用起来就非常方便了。
2. 定制菜单模板
在菜单编辑器中先设计好一个或多个子菜单,单击鼠标右键,选中 Save As Te m p l a t e . . .,将
弹出Save Te m p l a t e对话框,在Template Description项中输入菜单模板的名称,可以使用中文。
单击O K按钮,则当前菜单编辑器中的菜单就作为一个菜单模板而被保存起来,下次设计菜单的
时候就可以重复使用了。
3. 删除菜单模板
在菜单编辑器中单击鼠标右键,选中 Delete Te m p l a t e s . . .命令,将弹出Delete Te m p l a t e s对话
框,在其中选中将要删除的菜单模板,可以在按下 S h i f t键或C t r l键的同时利用鼠标或上、下箭头
键选中多个菜单模板,按下O K按钮,则选中的菜单模板就被删除了。
4.2 工具栏
在工具栏中,通常可以添加按钮 ( B u t t o n )、图形按钮 ( B i t B t n )、加速按钮 ( S p e e d B u t t o n )、组
合框( C o m b o B o x )和编辑框( E d i t )等,通过这些组件可以实现快捷操作。一般来说,在工具栏中可
以实现的快捷操作,在菜单中都应该有对应的命令。
工具栏的实现可以通过To o l B a r、C o o l B a r或C o n t r o l B a r组件与其他组件一起实现。
4.2.1 To o l B a r
在窗体中添加了To o l B a r组件后,A l i g n属性默认设置为a l To p,所以To o l B a r组件默认停靠在
窗体的最上边,并且宽度会自动适应窗体宽度的改变。
To o l B a r组件是Wi n 3 2组件页的第1 6个组件。
选中To o l B a r组件后,可以直接往其中添加其他组件。添加的组件会自动从左向右依次排列,
利用鼠标拖动某个组件可以改变组件排列的位置。注意,往 To o l B a r组件中添加其他组件的时候,
最好先在组件栏中相应的参数上点击一下鼠标左键,然后松开并将鼠标移动到组件栏上,再点
击一下鼠标左键。这时新添加的组件的高度可以适合 To o l B a r组件的高度。
另外,选中To o l B a r组件后,单击鼠标右键,可以通过菜单命令 New Button在组件栏上添加
一个按钮,也可以通过菜单命令 New Separator在组件栏上添加一个间隔。
4.2.2 CoolBar
在窗体中添加了C o o l B a r组件后,A l i g n属性默认设置为a l To p,所以To o l B a r组件默认停靠在
138 第二部分 C + + B u i l d e r编程通用技术
下载
窗体的最上边,并且宽度会自动适应窗体宽度的改变。 默认状态下C o o l B a r的高度大于单个工具
栏的高度。在一个C o o l B a r组件中可以有多个工具栏,并且可以将一个工具栏拖动到另一个工具
栏的后面。
C o o l B a r组件是Wi n 3 2组件页的第1 7个组件。
选中To o l B a r组件后,可以直接往其中添加其他组件。添加的组件会自动形成一个相对独立
的工具栏。比如说,往 C o o l B a r组件中添加一个B u t t o n按钮,则该按钮的宽度会自动适应一个新
添加工具栏的宽度,也就是充满这个新添加的工具栏。这种情况并不是我们所希望的。一般情
况下,在一个工具栏中要添加多个组件,这时我们可以利用容器组件实现上述功能:先往
C o o l B a r组件中添加一个 P a n e l组件,则会自动创建一个新的工具栏;然后选中 P a n e l组件,再往
其中添加其他组件,并调整组件的位置和大小。
工具栏添加好之后,可以对其边框的形状进行设置。对于 C o o l B a r组件,可以设置
B a n d B o r d S t y l e、B o r d Wi d t h、E d g e B o r d e r s、E d g e I n n e r和E d g e O u t e r等。对于P a n e l组件,可以设
置B e v e l I n n e r、B e v e l O u t e r、B o r d S t y l e和B o r d Wi d t h等。
另外,选中C o o l B a r组件后,单击鼠标右键,可以通过菜单命令 Bands Editor. . .打开C o o l B a r
编辑框,并在其中添加、修改工具栏。
注意,如果要精确设置组件的大小,可以在按下 S h i f t键的同时键入上、下、左、右箭头键。
如果要精确调整组件的位置,可以在按下 C t r l键的同时键入上、下、左、右箭头键。
4.2.3 ControlBar
在窗体中添加了C o n t r o l B a r组件后,A l i g n属性默认设置为a l N o n e,所以C o n t r o l B a r组件默认
状态不会停靠在窗体的最上边,因此可以将其 A l i g n属性设置为 a l To p、a l L e f t、a l R i g h t或
a l B o t t o m等,这样C o n t r o l组件就会自动适应窗体尺度的改变,并停靠在某个边界旁边。
C o n t r o l B a r组件是A d d i t i o n a l组件页的第1 3个组件。
选中C o n t r o l B a r组件后,可以直接往其中添加其他组件。添加的组件会自动形成一个相对独
立的工具栏。同C o o l B a r组件一样,可以先往 C o n t r o l B a r组件中添加一个P a n e l组件,则会自动创
建一个新的工具栏;然后选中 P a n e l组件,再往其中添加其他组件,并调整组件的位置和大小。
同样,工具栏添加好之后,可以对其边框的形状、位置特性等进行设置,直到满足需要。
对于C o n t r o l B a r组件,可以设置 A l i g n、A u t o S i z e、B e v e l E d g e、B e v e l I n n e r、B e v e l K i n d、
B e v e l O u t e r和B e v e l Wi d t h等属性。对于 P a n e l组件,可以设置 A l i g n、A u t o S i z e、B e v e l I n n e r、
B e v e l O u t e r、B e v e l Wi d t h、B o r d S t y l e和B o r d Wi d t h等。
4.3 状态栏
在窗体中添加了S t a t u s B a r组件后,A l i g n属性默认设置为a l B o t t o m,所以S t a t u s B a r组件默认
停靠在窗体的最下边,并且宽度会自动适应窗体宽度的改变。在一个 S t a t u s B a r组件中可以有多
个面板。
S t a t u s B a r组件是Wi n 3 2组件页的第1 5个组件。
选中S t a t u s B a r组件后,单击鼠标右键,可以通过菜单命令 Panels Edit...打开状态栏编辑器,
第4章 菜单、工具栏和状态栏 139
下载
并可以添加、修改状态栏中的面板。在状态栏编辑器中,可以设置状态栏中各个面板的显示内
容,面板的宽度等。当然,在程序运行期间,也可以通过代码动态改变各个面板中的内容。
4.4 例程S 0 4 A
例程S 0 4 A实现了简单的点菜功能 (运行结果界面如图4 - 4 )。主要是针对以下的一些内容:
• 主菜单、弹出式菜单的设计制作。
• 工具栏的设计制作、工具栏与菜单的关联等。
• 状态栏的设计制作、状态栏的动态改变等。
图4-4 例程S 0 4 A运行结果界面
下面对例程S 0 4 A实现的功能进行简单说明:
1) 例程的主界面是一个对话框样式的窗体,通过主菜单可以实现点菜的功能,并将点的菜
名列在窗体右边的M e m o组件中。
2) 在窗体中单击鼠标右键,将出现一个弹出式菜单,可以点当天的优惠菜。
3) 窗体上方有一个工具栏,通过点击工具栏上的加速按钮可以实现快速点菜。对于每个加
速按钮,在菜单中都有相应的命令。
4) 在窗体下方有一个状态栏,上面有两个面板。当鼠标在窗体中移动的时候,第一个面板
根据相应的鼠标位置显示对应的信息,比如当鼠标移动到某个加速按钮上时,第一个面板显示
对应菜名的说明;在第二个面板中显示的是当前点过的菜的总价钱。
5) 在窗体中间有两个按钮。通过“点菜完毕 ( F ) . . .”按钮,可以将M e m o组件中已经点的菜输
出打印;通过“重新点菜 ( R )”按钮,可以将 M e m o组件中的内容清空,同时将状态栏中第二个
面板的总价格清为零。
下面就具体实现例程S 0 4 A:
1. 创建工程
通过菜单File | New Application创建一个新的工程,将相关文件都保存在C : \ S a m p l e s \ S 0 4 A中。
2. 窗体设计
以一定的次序往窗体中添加组件,并对其进行修改,调整等。完毕后大致同图 4 - 5。各组件
140 第二部分 C + + B u i l d e r编程通用技术
下载
的属性设置见表4 - 1。
图4-5 例程S 0 4 A的窗体设计结果
表4-1 例程S 0 4 A中各组件的属性设置
N a m e C a p t i o n 其他属性
M a i n M e n u 1 I m a g e s : I m a g e L i s t 1
P o t l u c k 家常菜( & P ) ImageIndex: -1
P o t l u c k _ M u r p h y 青椒土豆丝 ( & P ) ImageIndex: -1
P o t l u c k _ M u r p h y _ B i g 大盘( & B ) . . . ImageIndex: 0; ShortCut: Ctrl+B
P o t l u c k _ M u r p h y _ S m a l l 小盘( & S ) . . . ImageIndex: 1; ShortCut: Ctrl+S
P a l a c e 宫廷菜( & A ) ImageIndex: -1
P a l a c e _ C h i c k e n 麻辣鸡丝( & C ) . . . ImageIndex: 2; ShortCut: Ctrl+C
P a l a c e _ R a d i s h 群英荟萃( & R ) . . . ImageIndex: 3; ShortCut: Ctrl+R
P o p u p M e n u 1
F a v o u r a b l e D i s h 今日优惠菜 ( & E ) . . . ImageIndex: -1
To o l B a r 1 To o l B a r 1 Images: ImageList1
To o l B u t t o n 1 大盘( & B ) . . . MenuItem: Potluck_Murphy_Big;
ImageIndex: 0; Style: tbsButton
To o l B u t t o n 2 小盘( & S ) . . . MenuItem: Potluck_Murphy_Small;
ImageIndex: 1; Style: tbsButton
To o l B u t t o n 3 Style: tbsSeparator
To o l B u t t o n 4 麻辣鸡丝( & C ) . . . MenuItem: Palace_Chicken;
ImageIndex: 2; Style: tbsButton
To o l B u t t o n 5 群英荟萃( & R ) . . . MenuItem: Palace_Radish;
ImageIndex: 3; Style: tbsButton
S t a t u s B a r Align: Bottom
Text: 欢迎光临! (不宰白不宰 )
Width: 300
Text: 总价格: 0元
L a b e l 1 欢迎光临 字体: 幼圆; 字体样式: 粗体;
大小: 初号; 颜色: 红色
B u t t o n 1 点菜完毕( & F ) . . . Default: Tr u e
B u t t o n 2 重新点菜( & R )
L a b e l 2 已经点的菜 ( & Y ) :
m e m o 1 ReadOnly: Tr u e
添加过程如下:
1) 首先往窗体中添加一个M a i n M e n u组件并双击,在菜单编辑器中添加两个子菜单,可用来
点一些家常菜和宫廷菜。最后运行的效果如图 4 - 6所示。
图4-6 通过两个子菜单可以点一些家常菜和宫廷菜
2) 同样,往窗体中添加一个 P o p u p M e n u,双击打开菜单编辑窗口后进行设计。在窗体中,
右键弹出菜单可用来点一个当天的优惠菜。最后运行的效果
如图4 - 7所示。
3) 在窗体中添加一个 I m a g e L i s t组件,双击该组件,并在
弹出的对话框中将制作好的图形或图标添加到图像列表中,
系统会自动为它们生成以零开始的索引值。图像列表中的图形或图标将用在子菜单和工具栏中。
4) 在窗体中添加一个 To o l B a r组件,并在其上单击鼠标右键,通过菜单命令 New Button和
New Separator添加新的按钮和间距。可以在选中按钮的情况下,设置按钮的一些属性,如通过
设置M e n u I t e m属性,可以将具体的按钮与菜单命令联系起来,也就是按下工具栏中的某个按钮
和选中某个菜单命令可以执行同一个事件处理过程,达到同样的效果。
5) 在窗体中添加一个S t a t u s B a r组件并双击,在状态栏编辑器中添加两个面板,并设置属性。
6) 在窗体的左边添加一个L a b e l组件和两个B u t t o n组件,L a b e l组件用来显示“欢迎光临”四
个字,B u t t o n组件用来实现通知点菜完毕和重新点菜的功能。在窗体的右边添加一个 L a b e l组件
和一个M e m o组件,用来显示已经点过的菜。
3. 添加代码
1) 为了在状态栏的第二个面板中显示已点菜的总价格,可以定义一个私有型的 i n t类型的变
量(并在相应的C P P文件中初始化),具体在U n i t 1 . h文件中的T F o r m 1定义中加入以下代码:
/ / in Unit1.h
. . .
p r i v a t e : / / User declarations
int Pr ice; // 总价格
. . .
/ / in Unit1.cpp
void __fastcal l TForm1::FormCreate(TObject *Sender)
{
Price = 0;
}
2) 当在窗体中设置好M a i n M e n u组件后,主菜单就出现在窗体中了。选中某个菜单项并按下
鼠标左键,则焦点自动定位到代码编辑器中,并生成该菜单命令的 O n C l i c k事件的处理过程。另
外,打开菜单编辑器,在对象观察器中也可以添加具体菜单项的 O n C l i c k事件的处理过程。下面
就是添加主菜单和右键弹出菜单中各菜单项的 O n C l i c k事件的处理过程。注意,由于各个过程中
第4章 菜单、工具栏和状态栏 141
下载
图4-7 通过右键弹出菜单可以点一
个当天的优惠菜
的代码比较相似,可以将第一个过程中的代码复制到剪贴板中再粘贴到其他过程中进行修改。
procedure TForm1.Pot luck_Murphy_BigCl ick(Sender: TObject) ;
void __fastcal l TForm1::Pot luck_Murphy_BigCl ick(TObject *Sender)
{
if( MessageDlg("大盘的青椒土豆丝货真价实,包您满意。确定吗 ?",
mtConf irmation, TMsgDlgButtons()<
L i n e s - > A d d ( "大盘的青椒土豆丝") ;
Pr ice = Pr ice+20;
StatusBar1->Panels->Items[1]->Text = "总价格: "+ I n t T o S t r ( P r i c e ) + "元";
} ;
}
void __fastcal l TForm1::Pot luck_Murphy_Smal lCl ick(TObject *Sender)
{
if( MessageDlg("小盘的青椒土豆丝经济实惠,您一定会吃了一盘想两盘,吃了两盘想四盘。确定吗 ?",
mtConf irmation, TMsgDlgButtons()< L i n e s - > A d d ( "小盘的青椒土豆丝") ;
Pr ice = Pr ice+10;
StatusBar1->Panels->Items[1]->Text = "总价格: "+ I n t T o S t r ( P r i c e ) + "元";
} ;
}
void __fastcal l TForm1::Palace_ChickenCl ick(TObject *Sender)
{
if( MessageDlg( "麻辣鸡丝是宫廷名菜,麻辣爽口,鲜香诱人。确定吗 ?",
mtConf irmation, TMsgDlgButtons()< L i n e s - > A d d ( "麻辣鸡丝") ;
Pr ice = Pr ice+80;
StatusBar1->Panels->Items[1]->Text = "总价格: "+ I n t T o S t r ( P r i c e ) + "元";
} ;
}
void __fastcal l TForm1::Palace_RadishCl ick(TObject *Sender)
{
if( MessageDlg("群英荟萃是著名的宫廷名菜,爽口爽心。确定吗 ?",
mtConf irmation, TMsgDlgButtons()< L i n e s - > A d d ( "群英荟萃") ;
Pr ice = Pr ice+70;
StatusBar1->Panels->Items[1]->Text = "总价格: "+ I n t T o S t r ( P r i c e ) + "元";
} ;
}
void __fastcal l TForm1::FavourableDishCl ick(TObject *Sender)
142 第二部分 C + + B u i l d e r编程通用技术
下载
{
StatusBar1->Panels->Items[0]->Text = "优惠价3 8 元";
i f ( MessageDlg("今天的优惠菜是新疆沙湾大盘鸡,好吃看得见。确定吗 ?",
mtConf i rmation, TMsgDlgButtons()< L i n e s - > A d d ( "新疆沙湾大盘鸡") ;
Pr ice = Pr ice+38;
StatusBar1->Panels->Items[1]->Text = "总价格: "+ I n t T o S t r ( P r i c e ) + "元";
} ;
}
3) 当鼠标在工具栏的各个按钮上移动时,最好可以在状态栏的第一个面板中显示相应的提
示信息。可以在工具栏按钮的 O n M o u s e M o v e事件的处理过程中添加一些代码实现上述功能。当
然,还要添加F o r m 1的O n M o u s e M o v e事件的处理过程,当鼠标不在工具栏中时在状态栏中显示
其他的一些信息。
void __fastcal l TForm1::Button1Cl ick(TObject *Sender)
{
M e s s a g e D l g ( "请您稍候,菜马上就好。", mtInformation, TMsgDlgButtons()<Panels->Items[1]->Text = "总价格: "+ I n t T o S t r ( P r i c e ) + "元";
M e m o 1 - > C l e a r ( ) ;
}
/ / - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void __fastcal l TForm1::ToolButton1MouseMove(TObject *Sender,
TShiftState Shift , int X, int Y)
{
StatusBar1->Panels->Items[0]->Text = "大盘的青椒土豆丝仅要2 0 元";
}
/ / - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void __fastcal l TForm1::ToolButton2MouseMove(TObject *Sender,
TShi f tState Shi f t , int X, int Y)
{
StatusBar1->Panels->Items[0]->Text = "小盘的青椒土豆丝仅要1 0 元";
}
/ / - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void __fastcal l TForm1::ToolButton4MouseMove(TObject *Sender,
TShiftState Shift , int X, int Y)
{
StatusBar1->Panels->Items[0]->Text = "麻辣鸡丝可是宫廷名菜,要您老八十,一点儿都不贵";
}
/ / - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void __fastcal l TForm1::ToolButton5MouseMove(TObject *Sender,
TShiftState Shift , int X, int Y)
第4章 菜单、工具栏和状态栏 143
下载
{
StatusBar1->Panels->Items[0]->Text = "7 0 元一盘香脆可口的群英荟萃 ( 其实就是一盘大萝卜 ) ";
}
/ / - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void __fastcal l TForm1::FormMouseMove(TObject *Sender, TShiftState Shi f t ,
int X, int Y)
{
if( Sender==MainMenu1 )
StatusBar1->Panels->Items[0]->Text = "小菜一碟";
e l s e
StatusBar1->Panels->Items[0]->Text = "欢迎光临! ( 不宰白不宰 ) ";
}
4. 编译、链接和运行程序
如果输入正确,程序将正常运行。
有兴趣的读者可以进一步完善上面的例程:
1) 程序一开始运行时,因为没有点菜,所以将“点菜完毕 ( F )”按钮和“重新点菜 ( R )”按钮
变成灰色,禁止使用。当点了菜后,这两个按钮就能使用。
2) 添加B u t t o n 1和B u t t o n 2组件的O n C l i c k事件的处理过程。另外,当按下“重新点菜 ( R )”按
钮后,将M e m o 1组件中的内容清空,将状态栏中的总价格设置为 0,并在最后将“点菜完毕 ( F )”
按钮和“重新点菜 ( R )”按钮变成灰色。
4.5 方法与技巧
4.5.1 动态管理菜单
动态管理菜单主要包括:
• 动态创建菜单。
• 增加、删除菜单项。
• 显示、隐藏菜单项。
• 启用、禁用菜单项。
• 为菜单动态定义快捷键。
下面分别就以上各方面进行说明。
1. 动态创建菜单
动态地创建菜单需要做以下工作:
• 创建子菜单。
• 为每个子菜单创建菜单项。
• 设置菜单项的属性。
• 定义菜单命令的事件处理过程。
下面的例程S 0 4 B不仅对以上内容进行了说明,而且还包含了以下内容:
• 在菜单中设置竖向分隔条
144 第二部分 C + + B u i l d e r编程通用技术
下载
• 通过按钮激活弹出式菜单
具体实现过程如下:
1) 通过菜单File | New Application创建一个新的工程。
2) 在窗体中添加三个B u t t o n组件,C a p t i o n属性分别设置为“创建主菜单 ( & M )”、“创建弹出
式菜单( & P )”和“显示弹出式菜单 ( & S )”。
3) 在U n i t . h头文件中增加下面的包含语句:
. . .
#include
#include
. . .
4) 在U n i t 1 . h头文件中定义T F o r m 1类的私有数据成员变量:
. . .
p r i v a t e : / / User declarat ions
TMainMenu *MyMainMenu; // 主菜单( 有3个下拉子菜单 )
TPopupMenu *MyPopupMenu; // 弹出菜单
TMenuItem *MySubItems[5]; // 第一个下拉子菜单的子菜单项 ( 5个)
TMenuItem *MyPopupItems[4] ; // 弹出菜单的子菜单项 ( 4个)
. . .
5) 定义菜单命令的事件处理过程。
首先在U n i t 1 . h头文件中声明T F o r m 1类的成员函数M y P o p u p H a n d l e r:
_ _ p u b l i s h e d : / / IDE-managed Components
TButton *Button1;
TButton *Button2;
TButton *Button3;
// 菜单命令的事件处理过程
void __fastcal l MyPopupHandler(TObject* Sender) ;
. . .
然后手工在U n i t 1 . c p p文件中对成员函数M y P o p u p H a n d l e r时间定义,定义过程体如下:
// 菜单命令的事件处理过程
void __fastcal l TForm1::MyPopupHandler(TObject* Sender)
{
i f ( Sender->ClassNameIs("T M e n u I t e m ") )
// 在信息对话框中显示选中菜单项的 C a p t i o n 属性
ShowMessage(((TMenuItem*)Sender)->Caption);
}
6) 添加B u t t o n 1组件、B u t t o n 2组件和B u t t o n 3组件的O n C l i c k事件的处理过程如下:
void __fastcal l TForm1::Button1Cl ick(TObject *Sender)
{
int i;
TMenuItem *MyItem[3];
MyMainMenu = new TMainMenu(this) ;
第4章 菜单、工具栏和状态栏 145
下载
146 第二部分 C + + B u i l d e r编程通用技术
下载
// 创建三个子菜单
for( i=0; i<3; i++ )
{
MyItem[i] = new TMenuItem(this) ;
MyItem[i]->Caption = "主菜单"+ I n t T o S t r ( i ) + "( & "+ I n t T o S t r ( i ) + ") ";
M y M a i n M e n u - > I t e m s - > A d d ( M y I t e m [ i ] ) ;
}
for( i=0; i<5; i++ )
{
MySubItems[i ] = new TMenuItem(this) ;
M ySubItems[i] ->Caption = "子菜单项"+ I n t T o S t r ( i ) + "( & "+ I n t T o S t r ( i + 1 ) + ") ";
M y M a i n M e n u - > I t e m s - > I t e m s [ 0 ] - > A d d ( M y S u b I t e m s [ i ] ) ;
// 指定菜单项的O n C l i c k 事件的处理过程
MySubItems[i] ->OnCl ick = MyPopupHandler;
}
// 将第2个菜单项设置为分隔条
MySubItems[1]->Caption = “- ”;
// 设置竖向分隔条
MySubItems[3]->Break = mbBarBreak;
}
/ / - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void __fastcal l TForm1::Button2Cl ick(TObject *Sender)
{
int i ;
MyPopupMenu = new TPopupMenu(this) ;
for( i=0; i<4; i++ )
{
MyPopupItems[ i ] = new TMenuItem(this) ;
// 设置菜单项的C a p t i o n 属性
MyPopupItems[i] ->Caption = "弹出菜单项"+IntToStr(i)+ "( & "+ IntToStr( i+1)+ ") ";
M y P o p u p M e n u - > I t e m s - > A d d ( M y P o p u p I t e m s [ i ] ) ;
// 指定菜单项的O n C l i c k 事件的处理过程
MyPopupItems[i] ->OnCl ick = MyPopupHandler;
}
}
/ / - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void __fastcal l TForm1::Button3Cl ick(TObject *Sender)
{
// 通过按钮激活弹出式菜单
i f ( MyPopupMenu!=NULL )
MyPopupMenu->Popup(Form1->Left+60, Form1->Top+60);
}
7) 编译、链接并运行程序。依次按下三个按钮,测试效果
2. 增加、删除菜单项
动态增加菜单项可以使用 T M e n u I t e m类的A d d或I n s e r t成员函数。在例程S 0 4 B中我们已经使
用了A d d函数。
1) Add 使用A d d函数,在当前菜单(T M a i n M e n u或T P o p u p M e n u类对象)的尾部增加一个
菜单项。函数原型如下:
void __fastcal l Add(TMenuItem* I tem);
void __fastcal l Add(TMenuItem* const * AItems, const int AItems_Size);
可以看出,A d d函数有两种形式,可以用单个菜单项作为参数;也可用一个菜单项数组作为
参数,同时指定需增加菜单项在该数组中的索引号。
2) Insert 使用I n s e r t函数,在当前菜单的指定位置(序号)增加一个菜单项。函数原型如
下:
HIDESBASE void __fastcal l Insert( int Index, TMenuItem* I tem);
3. 显示、隐藏菜单项
通过改变菜单项的Vi s i b l e属性来实现。如果需要显示该菜单项,则设置 Vi s i b l e属性为t r u e;
否则,将其设置为 f a l s e即可。
具体的实现请见例程S 0 4 C中的B u t t o n 2的O n C l i c k事件响应函数:
void __fastcal l TForm1::Button2Cl ick(TObject *Sender)
{
if( New1->Vis ible )
New1->Visible = false; // 将N e w 菜单项隐藏
e l s e
New1->Visible = true; // 将N e w 菜单项显示
}
4. 启用、禁用菜单项
通过改变菜单项的E n a b l e d属性来实现。如果需要启用该菜单项,则设置 E n a b l e d属性为t r u e,
这样该菜单项就能使用了;否则,将其设置为 f a l s e即可。一般表现形式为菜单项变灰。
具体的实现请见例程S 0 4 C中的B u t t o n 3的O n C l i c k事件响应函数:
void __fastcal l TForm1::Button3Cl ick(TObject *Sender)
{
if( New1->Enabled )
New1->Enabled = false; // 将N e w 菜单项变成灰色
e l s e
New1->Enabled = true; // 将N e w 菜单项使能
}
5. 为菜单动态定义快捷键
有时,在一些程序的设置项中,需要动态地定义热键,这样可以使用户有更大的灵活性。
下面以一个简单的例程S 0 4 C对动态定义菜单的热键进行说明:
1) 通过菜单File | New Application创建一个新的工程。
2) 在窗体中添加一个M a i n M e n u组件,并在菜单编辑器中为其添加一个 F i l e子菜单,然后在
子菜单中增加一个N e w菜单项,C a p t i o n属性设置为“& N e w. . .”。
3) 在窗体中添加一个 H o t K e y组件(Wi n 3 2组件页的第九个组件),再添加一个B u t t o n组件,
第4章 菜单、工具栏和状态栏 147
下载
148 第二部分 C + + B u i l d e r编程通用技术
下载
并为其生成O n C l i c k事件的处理过程:
void __fastcal l TForm1::Button1Cl ick(TObject *Sender)
{
New1->ShortCut = HotKey1->HotKey; / / 指定N e w 菜单项的热键
}
4) 编译、链接并运行程序。改变 H o t K e y组件中的热键定义,并按下 B u t t o n 1按钮,查看主菜
单中N e w菜单项的快捷键定义。
4.5.2 定制系统菜单
通常在应用程序的主窗体中,利用鼠标左键点击左上角的图标,会弹出一个菜单,称之为
“系统菜单”(如图4 - 8)。
在窗体中并没有系统菜单对应的组件,
所以有时我们需要定制系统菜单时就比较麻
烦。具体可以通过下面的步骤实现:
• 在系统菜单上添加所需的菜单项。
• 为新添加的菜单项定义 O n C l i c k事件
的处理过程。
下面的例程 S 0 4 D中,在系统菜单中添
加了一个“前端显示 ( A )”菜单项,通过该菜单项,可以使窗体始终显示在最前端或为普通窗体
模式。具体实现过程如下:
1) 通过菜单File | New Application创建一个新的工程。
2) 添加窗体F o r m 1的O n C r e a t e事件的处理过程如下:
void __fastcal l TForm1::FormCreate(TObject *Sender)
{
// 设置系统菜单
AppendMenu(GetSystemMenu(Hand le , fa l se ) , MF_
本文档为【C++Builder菜单,工具栏和状态栏】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑,
图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。