特效处理:Delphi中制作特效菜单

特效处理:Delphi中制作特效菜单,第1张

菜单是应用程序中常见的用户界面之一 Delphi具有功能强大的菜单设计器 可以很快地实现标准的菜单 但有时候 应用程序需要实现特定类型的菜单 我们常用的如金山毒霸的d出式菜单就是一例 可以在菜单项里显示自己定义的图片 自己设置的文字以及自设置的菜单项大小 这种菜单称为自绘制菜单(Owner draw MenuItem)当然 功能不止于此 我们还可以实现更好的菜单 下面就一起来做一个显示大图片和大文字的菜单吧!一 程序思路Delphi在绘制每个菜单时 采用一个比较独特的方法 首先 Delphi会通过菜单的OwnerDraw属性来判定在菜单中是否允许自绘制菜单 若OwnerDraw属性为真(TRUE) 则Delphi首先会触发每个菜单项的OnMeasureItem事件来获取自绘制菜单项的大小(Width Height) 然后触发OnDrawItem事件 允许用户在这里绘制自己的菜单 二 实现菜单第一步 创建一个新的项目 并添加相应的组件启动Delphi 新建一个应用 此时出现一个窗体 将其Name属性改为frmSample 添加一个d出式菜单到窗体frmSample 并将此菜单Name属性设置为mnuOwnerDraw 设置窗体frmSample的PopupMenu属性为mnuOwnerDraw 这时运行程序 你会发现除了d出式菜单仍然显示为弯者空的菜单 继续往窗体上添加一个TactionList对象 双击以设计这一ActionList对象 往其中增加一个Action对象 并设置其Name属性为 actSample 往窗体上放置一个Label对象 其Name属性为 Label 调整Label的字体大小 以便在利用Label显示数据时 可以清楚地观察到 现在 往程序的变量声明部分(VAR)添加要用到的声明 ePic:TPicture//用于装载程序要用到的图像miSample:TMenuItem  //菜单项的声明 用于动态生成菜单项I:integer//当多次右击键时 记录右单击次数 从而生成不竖液同的菜单项 首先在程序的初始化部分初始化击键次数为 initializationi:= 第二步 实现OnMeasureItem和OnDrawItem往窗体frmSample的实现(Implementation)部分添加如下过程声明 AMeasureItem (Sender: TObjectACanvas: TCanvasvar Width Height: Integer)ADrawItem (Sender: TObjectACanvas: TCanvasARect: TRectSelected: Boolean)往往手工输入比较麻烦 比较现实的做法是利用菜单设计器添加一个菜单项 设置其Name属性为A 然后选择OnMeasureItem和 OnDrawItem事件 双击即可 Delphi会为你自动输入如上代码 往AMeasureItem中添加如下代码 BeginWidth: = //设置菜单项的宽度 Height: = //设置菜单项的高度 End往ADrawItem中添加如下代码 BeginIf I= thenbeginePic:=TPicture Create//创建一个用于装载图片的Tpicture对象ePic LoadFromFile( a bmp )//从项目所在目录装载图片acanvas Draw(arect Left arect Top ePic Graphic) //将图片在菜单项中绘制出来acanvas Font Size:= //设置余闹物菜单项的字体大小acanvas Font Color:=clPurple//设置菜单项字体颜色acanvas TextOut(arect Left+ arect Top+ A )//在菜单项中输出文字Aendif i= thenbeginePic:=TPicture Create //创建一个用于装载图片的Tpicture对象ePic LoadFromFile( b bmp ) //从项目所在目录装载图片acanvas Draw(arect Left arect Top ePic Graphic) //将图片在菜单项中绘制出来acanvas Font Size:=  //设置菜单项的字体大小acanvas Font Color:=clblue //设置菜单项字体颜色acanvas TextOut(arect Left+ arect Top+ B ) //在菜单项中输出文字Aendif i= thenbeginePic:=TPicture CreateePic LoadFromFile( c bmp )acanvas Draw(arect Left arect Top ePic Graphic)acanvas Font Size:= acanvas Font Color:=clredacanvas TextOut(arect Left+ arect Top+ C )endEnd下面我们实现菜单项的在被单击时的行为 即实现actSample对象的OnExcute事件 如下所示 actSampleExecute(Sender: TObject)beginlabel Caption:=inttostr(i)end第三步 将菜单项动态添加到菜单中I:=I+ //计算程序中的击键次数miSample:=TMenuItem Create(form ) //动态创建菜单项miSample OnClick :=actSample OnExecute//为菜单项添加动作miSample OnDrawItem := ADrawItem  //为菜单项设置显示方式miSample OnMeasureItem := aMeasureItem//为菜单项设置大小mnuOwnerDraw Items Insert( miSample) //将菜单项添加到菜单中三 程序效果现在可以应用程序了 你会发现 只要你在窗体上单击右键 窗体会有一个d出式菜单显示出来 而且每一个菜单项都随着右键单击次数的不同而不同 当次数大于 时 菜单显示为一系列的空菜单项 但是 不论何时你单击任何一个菜单项 Label的都会显示你当前的右键在窗体上单击的次数值 四 程序加强如果我们在程序中为我们所动态创建的每一个菜单项都实现不同的OnMeasureItem和OnDrawItem事件的话 那么 每一个菜单项都有自己的大小处理与显示处理 那我们就可以实现一些更好的功能 例如 可以实现大小不同的菜单项 第一个菜单项可以比较小 以后的菜单项可以比较大 同样还可以在一些菜单中实现更好的功能 如 每个菜单显示自己图标和特定字体的文字 但是 利用这种方法制作自定义菜单的功能还是受到了一定的限制 我们只能对OnAdvancedDrawItem OnClick OnDrawItem OnMeasureItem等有限几个事件作出反应并对菜单项进行定制 我们没有办法对鼠标事件作出反应 利用鼠标事件 当鼠标滑过菜单项时 我们可以实现诸如加亮 渐变或其他的菜单项显示技术 显然这是十分有意义的 要实现上述技术 我们需要从TcustomMenuItem中继承并定义一个新类并重新声明OnMouseMove事件 并给出实现诸如加亮或渐变等技术的代码即可 lishixinzhi/Article/program/Delphi/201311/8434

程序的启动界面是为了让需要较长时间的程序启动时,避免用户错误的以为程序没有打开或者没有响应,而设计的一个“小甜点”,但许多人设计时,却忽略了根本,反竖铅而将启动界面用Sleep等延时方法,强制在主屏上显示一段时间,以增加“存在感”,这显然是违背启动界面设计初衷的。

那么,这个启动界面,我们应该在什么时候创建和显示呢?这就需要我们从设计的初衷开始,讨论下启动界面的生存周期问题。

首先,启动界面应在程序一启动时就创建。在Delphi或C++Builder程序中,它应该在TApplication对象创建之后,由于我们一般不推荐修改项目的入口源码,所以我个人推荐是在主窗体的构造函数或OnCreate事件中创建启动画面。

其次,启动界面在主窗口初始化完成后,主窗体显示之前关闭。而不要故意加入Sleep一类的函数来延长用户的等待时间,除非你将启动界面当成是电视广告,否则没必要耽误用户宝贵的时间。

还有一个问题,如果程序很快就初始化完成,启动画面会一闪而过,怎么办?实际上这本身不是问题,毕竟没人不乐意程序快点进入,唯一需要解决的问题就是是否需要显示画面的问题。这里我个人一般推荐使用定时器来延迟显示启动画面,如果启动进程已经超过50%初始化完成,而只用了小于500ms的时间,那我个人认为完全没必要显示一个启动界面来显示自己的存在。

其实,这里牵涉到另一个问题,就是你的程序是否需要加入一个启动界面。如果你的程序的启动没有多少需要初始化的东西,那个人感觉就完全没有必要。启动界面的设计初衷是为了增强用户体验,避免用户在等待程序启动过程中发生错误的认知,态拆如果你很快启动完成,何必加入没必要的东西。

我们接下来讨论下,启动界面都要做些什么?

(1)、一幅制作精美的图片,给用户美好的印象。甚至可以在图片上加上一些 *** 作提示一类实用的技巧啥的;

(2)、应用程序初始化进度提示,以便告诉用户我还活着,不要着急;

至于其它的东西,那不属于启动界面应该 *** 心的事,就交给别的地方去做吧。

启动界面一般也是帆纤枣一个普通的窗体,不同的是我们一般会将其设计为无边的窗口,或者标新立异一点设计成不规则形状的窗口(设置一个背景图片,然后设置TransparentColor就可以实现),然后注意在显示时是用Show而不是ShowModal来显示,初学者容易卡在这一个小地方,提示一下。

在窗体变化的时尘桥候写代码,控件的left数值和top数值等于窗体left+?和top+?,这样写就可以了,不管窗体怎么边,位置派中猛都不会改

比如培漏

label1.Left:=form1.Left+10

label1.Top:=form1.Top+50


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12346738.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-24
下一篇 2023-05-24

发表评论

登录后才能评论

评论列表(0条)

保存