在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小时内删除。
发表评论