在VB中制作图标按钮的四种方法
2010-07-19 17:31
发信人: huanghm (东方不败), 信区: Program
标 题: VB 中图标按钮的制作
发信站: 深大荔园晨风站 (Tue Jan 13 11:11:08 1998), 转信
现在大多数Windows应用程序的功能都比较丰富,相应的菜单结
构也比较复杂。一些操作命令往往要打开好几层菜单。尤其是一些
常用的操作命令,因其使用较频繁,即使仅打开一层菜单,从中选择
一项也是比较麻烦的。因此现在绝大多数Windows应用程序中除了菜
单之外,还配备了工具栏。工具栏中有与常用菜单命令相对应的按
钮,按这些按钮的效果和选择菜单命令的效果完全一样。工具栏中
的按钮和普通按钮不同的是,它们不用文本字符串,而是用图标来
标明按钮的功能。这种图标按钮的好处是省地方,菜单命令往往比
较冗长,而工具栏提供的空间又十分有限。使用图标按钮最大的好
处还在于其直观形象性,这与Windows图形用户界面(GUI)方便用
户、简化操作的目标是一致的。
Windows系统提供的标准按钮(如OK、Cancel等)中只能显示文本
字符串。在VisualBasic(以下简称为VB)中,按钮是使用工具箱中的命
令按钮控件CommandButton来实现的。CommandButton使用的是Windows系
统提供的标准按钮控件,因而无法装入图标。下面介绍在VB中实现
图标按钮的几种方法。
一、使用标准控件实现图标按钮
VB的标准控件中,能够装入图形的只有Image(图像)
和PictureBox(图片框)两种。Image的功能较简单,占用系统资源较
少。PictureBox的功能很丰富,可以将它看作是Image的一个“超集”,
它占用的系统资源当然就要多一些。为了利用可装入图形的控件模
拟图标按钮的功能,首先应比较一下它们各自所能够接收到的事
件(如表1所示)。
表1中打勾(√)的表示该控件提供了相应的事件驱动过程接口,
打叉(×)的则表示该控件没有提供,控件不接收相应的事件。因为
是要模拟CommandButton的功能,所以Image和PictureBox的其它事件没有
列出。
CommandButton的事件ImagePictureBox
Click√√
DragDrop√√
KeyDown×√
KeyPress×√
KeyUp×√
LostFocus×√
MouseDown√√
MouseMove√√
MouseUp√√
表1Image和PictureBox与CommandButton中相同的事件
从表1中可以看出,PictureBox具有CommandButton中所有事件的接
口,因而可以完全模拟CommandButton的功能。CommandButton的某些事
件在Image中接收不到。对于一般应用来说,我们往往只
对CommandButton的Click事件过程编程,因此Image也可以用于模
拟CommandButton,而且能够满足大多数应用的需要。注意,在没有配
备鼠标的系统中,因为只能使用键盘作为输入设备,而Image又没有
键盘事件的接口,这时就只能用PictureBox了。
VB安装到硬盘上之后,在VB目录下提供了丰富的图形库。其中包
括位图(Bitmap,在BITMAPS子目录下)、图标(Icon,在ICONS子目录
下)和图元(Metafile,在METAFILE子目录下)。每种图形又按类分别
存储在不同的子目录下。在图标按钮的制作中,我们可以使
用BITMAPS\TOOLBAR3子目录下的位图。该目录中存储了常用工具栏
中的按钮的位图,每种按钮一般有三个位图文件,分别对应按钮在
松开、按下和无效时的状态。例如,CUT-UP.BMP、CUT-MDS.BMP
和CUT-DIS.BMP分别对应剪切(cut)按钮在松开、按下和无效时的状
态。因此,我们可让按钮在松开时装入*-UP.BMP,按下时装
入*-MDS.BMP,按钮无效时装入*-DIS.BMP。可以编写如下的相应事件
过程代码(以PictureBox实现的剪切按钮为例):
SubPicture1_MouseDown(ButtonAsInteger,ShiftAsInteger,XAsSingle,YAs
Single)
Picture1.Picture=LoadPicture("C:\VB\BIT-MAPS\TOOLBAR3\CUT-MDS.BMP")
'按下鼠标按钮时,装入按钮被按下时的位图
EndSub
SubPicture1_MouseUp(ButtonAsInteger,ShiftAsInteger,XAsSingle,YAs
Single)
Picture1.Picture=LoadPicture("C:\VB\BITMAPS\TOOLBAR3\CUT-UP.BMP")
'松开鼠标按钮时,装入按钮被松开时的位图
EndSub
SubPicture1_Click()
'此处插入单击按钮时的处理代码
EndSub
如果需要设置按钮的无效状态,则可使用如下语句:
Picture1.Enabled=False
Picture1.Picture=LoadPicture("C:\VB\BIT-MAPS\TOOLBAR3\CUT-DIS.BMP")
'装入按钮无效时的位图
当按钮恢复为有效时,再使用下列语句:
Picture1.Enabled=True
Picture1.Picture=LoadPicture("C:\VB\BITMAPS\TOOLBAR3\CUT-UP.BMP")
'装入按钮松开时的位图
这样,我们就实现了用PictureBox模拟图标按钮。用Image模拟图标
按钮的方法与此完全相同。在程序中,一般用一个PictureBox作为工具
条,这里的PictureBox作为容器(container)控件,在PictureBox中再加入各
个图标按钮。这在多文档界面(MDI)中的主窗体MDIForm上尤其有必
要,因为普通控件不能直接加入到MDIForm中,只有具备Align属性
的PictureBox才能加入到MDIForm。
二、使用扩充控件实现图标按钮
VB的扩充控件中有几种能直接支持图标的按钮。下面仅介绍其
中的三种扩充按钮,即3D命令钮(3DCommandButton)、3D组按钮(3D
GroupPushButton)和动画按钮(AnimatedButton)。使用这三种控件制
作图标按钮比起使用PictureBox或Image模拟的图标按钮要方便得多。在
下面的介绍中,会给出每种控件对应的文件名和控件的对象类型,
如果在工具箱中不到该控件,则在VB的菜单命令弹出的
对话框中双击与该控件对应的文件名(一般在Windows的SYSTEM目录
下),即可将该控件加入到工具箱中。
对于扩充控件接口的特性(属性、事件和方法),我们仅介绍其
扩充的部分,与标准控件相同的其它接口则不再赘述。
1、3DCommandButton
文件名为THREED.VBX,对象类型为SSCommand,属性如表2所示。
表2
属性数据类型定义
AutoSizeInteger0--(缺省状态)不调整尺寸;
1--把装入的图片尺寸调整为按钮的大小。如果装入的图片是
一个图标(Icon)或按钮本身有标题,则该值不起作用;
2--把按钮的尺寸调整为装入图片的大小。如果按钮本身有标
题,则该值不起作用。
BevelWidthInteger按钮周围斜角的宽度,取值范围为0~10,缺省值
为2。
Font3DInteger设置标题的立体显示效果:
0--(缺省状态)无立体效果;
1--略微凸出;
2--强烈凸出;
3--略微凹进;
4--强烈凹进。
OutlineInteger确定有无边框,取值为True(缺省状态)或False。
PictureInteger位图或图标,不能是图元。
RoundedCornersInteger按钮是否为圆角,取值为True(缺省状态)
或False。
3DCommandButton的属性
3DCommandButton是一个本身具有Picture属性的按钮,用它可装入
一个图片,同时它还具有按钮的功能。3DCommandButton不能接
收MouseDown和MouseUp之类的鼠标事件,因此不能像PictureBox那样通
过装入不同的图片来显示按钮被按下和松开的状态。3DCommand
Button之所以被称为“3D”,是因为它本身能够处理按钮按动时的三
维视觉效果。用3DCommandButton制作图标按钮时,只需装入一个按钮
松开时的图片(例如,CUT-UP.BMP)即可,其余的无需用户操心。
2、3DGroupPushButton
文件名为THREED.VBX,对象类型为SSRibbon,属性如表3所示。
属性数据类型定义
AutoSizeInteger0——(缺省状态)不调整尺寸;1——把装入的图片
尺寸调整为按钮的大小;2——把按钮的尺寸调整为装入图片的大
小。
BevelWidthInteger按钮周围斜角的宽度,取值范围为0~2(缺省状
态)。
GroupAllowAllUpInteger是否允许同组内的所有按钮都处于松开的状
态。取值为True(缺省状态)或False。当设置组中一个按钮
的GroupAllowAllUp属性值时,本组其它按钮的GroupAllowAllUp属性也被
自动设置为相同的值。
GroupNumberInteger组号。取值为:0——不属于任何组,可由用户
或程序代码任意开关;1(缺省状态)~99--按钮属于该组号定义的
逻辑组。若在处于同一逻辑组的所有按钮中按下某个按钮时,则另
外处于按下状态的按钮会被自动松开。
OutlineInteger同3DCommandButton。
PictureDisabledInteger按钮被禁止(Enabled属性为False)时的位图。
PictureDnInteger按钮被按下时的位图。
PictureDnChangeInteger如果没有指定PictureDn,如何由PictureUp变换
出PictureDn:0——PictureUp不变;1——(缺省状态)抖动PictureUp。
把PictureUp位图中与BackColor颜相同的点每隔一个变成白,这样就
产生了将该颜加亮的效果;2——将PictureUp位图取反。
PictureUpInteger按钮松开时的位图。
RoundedCornersInteger同3DCommandButton。
3DGroupPushButton的属性要比3DCommandButton丰富些,一旦我们
在设计阶段把按钮各种状态时的位图加载好,在程序中就可不必理
会它了。如果图形库中只有按钮松开时的位图,没有按钮按下时的
位图,则还可以利用PictureDnChange属性来加以弥补。3DGroupPush
Button的另一个引人注目的特性是它能够对多个按钮进行逻辑分组和
自动控制,这一点无疑在实际应用中增添了更多的功能和更大的灵
活性。
3DGroupPushButton是自锁式的,即按动后保持按下状态,而不是
随鼠标键的松开而弹起。要想让按钮重新弹起,还需再按一次,这同
录音机上的暂停键相似。如果要让3DGroupPushButton表现得和普通按
钮一样,随鼠标键的松开而弹起,则需对Click事件进行编程。3DGroup
PushButton的Click事件过程与普通按钮稍有不同,其中增加了一个整
型参数Value:
SubGroupPush3D_Click(ValueAsInteger)
array在vb什么意思啊Value可取值为True或False,分别代表按钮的状态是按下还是松
开,3DGroupPushButton的Value属性与此相对应。若在Click事件过程中
加入语句:GroupPush3D.Value=False,则可让3DGroupPushButton表现得
和普通按钮一样,随鼠标键的松开而弹起。
3、AnimatedButton
文件名为ANIBUTON.VBX,对象类型为AniPushButton,属性如表4所
示。
属性数据类型定义
CCBfileLoadString调出文件中存储的图像和按钮属性信息。
CCBfileSaveString把图像和按钮属性信息存入文件。
ClearFirstInteger确定按钮切换到下一帧前是否清掉前一帧,取值
为True或False。
ClickFilterInteger确定按钮的哪部分能检测到鼠标单击:0--(缺省
状态)按钮的任何部位都能检测到鼠标单击;1--鼠标单击必须位
于标题文本上或图像框中才能被检测到;2--鼠标单击必须位于实
际的图像框中才能被检测到;3--鼠标单击必须位于标题文本上才
能被检测到。
CycleInteger控制动画的播放周期:0--(缺省状态)用户按动按
钮时播放动画的前半部分,按钮松开时播放后半部分,最后回到第
一帧;1--松开按钮时跳到下一帧,同时把Value属性值加1。如果按
钮处于最后一帧,单击时则跳回第一帧。这是每次播放一帧的多态
按钮;2--第一次单击按钮时,播放动画的前半部分,同时把Value属
性值从1变为2;再次单击按钮时,播放后半部分,按钮回到第一帧,
同时把Value属性从2变回1。因此,这是一种二态按钮。
FrameInteger设置当前帧。
HideFocusBoxInteger是否隐藏表示输入焦点的虚线框,取值为True
或False(缺省状态)。
PictDrawModeInteger设置图像(位图或图标)在按钮中的绘画方式
:0--(缺省状态)用PictureXpos和PictureYpos属性值确定图像的位
置,用TextPosition属性控制标题的位置。这些属性用0~100的标尺来控
制X和Y的位置;1--自动控制尺寸模式,按钮尺寸调整到能放下最
大图像或标题;2--调整图像的尺寸,扩展或压缩图像框以适应按
钮的尺寸。这时标题(如果有的话)总是显示在按钮的顶部(好
像Text-Position属性为0一样)。
PictureInteger同Form、PictureBox等。
PictureXposInteger控制按钮中图像的水平位置,取值为0~100。
PictureYposInteger控制按钮中图像的垂直位置,取值为0~100。
SpecialOpInteger触发一个特殊操作,当该属性取某个值时,该操作
被触发。取值为:1--模拟单击;其它值--无效。
SpeedInteger设置间的延迟时间(毫秒)。取值范围为0(缺省状
态)~32767。
TextPositionInteger确定标题的位置,同时也会影响图像的位置。取
值为:0--(缺省状态)标题位置由TextXpos和TextYpos确定,图像位
置由PictDrawMode、PictureXpos和PictureYpos确定;1--图像在左边,标
题在右边,标题的垂直坐标由TextYpos确定;2--图像在右边,标题
在左边,标题的垂直坐标由Text-Ypos确定;3--图像在下边,标题在
上边,标题的水平坐标由TextXpos确定;4--图像在上边,标题在下
边,标题的水平坐标由TextXpos确定。
TextXposInteger确定标题的水平位置。
TextYposInteger确定标题的垂直位置。
ValueInteger指示二态或多态按钮的状态。
与3DCommandButton和3DGroupPushButton相比,AnimatedButton要复
杂得多。当然,AnimatedButton提供的功能也要多得多。首先,Animated
Button可以存储多幅画面并以动画的形式连续播放,当然这对于我们
实现工具栏中的二态(按下和松开)图标按钮是绰绰有余了。其
次,AnimatedButton可以让标题和图像共存而互不影响,不像3D
CommandButton中标题与图像会相互重叠,结果一个也看不清。3D
GroupPushButton中则根本没有提供标题属性。另外,AnimatedButton还
允许我们定义鼠标单击的有效范围,这也是非常好的一项功能扩
充。
三、结束语
以上我们介绍了在VB中制作图标按钮的四种方法。其中以使
用PictureBox或Image模拟的方法最为常见(VB提供的多文档界面的示例
程序VB\SAMPLES\MDI\MD-INOTE.MAK中用的就是这种方法),而后三种
分别使用扩充控件3DCommandButton、3DGroupPushButton或Animated
Button实现图标按钮的方法则很少见到。但后三种扩充控件是专门开
发的,因而使用起来更方便些,特别是当每种扩充控件均有其独到
的特性和功能时尤其如此。
--
来源:.深大荔园晨风站 bbs.szu.edu.[FROM: 202.192.140.151]
bbs.szu.edu/bbsanc.php?path=%2Fgroups%2FGROUP_2%2FProgram%2Fvb%2FM.884660849.A

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。