《多媒体软件设计技术》课件第4章_第1页
《多媒体软件设计技术》课件第4章_第2页
《多媒体软件设计技术》课件第4章_第3页
《多媒体软件设计技术》课件第4章_第4页
《多媒体软件设计技术》课件第4章_第5页
已阅读5页,还剩140页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

4.1多媒体图形用户界面4.2利用VisualBasic开发图形的应用本章小结练习四4.1.1多媒体图形用户界面的特点

首先,我们介绍图形用户界面的基本内容。

图形用户界面专门用来代表以图形方式工作的窗口(Window)、图标(Icon)、菜单(Menu)、按钮(Button)、滚动条(ScrollBar)、对话框(DialogBox)等界面部件,也包括能够移动、定位、点取图形目标的定位设备的界面。4.1多媒体图形用户界面多媒体图形用户界面是在图形用户界面的基础上,再加上一些其他媒体(如多媒体音频、视频、动画等)的特性。

多媒体图形用户界面的主要特点有:

(1)广泛使用窗口、图标、菜单、按钮、对话框等基本界面部件来表示应用目标。这些图形目标的表示都具有直观、形象、可视等特点。其中,图标是表示把一个应用程序缩到最小时所代表的程序内部功能、动作的可视图形(或图像)符号。

(2)使用图形部件形象地表示感兴趣的目标,使系统完成的操作或命令能用逼真的模拟、比喻来表示,而且所有感兴趣的目标在GUI界面上被连续显示出来。例如,用文件夹表示磁盘目录,用户可以对文件夹进行打开、取某一文件(看其内容)、处理文件(检索、删除、拷贝、搬移)等操作,所有这些操作目标可用图视比喻方式完成。例如,在WindowsXP中,把文件夹里的文件拖到表示回收站的废纸框中,则隐喻完成对该文件的删除操作;如移到表示打印机的目标中,则隐喻完成对该文件的打印。

(3)有高度的交互性,每一输入动作被直接解析。动作的结果可以是文字、声音、图像、视频或动画等多媒体表现形式,并可以立即反馈给用户。而对于其他交互方式,要等到全部输入完成后才能被系统解析,并产生系统响应。

(4)支持鼠标类定位设备完成光标的移动和目标的选取。因此,只要操纵鼠标器或按下按钮,即可代替文本界面方式中的复杂的语法和命令键入。显然,在GUI方式下的识别和点取目标比命令方式下的记住和键入命令要容易和快速得多。

(5)提供了快速的、增量式的、可逆转的操纵,并且所有操纵过程及效果是可观察到的。例如光标移动,窗口的扩大和缩小,菜单的查找和点取(如点取菜单项后颜色反相显示)等都是立即发生和可见的。

(6)以一致方式完成对所有目标的显示和操纵。例如,只要将光标移动到所需目标(图标或按钮)上并单击,即可完成目标的选取。一致的显示和操纵方式减少了用户的记忆、学习负担及出错率,也有利于标准化人机界面的构成。

(7)提供系统预验证功能,使得只有有效的交互才能发生效果。如果用户指向一个对象的动作对当前的任务是无意义的,则显示屏上就无反应。例如,对不是数据输入域的目标区输入字符,则不会产生任何反应与结果,除非该字符定义了某种命令。

(8)提供了对用户出错的保护机制和强有力的帮助机制。GUI界面使用比喻来模拟日常操作方式,所以易学易用,本身不易出错,并且一旦出错,结果可立即显示;而且用户操作是可恢复的,即具备Undo功能。这些功能将减少用户对可能错误的担心,使用户把精力集中在任务上。此外,强有力的帮助机制可以帮助用户正确操纵和使用系统。

GUI界面因具备以上特点而很受各类用户所喜爱。对各类用户而言,仅需经过观看系统运行的演示,就能很快学会使用系统的基本功能。GUI界面的易理解、易学、易用性,操作及其结果的可视化,错误操作的可恢复性等都可以减少用户的焦虑和疑惑,使用户更有信心、更有效地使用系统。因此,GUI界面出现后,立即广泛应用于多媒体可视化工具、屏幕编辑器、图形浏览器、视频游戏、CAD/CAM、数据库系统等领域。4.1.2多媒体软件中图标的应用

鉴于图标表示实体具有直观、形象、逼真等特点,所以在日常生活及工程技术中早就被广泛使用,如路标图、气象图、地图等。应该说,电子游戏机能让儿童不必受训即可操作也得益于图标的使用。图标除了作为表示实体的符号外,还可以作为可视按钮或菜单选择项,当被选中激活时,可以完成指定的功能。

1.图标的基本概念和工作原理

图标(icon)是可视的表示实体信息的简洁、抽象的符号。例如,用经过良好设计的逼真形象来代表动作或命令实体,可以给人提供迅速、直观理解信息的有力工具。图4-1给出了一些对象类的图标表示的例子。图4-1图标实例

在图4-1所示图标中,(a)表示唱歌,(b)表示合作,(c)表示邮件,(d)表示电话,(e)表示帮助,(f)表示三角形,(g)表示预算表,(h)表示不许复制的行为。其中(a)、(b)、(c)、(d)、(f)是具体的图标,因为它们很类似于实际的图像;而(e)、(g)、(h)是抽象地表示对象。

对于抽象对象类,较难于采用和目标直接相似的符号来表示其实体与概念,这时可用比喻的方法来抽象地表示。当使用图标表示目标的含义不够明确时,可以在图标上加上必要的文字说明,如图4-1中的(g)、(h)。图标的基本工作原理是基于选取和启动操作。也就是说,可以把显示在屏幕上的图标作为可由操作者识别的目标,通过移动定位光标点中相应图标,再按相应按键进行选取,便能触发并执行相应的应用功能。在这一过程中,有时为了避免给出错误命令而产生不可复原的动作(如文件删除)的危险性,可加入检验和确认的做法,只有经确认的操作才会被

执行。

2.图标的设计

为使图标能表达确定对象的信息,必须对图标进行设计。我们建议按以下原则进行图标的设计:

(1)图标中的图形应逼真于目标形状,只要可能,应该尽量避免抽象,使人们可以快速、准确地识别图标。

(2)不同的目标必须使用不同的图标表示,以避免引起混淆。如果仅使用图形表示目标的含义不够清楚、明确,则可以在图标中附加上简要的文本说明,以明确图标的含义。

(3)设计图标应尽可能简单,尽量符合常规的表达习惯,不同的图标之间应该有一定程度的区别。

(4)适当设置图标的尺寸,在能够表示实体对象的情况下,图标宜小一些为好,以减少图标所占用的内存空间及显示空间。但是,如果要表示复杂对象,则可以使用较大尺寸的图标,但是在同一系统中使用的图标应有一致的图像尺寸。

(5)鉴于用户的学习和记忆能力所限,为了避免引起混淆,一个系统的图标类型不宜过多(一般不超过20种)。

3.图标的编辑工具

图标的编辑工具是用来创建、修改、存储图标的。目前,可以使用的图标编辑工具很多,如HagenWieshofer的IconEdit2(见图4-2)及AxialisSA的AxialisIconWorkshop5.0(见图4-3)都是很好的图标编辑工具。图4-2IconEdit2的界面图4-3AxialisIconWorkshop5.0的界面

IconEdit2小巧实用,使用方便,功能丰富,除了基本的图像编辑功能外,它可以在整个目录里寻找含有图标资源的文件并提取出图标来进行编辑,还可以抓取屏幕任意32×32或16×16区域的图像来作为图标编辑。它支持ICO、ICL、EXE、DLL、BMP和JPEG文件格式,可以保存真彩或16色的ICO文件,也可以保存成BMP和JPEG格式。微软WindowsXP叫人最赏心悦目的改进之一就是其绚丽多彩的图标,但这些图标采用了真彩、半透明等特有技术,所以一般的图标、图像编辑软件都不能很方便的编辑它们。IconWorkshop的推出为我们解决了这一难题。这一全功能图标编辑软件除了可以让你自由编辑创作各种XP样式图标外,还可以在各种图标文件间互相转换。具体来说,它具备的功能包括:

●集成式单窗口操作界面;●支持所有格式Windows图标文件的全功能编辑;

●提供XPAlpha通道支持;

●支持Photoshop、PNG、BMP、ICL、Macintosh图标等常用格式文件的导入/导出/转换;

●各种内建图标特效;

●从单一文件一次性导出多种格式图标;

●内建强力搜索引擎;

●对程序或DLL文件中图标的编辑功能。4.1.3多媒体软件中图形的应用

在多媒体应用软件的界面设计中,图形运用的合适与否,关系着应用系统整体效果的好坏。图形在多媒体软件界面中的应用范围很广,如应用系统的背景图、烘托效果的装饰图、命令按钮的形状图形等。

1.图形的设计与制作

多媒体软件界面中图形的设计并没有千篇一律、一成不变的设计原则,要视具体的应用系统而定。以下是一般性的设计原则:

(1)图形的含义应与应用系统环境相关。

(2)图形的大小比例应合适,符合人的视觉习惯。

(3)背景的纹路、花纹不能太规则,变化要自然,色调要单纯,不可太复杂。

(4)正确使用颜色及颜色搭配,以构成一个良好的色彩环境(见表4-1、表4-2)。

(5)应注意调整图形的亮度、对比度、色彩的饱和度等。

图形的制作工具一般采用Adobe公司的Photoshop8.0。

2.图形中颜色的使用

人们生活在一个充满色彩的世界里,从物理学的观点出发,人眼视觉所能感觉的光波在视觉上产生从红到紫,即赤、橙、黄、绿、青、蓝、紫七色。生理和心理学研究表明,人眼对于色彩比对亮度有更高的敏感性。色彩可以吸引人们的注意力,影响人们的情绪,向人们传达特定的信息含义。色彩的合适配合可以给人以美感,使人振奋、愉快。

和日常生活中合理用色、配色一样,在图形中也要正确使用颜色及颜色搭配,例如正确使用前、背景色,以构成一个良好的色彩显示环境。下面介绍使用颜色的注意事项:

(1)正确使用颜色,改善人的视觉信息获取能力并减少疲劳效应。据统计,在人们获取客观世界的信息中有80%以上是通过视觉获取的。计算机中的屏幕显示也是用户获取计算机系统信息及运行结果的主要窗口。心理学和生理学的知识告诉我们,颜色对人产生视觉感并引起疲劳等方面的心理影响。一方面,人们可以根据目标的色调、明度、彩度等颜色因素来区分辨识不同的物体目标。这里色调是最重要的,不同色调有不同的感染力和表现力,给人以不同的感受。例如,绿色使人感到新鲜、平静,在计算机中用以显示安全、运行正常等含义;而红色蕴含喜庆、兴奋、禁止(如交通红灯),在计算机中用以显示警告、错误信息,提请人们注意等。另一方面,彩色会引起人的视觉疲劳效应,一般说来,对带绿色成分的黄绿、蓝绿、淡青色,人的视觉感到舒服,不易引起疲劳;红色、橙色居中;而蓝色和紫色最易引起视觉疲劳。

不同的民族、不同的人以及不同的性别会对颜色有不同的偏好。因此,要从众多的颜色以及不同的人中选择颜色是很困难与费时的任务,它可能需要一个很高级的彩色度量设备,及花费很多的时间。表4-1列出了16种常用颜色在图形中的应用。

(2)正确配置图形的前、背景色。颜色的组合、配置同样会对人的视觉能力和疲劳方面产生影响。前、背景色的正确选择将改善人的视觉印象,不易使人产生疲劳,并能有效地提取目标信息(例如阅读显示文本);相反,不恰当的颜色组合、配置会扰乱人的情绪,加速视觉疲劳。

表4-2列出了前、背景色组合的效果。表4-116种常用颜色在图形中的应用表4-2前、背景色组合效果

(3)每次显示使用的颜色不宜过多,使用过多颜色的屏幕反而不利于区分颜色及颜色的含义。在非必要情况下,显示使用的颜色宁少勿多。

(4)在同一屏幕上使用多种颜色时,选择使用合适对比度的颜色组合。在使用多种颜色显示时,对比度大的颜色可以一起使用而不易引起混淆,而如果使用过于相近的颜色,则会影响辨别。因为当亮度发生变化时(变暗),原相近的颜色视觉效果上可能混淆起来。例如,在高亮度下易于分辨的黄色和橙色,当亮度变暗时,用户看到这两种颜色都和褐色相像。但是,在使用前、背景色中,也要避免对比度过大,否则反而使字符难以辨认、阅读。

(5)用低饱和度、低亮度来显示不需强调的信息,例如使用柔和、平淡的颜色。

(6)使用一致性的颜色显示。一致性是人机界面领域的普遍原则,在显示颜色上的一致性,首先指屏幕使用颜色应与客观世界及用户常规概念相一致。例如,用红色表示危险、停止、出错;用绿色表示正常、安全、继续运行;黄色表示警告、当心等。另外,一致性还指使用颜色的一致性,即自始至终地一致性使用。例如,所有出错信息都显示在红底白字的弹出式窗口中,那么就不要在弹出式菜单中或对话框中使用红底白字,以避免用户的误解。

(7)不要使用红/绿、红/蓝、绿/蓝、蓝/黄这样组合的颜色对,它们会使相邻边界产生振荡和余像。在VB里,MDI(MultipleDocumentInterface,多文档界面)窗体是这样定义的:“MDI窗体作为一个程序的后台窗口,包含着MDIChild属性为True的窗体”。在一个VB程序中,至多只能存在一个MDI父窗体,可以有多个MDI子窗体;建立一个MDI父窗体的方法是在VB的File菜单里选择“NewMDIForm”。4.2利用VisualBasic开发图形用户界面

在MDI程序运行时,如果子窗口具有菜单,那么当子窗口被激活时,子窗口的菜单就会自动替换父窗口菜单;当子窗口被最小化时,在MDI父窗口里就会出现子窗口的图标。

Windows通用图形界面的出现,使计算机用户不必通过专门的学习就可以得心应手地使用各种Windows的软件;不仅如此,它还是程序设计者在设计Windows程序的界面时所必须遵循的标准。这在很大程度上减轻了程序设计者的负担,使他们能够把主要精力放在问题的求解和实现上。

VB的出现,更加简化了Windows程序界面的设计工作,只需要极少量的代码,就能实现标准Windows应用程序的界面。但是,如果不了解Windows程序界面设计的原则,或者不熟悉VB下界面编程的技巧,就难以设计和实现既符合一般标准又具有特色的界面。

界面设计中最具代表性的原则有:

(1)界面要具有一致性。一致性原则在界面设计中最容易被违反,同时也最容易修改和避免。

(2)常用操作要有捷径。常用操作的使用频度大,应该减少操作序列的长度。例如,为文件的常用操作如打开、存盘、另存等设置快捷键。使常用操作具有捷径,不仅会提高用户的工作效率,还使得界面在功能实现上简洁和高效。

(3)提供简单的错误处理。在出现错误时,系统应能检测出错误,并且提供简单和容易理解的错误处理的功能。错误出现后,系统的状态不发生变化,或者系统要提供错误恢复的指导。

(4)提供信息反馈。对常用操作和简单操作的反馈可以不作要求,但是对不常用操作和至关重要的操作,系统应该提供信息的反馈。

(5)操作可逆。操作应该可逆(Undo功能),这对于不具备专门的知识的操作人员相当有用。可逆的动作可以是单个的操作,或者是一个相对独立的操作序列。

(6)设计良好的联机帮助。虽然对于熟练用户来说,联机帮助并非必不可少,但是对于大多数不熟练用户来说,联机帮助具有非常重要的作用。4.2.1菜单设计的原则和编程技术

菜单设计有如下的一般性原则:

(1)按照系统的功能来组织菜单。分配菜单界面的宽度和深度,使菜单层次结构和系统功能层次结构相一致。把那些逻辑上相似,有联系的选择项安排在一组。

(2)要选用广而浅的菜单树,而不是窄而深的菜单树。一般菜单嵌套层次不宜超过四层,每级菜单项不宜超过7~9项。如果菜单项数超过8个,而显示菜单的屏幕区又小,则可以使用滚动式菜单技术。

(3)根据菜单选项的含义进行分组,并且按一定的规则排序。菜单选项的标题要力求简短、含义明确,并且最好以关键词开始。菜单标题大致上解释了该幅菜单的作用,例如,可以把第一级菜单命名为主菜单,主菜单中的各菜单项反映了系统的基本功能和程序框架。菜单项名应能体现该选择项所完成的功能,使用语气亲切、含义明确、易于理解、简短明了的单词、语句或动宾短语作菜单项名。例如,名词:文件、字体、颜色、风格;动词:保存、打开、关闭、拷贝、编辑;甚至副词、数字都可以作为菜单项的名称,但更好地是使用言简意赅的动宾结构,如保存文件、删除记录等作为菜单项名。

(4)菜单项的安排应有利于提高菜单选取速度。可以根据使用频度、数字顺序、字母顺序、功能逻辑顺序等原则来组织安排菜单项顺序。其中:

●根据使用频度排列:按菜单项使用的频度为序排列,常用的放在第一项。

●根据功能逻辑顺序排列:例如对文件的操作包括打开、定位、读、写、存盘、关闭等菜单项,可按上述功能序列排列。

●根据使用顺序排列:先使用的排在前面。例如处理一个电子邮件,顺序是阅读,回退(到首页),打印,保存,发送等。

●根据菜单项名(或其缩写)的字母顺序排列:按字母顺序的菜单容易查找。

●根据数字编码顺序排列:有时用户可以数字顺序对菜单项进行编码,或者菜单项本身是选择一系列数字,那么可以按数字从小到大来排列菜单项。

(5)常用选项要设置快捷键。菜单界面的多种选择途径增加了系统的灵活性,使之能适应于不同水平的用户,菜单选择的快捷键则加速了系统的运行。这样既可以用多级菜单转向,也可以用快捷键直接操作选取所需功能的菜单项,并设计易记、有约定含义的关键字或单键(含功能键)来表示系统的捷径选择。例如,Windows菜单系统中,使用F1作为帮助功能的快捷键,Ctrl+O作为打开文件的快捷键,Ctrl+S作为保存文件的快捷键,Alt+X作为退出系统的快捷键等。

结合以上的原则,VB菜单编程有以下几方面的技术和技巧:

1.菜单选项的分组

在VB中,菜单选项的分组是通过菜单栏分隔横线实现的。在菜单的一定位置增加一个Caption属性为“-”的菜单项,它在菜单上就表现为一条横线。在许多情况下,同一个功能菜单下又可以按照菜单选项的功能分为几组,这时就可以用分隔横线来实现菜单项的分组。

2.常用选项快捷键的设置

打开菜单设计窗口(MenuDesignWindow),对于每个菜单选项应有相应的快捷键(Shortcut)列表,在该表中选择一个即可。需要注意的是,具有子菜单的菜单或者顶层菜单的快捷键不能这样定义。按照Windows的界面设计原则,顶层菜单的快捷键的形式是Alt+字母键,其实现方法见4.2.4节。

对于一些常用的功能菜单项,有约定俗成的快捷键。例如,文件打开用Crtl+O,文件存盘用Crtl+S,打印用Crtl+P,等等。

为菜单选项定义好快捷键之后,菜单上该选项的后面就出现了快捷键的文字表示。

3.菜单选项的允许与禁止、可见与隐藏

为了表示菜单选项的一些特殊功能,可能要用到菜单选项的允许与禁止、可见与隐藏属性。当因为某种原因使得某个选项所代表的功能不能被实现时,就应该禁止该选项被选中。菜单选项的允许与禁止是通过改变该选项的Enabled属性实现的。

举例来说,假设菜单选项名为nmuName,则禁止该选项可通过如下设置实现:

mnuName.Enabled=False

同理,隐藏一个选项可以用mnuName.Visible=False来实现,而使一个隐藏的选项恢复可见则用mnuName.Visible

=True来实现。

菜单项的隐藏与恢复可见常常用在动态菜单的实现中。

4.菜单项的动态装入

菜单项的动态装入是指菜单项的个数不固定,并且能够在需要时动态地装入。最简单的例子就是文件菜单中最近打开的文件的列表。在第一次打开文件之前,该列表是空的,并且不在文件菜单中出现;打开一个文件后,该列表不再是空的,并且文件菜单中出现代表被打开文件的菜单项。

在上面的几个技巧里,综合运用了菜单项的下标属性(Index)、标题属性(Caption)、可见属性(Visible)以及菜单项的装入方法(LoadMethod)。具体的实现过程如下:

在文件菜单里增加一个菜单项,标题任意,并假设菜单项的Name属性是opened_files_list;更改菜单项opened_files

_list的可见属性,使opened_files_list.Visible=False更改菜单项opened_files_list的下标属性,使opened_files_files_list.Index

=0在程序中控制菜单项opened_files_list的动态装入

假设要显示打开过的第二文件的文件名,并且该文件名存放在一个文件名数组opened_file_name里。以下的代码就实现了这一功能:Loadopened_files_list(1)opened_files_lise(1).Caption="&2"+opened_file_name(1)opened_files_list(1).Visible=True

需要注意的是,对于下标为0的菜单项,不能用Load方法。因为在程序执行时,该菜单项就已经被装入到内存里了;另外,在菜单项的标题属性字符里的“&”字符具有特殊的含义,它的作用是在显示该属性字符串的同时并不显示“&”本身,而紧跟“&”的字符在显示时具有下划线,并且该字符成为热键。

如果下标不为0的菜单项不再需要,为了减少对内存资源的占用,可以用Unload方法把它从内存卸出;同样地,不能用Unload卸出下标为0的菜单项。

5.弹出式菜单的实现(PopupMenuMethod)

VB中在菜单设计窗口(MenuDesignWindow)中设计的菜单是下拉式菜单。下拉式菜单是用户在任何时候都可以在顶端菜单条上选择后拉出的菜单,而弹出式菜单则是在程序界面的一定区域内点按鼠标键后出现的菜单。在某些情况下,弹出式菜单会使系统功能的实现更加简洁和高效,使用起来更加得心应手。

Windows程序的弹出式菜单一般是当用户在程序的桌面上点按鼠标键时出现的。弹出式菜单多用于实现系统的附加或增强功能。弹出式菜单的内容可以随点按鼠标键的位置不同而变化。由于弹出的菜单要覆盖屏幕的一部分,因而应尽量缩短菜单里的文字。

在VB中,弹出式菜单的实现要用到下拉式菜单设计技术和PopupMenu方法。具体的做法是:

(1)在菜单设计窗口(MenuDesignWindow)里设计好相应窗体的弹出式菜单。要注意的是,要弹出的菜单至少要有一个子菜单,且这个菜单不能有快捷键,Checked属性必须是False。再把弹出式菜单的Visible属性改为False。(2)在具有弹出式菜单的窗体的Form_Click中加入以下代码(假设弹出式菜单的Name属性是mnuExample):

SubForm_Click()

PopupMenumnuExample

EndSub

(3)如果要求只有按下鼠标左键或者右键才能激活菜单,则必须在Form_MouseDown里加入如下代码:SubForm_MouseDown(ButtonAsInteger,ShiftAsInteger,xAsSingle,yAsSingle)IfButton=2then‘Button=2表示鼠标右键PopupMenumnuExampleEndIf

PopupMenu的完整语法是:

[Form.]PopupMenumenuname[flags[,x[,y]]]

改变flags的值可以控制弹出式菜单的表现形式。flags有两组值:第一组值用来控制菜单的显示方式,包括POPUPMENU_LEFTALIGN,POPUPMENU_CENTERALIGN,POPUPMENU_RIGHTALIGN,分别表示以x为左边界,以x为中心和以x为右边界的显示方式,并且以x为左边界是缺省的方式;另外一组值用来控制菜单项的选中方式,包括POPUPMENU_LEFTBUTTON和POPUPMENU_

RIGHTBUTTON,分别表示左键选中和左/右键选中均可,并且左键选中是缺省的方式。

flags的值由上面的两组值经过OR运算得出。例如,要求左对齐显示并且左键选中为准,则应有:

flags=POPUPMENU_LEFTALIGNOR

POPUPMENU_LEFTBUTTON

x和y用来定义菜单弹出的位置,缺省是鼠标点中的位置。

6.菜单项的其他属性

用Alt+字母键激活顶层菜单,或者在菜单激活后用字母键激活一个菜单项时,必须学会使用&。&用在菜单项的标题属性(Caption)里,它的用法和作用与在用C语言编制的Windows程序中的用法和作用相同。有时希望顶层菜单之间的间隔大一些,或者某个顶层菜单出现在菜单条的最右端,这时就要用到标题属性是空格的菜单。如果一个菜单的标题是由多个空格组成的,那么这个菜单在菜单条上就占用与空格的个数相应的空间,并且它后面的菜单也顺序地后移;如果这个菜单的Visible属性是False,那么它就跟不存在一样。

7.位图菜单

在通常的程序中,菜单总是以文本的方式存在的,有时候显得非常单调乏味。如果能够在菜单中加入位图图形,将会极大地增加用户的使用兴趣。下面介绍如何使用位图制作菜单选项。

位图菜单的创建需要用到Windows应用程序编程接口(API)函数,我们需要将这些函数的声明包含在应用程序的标准模块(Module1.Bas)中,具体的内容请参见下面的程序。创建位图菜单的基本思想如下:

(1)使用函数GetSubMenu提取子菜单项的句柄,并通过使用函数CreateCompatibleDC来创建一个兼容的设备环境描述表。

(2)在一个循环过程中通过使用CreateCompatibleBitmap函数、SelectObject函数以及BitBlt函数来分别将针对各个菜单项所载入的位图选入到兼容设备环境中。载入位图可以有多种方法,在下面的程序中,我们在窗体上设置了四个图片框控件(PictureBox),使用它们载入4个预设的图标来作为菜单选项位图的源文件。当然也可以使用其他的方法,例如,在程序中使用LoadPicture函数来从磁盘装载位图。

(3)通过ModifyMenu函数绘制真正的位图菜单选项。

(4)使用DeleteDC函数来释放设备环境,以便其他的程序可以使用它们。

下面是工程文件的建立步骤:

①在VisualBasic中建立一个新的工程,采用缺省的方法建立Form1。

②创建一个新的模块,采用缺省的方法建立Module1.Bas。③在Form1上添加4个图片框控件(使用控件数组),将它们的Name属性设置为Picture1,将它们的Index属性依次设置为0、1、2、3,将它们的AutoRedrew属性、AutoResize属性设置为Ture,将它们的Appearence属性、BorderStyle属性设置为0,将它们的Visable属性设置为False。

④将Open.bmp、About.bmp、Help.bmp、Quit.bmp四个图标文件赋给上面的四个图片框控件的Picture属性。⑤在Form1上添加一个菜单项,将它的标题设置为“主菜单(&F)”,名称设置为MnuMain。在其下添加4个子菜单项,分别将这四个子菜单项的名称设置为“打开(&O)”,“关于(&A)”,“帮助(&H)”及“退出(&E)”。将它们的名称设置为“MnuMain_Select”,并对应地将这四个子菜单项的索引设置为0、1、2、3。

画好的窗体如图4-4所示。图4-4位图子菜单控件设计Module1.Bas模块代码如下:OptionExplicitDeclareFunctionGetMenuLib"user32"(ByValhwndAsLong)AsLongDeclareFunctionGetSubMenuLib"user32"(ByValhMenuAsLong,ByValnPosAsLong)AsLongDeclareFunctionGetMenuItemIDLib"user32"(ByValhMenuAsLong,ByValnPosAsLong)AsLongDeclareFunctionModifyMenuLib"user32"Alias"ModifyMenuA"(ByValhMenuAsLong,ByValnPositionAsLong,ByValwFlagsAsLong,ByValwIDNewItemAsLong,ByVallpStringAsAny)AsLongDeclareFunctionCreateCompatibleDCLib"gdi32"(ByValhdcAsLong)AsLongDeclareFunctionDeleteDCLib"gdi32"(ByValhdcAsLong)AsLongDeclareFunctionCreateCompatibleBitmapLib"gdi32"(ByValhdcAsLong,ByValnWidthAsLong,ByValnHeightAsLong)AsLong’

创建一幅与设备有关位图,它与指定的设备场景兼容

DeclareFunctionSelectObjectLib"gdi32"(ByValhdcAsLong,ByValhObjectAsLong)AsLong’

得到以前选入设备场景的句柄

DeclareFunctionBitBltLib"gdi32"(ByValhDestDCAsLong,ByValxAsLong,ByValyAsLong,ByValnWidthAsLong,ByValnHeightAsLong,ByValhSrcDCAsLong,ByValxSrcAsLong,ByValySrcAsLong,ByValdwRopAsLong)AsLong

PublicConstSRCCOPY=&HCC0020

PublicConstMF_BYPOSITION=&H400&

PublicConstMF_BITMAP=&H4&Form1程序代码如下:

PrivateSubForm_Load()

DimnLoopCtrAsInteger

DimlResultAsLong

DimhTempDCAsLong

DimnWidthAsInteger

DimnHeightAsInteger

DimlTempIDAsLong

DimhMenuIDAsLong

DimlItemCountAsLong

DimhBitmapAsLong

nLoopCtr=0nWidth=Picture1(nLoopCtr).Width\Screen.TwipsPerPixelX

nHeight=Picture1(nLoopCtr).Height\Screen.TwipsPerPixelY

hMenuID=GetSubMenu(GetMenu((Me.hwnd)),0)'获取菜单的位置

hTempDC=CreateCompatibleDC(Picture1(nLoopCtr).hdc)

FornLoopCtr=0To3'这个循环把图片放入菜单里hBitmap=CreateCompatibleBitmap(Picture1(nLoopCtr).hdc,nWidth,nHeight)

lTempID=SelectObject(hTempDC,hBitmap)

lResult=BitBlt(hTempDC,0,0,nWidth,nHeight,(Picture1(nLoopCtr).hdc),0,0,SRCCOPY)

lTempID=SelectObject(hTempDC,lTempID)

MnuMain_Select(nLoopCtr).Caption=""

lResult=ModifyMenu(hMenuID,nLoopCtr,MF_BYPOSITIONOrMF_BITMAP,

GetMenuItemID(hMenuID,nLoopCtr),hBitmap)NextnLoopCtr

lResult=DeleteDC(hTempDC)

EndSub

PrivateSubMnuMain_Select_Click(IndexAsInteger)'处理菜单选择事件

SelectCaseIndex

Case0

Label1.Caption="选中---打开"Case1

Label1.Caption="选中---关于"

Case2

Label1.Caption="选中---帮助"

Case3

Label1.Caption="选中---退出"

DoEvents

End

EndSelect

EndSub

运行该样例程序,单击“主菜单”菜单,则会看到由4个图标所形成的位图子菜单项,如图4-5所示。

8.实现主菜单中的弹出式菜单

在VB中,我们可以很容易地利用PopupMenu函数制作弹出式菜单,但是它只能弹出主菜单中的某一个子菜单。要制作包含主菜单的弹出式菜单,可以用下面所述的方法实现:

(1)建立FORM1、FORM2。

(2)在FORM1中放置一个PictureBox控件Picture1,并在FORM1上建立含有“文件”、“帮助”二个菜单项的主菜单,如图4-6所示。图4-5位图子菜单图4-6FORM1上的菜单界面设计

(3)如图4-7所示,在FORM2上建立四项主菜单及相应子菜单,其设置为:

FORM2上的主菜单中,前三项为正常使用的菜单,第四项隐含。FORM2第四项mnu2(3)下的子菜单就是FORM2主菜单前三项“内容”、“索引”、“关于”的全部内容的重复,用来在FORM1中右击picture1时显示FORM2的主菜单,如图4-8所示。图4-6FORM1上的菜单界面设计图4-7FORM2上的菜单设计图4-8右击picture1时显示FORM2的主菜单下面是完整的程序代码:4.2.2窗口设计技术

1.浮动窗口的设计

在软件设计时,为了保证含有重要信息的窗口不被其他窗口覆盖,就要用到浮动窗口技术,建立一个“总在最前面”(TopMost)的窗口。下面我们用一个实例介绍这类窗口的制作。

(1)建立FORM1、FORM2。

(2)在FORM1中放置一个PictureBox控件Picture1及二个命令按钮Command1、Command2,效果如图4-9所示。

(3)在FORM2中放置三个Shape,形状自定,效果如图4-10所示,仅供参考。图4-9浮动窗口

图4-10参照物窗口程序代码如下:

程序运行后,我们可以看到如图4-11所示的窗口。在图4-11中,“参照物窗口”盖住了“浮动窗口示例”。单击“设置”按钮后,我们可看到“浮动窗口示例”被调到最前面。单击“取消”按钮后,我们又可看到图4-11所示的窗口画面。图4-11“参照物窗口”盖住了“浮动窗口”示例

2.制作颜色渐变的窗口背景

在许多Windows软件的安装程序中,常常可以看到窗口的背景颜色由浅至深的渐变效果。下面我们用一个例子程序,说明如何通过调用API函数FillRect,来绘制渐变的窗口背景色。

首先,以缺省的方式新建一工程。然后在缺省的窗体Form1中加入如下代码:运行上面的程序后,就会出现一个从上到下、由白至黑的窗口背景渐变效果(见图4-12)。对上述代码稍加修改,便可制作出各种颜色和方向的渐变背景。图4-12窗口背景渐变效果

3.窗口背景拼图技术

在多媒体软件开发过程中,为提高软件的商品化程度,常常需要对窗口背景进行美化处理。但用VisualBasic进行窗体设计时,若只按照系统提供的功能,则窗口背景只能设置为单一的颜色。当然,我们可以通过设置窗体的PICTURE属性,调用位图文件来显示窗口背景的纹理图案。但使用这种方法有许多缺点:其一是窗体大小受位图大小的限制,调整起来相当麻烦,不具有通用性和灵活性;其二是浪费资源,因为花纹图案基本上是重复图案,采用与窗体同样大小的位图是一种浪费。下面介绍的背景拼图技术,可以容易地显示出窗口背景的纹理图案。

首先,在窗体上建立一个网格控件,设定网格行不可见,去掉固定行和固定列,用程序实现网格控件与窗体同样大小,并随窗体大小的改变而改变。然后设计一个花纹图案,形成BMP位图文件,将其调入PictureBox控件。设定网格的每个单元与该图案大小相同,使单元的数量正好覆盖整个窗体背景,再将该图案赋予所有单元去显示。

在下面的例子中,我们通过子程序unitepic()实现以上过程。不论图案大小、窗体大小,该程序都能自动调整网格控件大小和网格单元大小及单元数量。图4-13显示了程序的运行结果。图4-13窗体对象设计按图4-13画出Form1,其中左边的矩形框为Grid控件,右边的为Picture控件。下面是十个Button控件,而且这十个控件的Name属性都设为“Command1”,这样就形成一个由十个按钮组成的按钮数组。(注意:若背景花纹无法正常显示,请重新注册GRID32.ocx控件。)

各对象的主要属性定义如表4-3所示。表4-3控件主要属性程序代码如下:程序运行后,效果如图4-14所示。图4-14程序运行后生成的纹理图案4.2.3鼠标编程技术

1.鼠标指针的自动移动

在开发多媒体应用软件的过程中,当一个窗口中出现较多的控件时,如果能向导式的将鼠标指针自动地移动到指定控件上(即建议用户下一步该做什么),则会使用户觉得软件具有智能性并减少了用户出错的机会。

我们知道,在VisualBasic中,可以用SetFocus方法使控件得到输入焦点,也可以用Sendkeys“{TAB}”语句使下一个控件获得焦点。可是,当焦点切换的两个控件相隔一定距离时,上述的方法有时不足以引起用户的注意,然而,一种好的解决方法是将鼠标箭头也移到控件上。

由于VB本身并没有支持鼠标移动的方法,下面我们以实例介绍一种方法(使用API函数SetCursorPos)来将鼠标指针自动地移动到指定控件上。控件设计效果如图4-15所示。

在下面的程序中,当读者在文本框中输入文本并按回车键后,可以看见鼠标指针自动地移动到“确定”按钮上了(见图4-16)。图4-15控件设计效果图4-16鼠标指针自动移动到“确定”按钮上程序代码如下:

2.对象的拖动

为使程序界面漂亮生动,更具吸引力,在许多Windows应用程序中都采用了图形化的界面(例如WINAMP等)。但是,在这样的界面下就不能使用Windows原来的标题条了,否则会影响界面的一致性及美观性。那么,在没有标题条的情况下如何用鼠标拖动窗体或其他的控件呢?

下面我们以一实例介绍如何使用API函数来实现窗体或其他控件的拖动。

在下面的程序中,当读者在窗体(或图片框)中按下鼠标左键并拖动后,可以看见窗体(或图片框)会随着鼠标的拖动而移动(见图4-17)。图4-17窗体随鼠标的拖动而移动按图4-17画出窗体Form1。各对象的主要属性如表4-4所示。表4-4控件主要属性程序代码如下:

3.鼠标移出(MouseLeave)事件的实现

我们知道,在VB中关于鼠标操作的事件有MouseDown、MouseUp和MouseMove事件。利用这三个事件,我们可以方便地操纵大多数的鼠标行为。但要精确地控制所有的鼠标操作,仅使用这三个事件有时无法很好地完成鼠标控制的功能。例如,在下面的程序段中,当鼠标移动到Command1按钮上时,在标签label1中会显示“鼠标已移动到Command1”;当鼠标离开Command1按钮时,则在标签label1中会显示“鼠标不在Command1上”。运行上面的程序后我们可以发现,在大部分情况下,程序的运行结果符合我们的要求。但是,当将鼠标从Command1下面迅速移动到窗体外面时,我们发现标签label1中显示的信息“鼠标已移动到Command1”仍然没有发生变化(见图4-18),这是我们不愿看到的结果。为什么会出现这种情况呢?这是因为鼠标移动的速度太快,Form1中的MouseMove事件来不及触发,而当前鼠标的位置又不在Form1上,这样,label1中显示的信息自然不会发生变化。图4-18控件设计要解决这个问题,必须捕捉MouseLeave事件。下面我们利用API函数SetCapture和ReleaseCapture来完成MouseLeave事件。下面是完整的对象属性值及程序代码。

程序代码如下:设计效果如图4-19所示。图4-19鼠标移动到“Command1”上

4.其他鼠标操作技术

1)显示和隐藏鼠标

声明:

DeclareFunctionShowCursorLib“user32”(ByValbShowAsLong)AsLong

说明:bShow为1时,显示鼠标;bShow为0时,隐藏鼠标。

2)取得双击间隔时间

声明:

DeclareFunctionGetDoubleClickTimeLib“user32”Alias“GetDoubleClickTime”()AsLong

说明:返回千分之一秒的时间间隔数。

3)设置双击间隔时间

声明:

DeclareFunctionSetDoubleClickTimeLib“user32”Alias“SetDoubleClickTime”

(ByValwCountAsLong)AsLong

说明:wCount为千分之一秒的时间间隔数。

4)交换鼠标按钮

声明:

DeclareFunctionSwapMouseButtonLib“user32”Alias“SwapMouseButton”

(ByValbSwapAsLong)AsLong

说明:bSwsp值为True,为

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论