说三道四技术文摘-感悟人生的经典句子
说三道四 > 文档快照

利用delphi美化你的菜单

HTML文档下载 WORD文档下载 PDF文档下载
利用delphi美化你的菜单

windows下的很多程序都有十分漂亮的菜单,例如windows“开始”菜单左方从上到下的长条形的windows banner 又或者是向word那样在每一个菜单条左边都有一个小图标,看到这些很cool的菜单,你是否觉得自己的菜单显得单调乏味呢?不需要第三方控件,利用delphi就可以实现上面的功能。

如果要实现自定义菜单就需要在绘制菜单时改变菜单的大小以适应在菜单上绘制图形,然后再在上面绘制自己所需要的菜单效果。在delphi中,每一个菜单项对应一个tmenuitem控件,这类控件都有两个事件:ondrawitem和onmeasureitem,要实现自定义菜单,首先要介绍一下这两个事件:

onmeasureitem事件的定义如下:

type tmenumeasureitemevent = procedure (sender: tobject; acanvas: tcanvas;

var width

height: integer) of object;

property onmeasureitem: tmenumeasureitemevent;

该事件在菜单条监测自身的尺寸时产生,其中参数acanvas定义绘制的绘图对象,参数width、height制定菜单项的默认尺寸,注意到这两个定义前的var了吗,说明你可以在onmeasureitem事件处理函数中改变这两个值,也就是改变菜单的大小。

ondrawitem事件的定义如下:

type tmenudrawitemevent = procedure (sender: tobject; acanvas: tcanvas;

arect: trect; selected: boolean) of object;

property ondrawitem: tmenudrawitemevent;

该事件在菜单绘制时引发,其中参数acanvas定义菜单绘制对象,参数arect制定菜单的绘制区域,参数selected定义当前菜单项是否被选中。

从上面的介绍可以看到,要实现自定义的菜单,只要在onmeasureitem事件中编写代码改变菜单项的尺寸,然后在ondrawitem事件中绘制自己需要的效果就可以了。

下面我痛过具体的范例来做说明,这个范例是使自己的菜单实现象windows开始菜单一样的显示banner条的功能。同时这个程序还能实现对被选中的菜单条进行渐变色填充(就象3721中文网址软件的任务栏菜单那样)。程序的思路是这样的,首先建立一个长条型的位图,然后在每一个菜单条的onmeasureitem事件中根据要显示在菜单上的文本和图像以及程序的需要改变菜单项的宽度和高度,然后在ondrawitem事件中将位图中的相应部分拷贝到菜单项上。如果该菜单条被选中,首先要改变acanvas参数的画刷颜色,然后再依次填充菜单条上的相应部分,这样就实现了对选中的菜单条实现渐变色填充。最后将文本输出到菜单条上。

下面来介绍具体的程序,首先利用图像软件建立一个长条型的位图文件(你可以根据你的需要设定图像的高宽比,在我的图像中是10:1)。在delphi中建立一个新的工程,在form1中加入一个timage控件,将控件的autosize属性设置为true。然后在form1中加入一个tmainmenu控件,将它的ownerdraw属性设置为true(这一点很重要,否则程序无法实现)在该tmainmenu下加入6个tmenuitem对象(鼠标右健点击tmainmenu控件,然后点击弹出菜单的menu designer 项,就可以在设计窗口中添加菜单条了),将它们的name属性分别设置为 caption1、caption2、…、caption6。

下面是具体的程序清单:

unit ownermenu;

interface

uses

windows

messages

sysutils

classes

graphics

controls

forms

dialogs

menus

extctrls

stdctrls

imglist;

type

tform1 = class(tform)

mainmenu1: tmainmenu;

main1: tmenuitem;

caption1: tmenuitem;

caption2: tmenuitem;

caption3: tmenuitem;

caption4: tmenuitem;

caption5: tmenuitem;

caption6: tmenuitem;

image1: timage;

procedure caption1measureitem(sender: tobject; acanvas: tcanvas;

var width

height: integer);

procedure caption2measureitem(sender: tobject; acanvas: tcanvas;

var width

height: integer);

procedure caption3measureitem(sender: tobject; acanvas: tcanvas;

var width

height: integer);

procedure caption4measureitem(sender: tobject; acanvas: tcanvas;

var width

height: integer);

procedure caption5measureitem(sender: tobject; acanvas: tcanvas;

var width

height: integer);

procedure caption6measureitem(sender: tobject; acanvas: tcanvas;

var width

height: integer);

procedure caption1drawitem(sender: tobject; acanvas: tcanvas;

arect: trect; selected: boolean);

procedure caption2drawitem(sender: tobject; acanvas: tcanvas;

arect: trect; selected: boolean);

procedure caption3drawitem(sender: tobject; acanvas: tcanvas;

arect: trect; selected: boolean);

procedure caption4drawitem(sender: tobject; acanvas: tcanvas;

arect: trect; selected: boolean);

procedure caption5drawitem(sender: tobject; acanvas: tcanvas;

arect: trect; selected: boolean);

procedure caption6drawitem(sender: tobject; acanvas: tcanvas;

arect: trect; selected: boolean);

private

{ private declarations }

public

procedure drawitem(sender: tmenuitem; acanvas: tcanvas;arect: trect;

selected: boolean;strout:string);

{ public declarations }

end;

var

form1: tform1;

i

ih

ind

iw

irate:integer;

rtemp:trect;

ig1

ig2:integer;

implementation

{$r *.dfm}

procedure tform1.drawitem(sender: tmenuitem; acanvas: tcanvas;arect: trect;

selected: boolean;strout:string);

var

j:integer;

begin

i:=arect.bottom -arect.top; //获得贴图的高度和宽度

ind:=sender.menuindex;

ih:=round(image1.height/6*ind); //获得贴图位置

//将image上相应位置的位图复制到菜单上

stretchblt(acanvas.handle

arect.left

arect.top

iw

i

image1.canvas.handle

0

ih

image1.width

round(image1.height/6)

srccopy);

if selected then begin //该菜单项被选中

acanvas.font.color := clwhite;

rtemp:=arect;

rtemp.left := rtemp.left+iw;

ig1:=round((rtemp.right - rtemp.left)/10);

rtemp.right := rtemp.left +ig1;

for j:= 0 to 9 do begin //通过循环设置色彩渐变效果

acanvas.brush.color := rgb(0

0

j*25);

acanvas.fillrect(rtemp);

rtemp.left := rtemp.left +ig1;

rtemp.right := rtemp.left +ig1;

end;

end

else begin //该菜单项没有被选中

acanvas.brush.color := cl3dlight; //设置背景色为浅灰

rtemp:=arect;

rtemp.left := rtemp.left+iw;

acanvas.fillrect(rtemp);

acanvas.font.color := clblack;

end;

//设置canvas的画笔填充模式为透明

acanvas.brush.style:=bsclear;

//在菜单上输出文字

acanvas.textout(arect.left+iw+5

arect.top

strout);

end;

procedure tform1.caption1measureitem(sender: tobject; acanvas: tcanvas;

var width

height: integer);

begin

//在onmeasureitem事件中改变菜单的宽度和高度,下面5个程序同

//改变菜单的宽度和高度以容纳文本

height:=acanvas.textheight('caption1')+5;

width:=acanvas.textwidth('caption1')+5;

irate:=round(image1.height/(height*6));

iw:=round(image1.width /irate);

width:=width+iw; //根据计算改变菜单宽度以容纳附加的文本

end;

procedure tform1.caption2measureitem(sender: tobject; acanvas: tcanvas;

var width

height: integer);

begin

height:=acanvas.textheight('caption1')+5;

width:=acanvas.textwidth('caption1')+5;

irate:=round(image1.height/(height*6));

iw:=round(image1.width /irate);

width:=width+iw;

end;

procedure tform1.caption3measureitem(sender: tobject; acanvas: tcanvas;

var width

height: integer);

begin

height:=acanvas.textheight('caption1')+5;

width:=acanvas.textwidth('caption1')+5;

irate:=round(image1.height/(height*6));

iw:=round(image1.width /irate);

width:=width+iw;

end;

procedure tform1.caption4measureitem(sender: tobject; acanvas: tcanvas;

var width

height: integer);

begin

height:=acanvas.textheight('caption1')+5;

width:=acanvas.textwidth('caption1')+5;

irate:=round(image1.height/(height*6));

iw:=round(image1.width /irate);

width:=width+iw;

end;

procedure tform1.caption5measureitem(sender: tobject; acanvas: tcanvas;

var width

height: integer);

begin

height:=acanvas.textheight('caption1')+5;

width:=acanvas.textwidth('caption1')+5;

irate:=round(image1.height/(height*6));

iw:=round(image1.width /irate);

width:=width+iw;

end;

procedure tform1.caption6measureitem(sender: tobject; acanvas: tcanvas;

var width

height: integer);

begin

height:=acanvas.textheight('caption1')+5;

width:=acanvas.textwidth('caption1')+5;

irate:=round(image1.height/(height*6));

iw:=round(image1.width /irate);

width:=width+iw;

end;

procedure tform1.caption1drawitem(sender: tobject; acanvas: tcanvas;

arect: trect; selected: boolean);

begin

drawitem(tmenuitem(sender)

acanvas

arect

selected

'caption1');

end;

procedure tform1.caption2drawitem(sender: tobject; acanvas: tcanvas;

arect: trect; selected: boolean);

begin

drawitem(tmenuitem(sender)

acanvas

arect

selected

'caption2');

end;

procedure tform1.caption3drawitem(sender: tobject; acanvas: tcanvas;

arect: trect; selected: boolean);

begin

drawitem(tmenuitem(sender)

acanvas

arect

selected

'caption3');

end;

procedure tform1.caption4drawitem(sender: tobject; acanvas: tcanvas;

arect: trect; selected: boolean);

begin

drawitem(tmenuitem(sender)

acanvas

arect

selected

'caption4');

end;

procedure tform1.caption5drawitem(sender: tobject; acanvas: tcanvas;

arect: trect; selected: boolean);

begin

drawitem(tmenuitem(sender)

acanvas

arect

selected

'caption5');

end;

procedure tform1.caption6drawitem(sender: tobject; acanvas: tcanvas;

arect: trect; selected: boolean);

begin

drawitem(tmenuitem(sender)

acanvas

arect

selected

'caption6');

end;

end.

one(type,data,fn)-JQuery API ready(fn)-JQuery API resize(fn)-JQuery API scroll(fn)-JQuery API select(fn)-JQuery API select()-JQuery API submit(fn)-JQuery API submit()-JQuery API toggle(even,odd)-JQuery API trigger(type)-JQuery API unbind(type,fn)-JQuery API unload(fn)-JQuery API Effects特效-JQuery API animate-JQuery API fadeIn(speed, callback)-JQuery API fadeOut(speed,callback)-JQuery API fadeTo(speed,opacity,callback)-JQuery API hide(speed,callback)-JQuery API hide()-JQuery API show(speed,callback)-JQuery API show()-JQuery API slideDown(speed,callback)-JQuery API slideToggle(speed,callback)-JQuery API slideUp(speed, callback)-JQuery API toggle()-JQuery API Javascript-JQuery API $.browser-JQuery API $.each(obj, fn)-JQuery API $.extend(target,prop1,propN)-JQuery API $.grep(array,fn,inv)-JQuery API $.map(array, fn)-JQuery API 请问以下我如何实现一个带滚动条的子窗口 问一下,resin和iis集成后class文件放在什么目录下 用 http://www.rc80.com (c# + sqlserver2000) 只想换一个.net 的完整的分页代码! 一个Corba客户端连接的问题! 如何在resin中设置wap服务器功能 大家帮忙!! 什么时候用DataGrid,什么时候用DataList? 怎么样从数据库里取得某字段的值??? 昆腾的硬盘修理找谁啊?急,UP有分........ www.webmatrixhosting.net免费空间中FTP文件上传问题 Apache 2.0.43 +Tomcat 4.1.24+mod_jk2-2.0.43.dll整合问题出现:The servlet container is temporary unavailable or being upgraded 我装的Delphi7好像丢了一个文件:Proxies.pas,哪位好心人给我一个? 人,真脆弱! 开水房追女之呕心沥血计划 (超暴笑) 孤独 急!!Image对象如何设置成为透明的???Thanks! 【憋的慌】大头、阳光呢!!! 关于FLASHMX的遮罩问题 一个问题,想不通! 【憋的慌】死水、一辉呢!!! 急!!!急!!!怎么在建表时使用一个时间函数??就是指出加这条这条文件的时间?? 【憋的慌】蓝心、风呢!!! 怎么获得一个应用程序的图标,比如我用进程ID,获得其主模块,然后怎么办! 【憋的慌】冰冰、贝贝呢!!! 我获得一个服务,可以检验综的状态什么的,可我想获得除了这个以后的东西比如:.... 【憋的慌】珊珊艾、CoolSlob呢!!! 关于adodc控件删除的求救 【憋的慌】冰儿、江风呢!!! 关于Apache wuxuan、kingzai、jemmylau各位版主,请问怎样才能得更多的可用分?我看有些人有几千分,真不解。 提示问题!菜鸟问题马上送分 请问哪有php安装程序下载? [散分]探望qxjavajava 使用gdiplus.lib出现下面的错误? 讨论MVC--Model这块的实现方法(不用EJB的情况)??还有那里有可以自动生成DAO和VO的比较不错的工具吗? 关于网络传销 关于个人bean的问题!!!! windows 2003 server 下为什么不能装sql的任何版本 挑战性问题:ToolBar为何在客户区?而MainFrameWnd的在非客户区?(高分) 一个奇怪的问题 再搞不定我要自杀啦。。。。。。。 求助!测试数据库的师傅来看一下啊(adodc 对象编程) 请问,图书怎样分类,分哪些类比较科学? 推荐几个比较好的C++的论坛吧 谁能帮我一下! 请大家帮助 给50分!!!!!!! 为水源200多位水友鸣不平,鄙视某人。。。 请教各位高手(菜鸟) 怎样把我的dll加到0x80000000以上地址? 200分谁知道,CRecordSet怎么样管理两个表 如何互相调用文件????????? 两地相距510km,两车相向而行,若同时出发,则5.1小时相遇,若乙车先出发2小时,两地相距510km,两车相向而行,若同时出发,则5.1小时相遇,若乙车先出发2小时,则驾车出发后四小时相遇, we bought one kilo of cheese .(就画线部分提问) cheewe bought one kilo of cheese .(就画线部分提问) cheese did you buy ? 替米考星,替米考星厂家,替米考星价格?以及应用? Let the boy --------[not leave】at once. How does your cousin spend her holiday?(用they换your cousin)改写 谁对兽药原料—甲磺酸加替沙星比较了解?帮忙介绍一下,谢谢! 求初一素描科幻画 本人只会素描! she began practicing her guitar skills for several hours each day,__when her fingers began tobleed.A.stop only B.stopped only C.only to stop D.only stopping答案为什么是D?C怎么错了? 氨苄西林钠原料药,兽用级,生物快车兽药原料直销处的产品怎么样? a,b两地相距510千米,甲,乙两车分别由两地相向而行,诺两车同时出发五又十分之一小时相遇,诺乙车先出发2小时,则甲车出发4小时后相遇, family当家人讲时是可数还是不可数的? 我最喜欢的动物是袋鼠【两种】英译汉 How do you like hamburgers and potato chips? 详细解释下family什么时候可数,什么时候不可数,families是指什么 兽药招商怎么做 A B 两地相距510km,甲 乙两车分别有两地相向而行.如果两车同时出发,那么两车5小又十分之一 小时相遇.如果乙车先出发2小时,那么甲车出发4小时后相遇,求两车速度. 洗浴所说的大保健什么意思 candy的英语文章 The bady drinks milk every day(对milk划线部分提问) eat,amy,an,doesn,it,ice-cream.连词成句 用50N的水平向右的力把质量为3千克的木块压在竖直墙上,这时木块正顺着墙壁面竖直向下匀速运动………请给出比较明白的解析,尽快,用50N的水平向右的力把质量为3千克的木块压在竖直墙上, My uncle drinks milk every day.一般疑问句并做肯定回答 Jenny is too fat,____ she doesn't eat ice-cream.A.and B.butC.so D.then选哪个? The Dragon Boat Festivai是什么意思?我急,能不能快点! My son has many milk every day .那错了?怎么改?呜呜~(>_ 放鸽子比喻什么 元稹 闻乐天左降江州司马 My sister has many milk every day改错 被放鸽子是什么意思? -What's the date today?-It's June 16.-Already?Then it's Dragon Boat Festival today.Already意思 这个故事发生在2012年,翻译成英语,用happen 还是take place 你不会不觉得跑进家来的小松鼠是可爱的吧?什么意思? 什么叫放鸽子?假如说你约了她,却因为有事情打了电话给他,跟他说,他又同意了叫放鸽子吗?(他还没出门) 哈奇小镇(魔法哈奇)的小翅膀在哪买? weekends,does,spend,his,how,brother,his(?)连词成句 “放鸽子”是什么意思啊? about today 歌词 some fruit 可以用单数也可以用复数吗?有何不同? 仿照 山中访友 中的拟人句描写山中的一个景物 Today we have a lesson in good h_______.We learn a lot about f_____and d_______.To be h_____,we eatToday we have a lesson in good h_______.We learn a lot about f_____and d_______.To be h_____,we eat n____ or r____and some vegetabies.They are healthy 关于机械能守恒以相同的初速度Vo 将物体从同一水平面分别竖直上抛、斜上抛、沿光滑的足够长的固定的斜面的表面上话.三次达到的高度分别是h1、h2、h3,不计空气阻力,则h1、h2、h3的关系是? “放鸽子”是指啥意思? 靠卵繁殖后代的动物叫什么 提问 有关机械能守恒什么时候机械能一定不守恒啊 怎样锻炼自己成为有恒心有毅力的人怎么都是方框啊 翻译 近几年人们的生活方式发生了巨大的变化(take place) 你不会不觉得跑进家来的小松鼠是可爱的吧?改为陈述句 他是个很有毅力的人 英语怎么说 用肺呼吸,产有硬壳的卵来繁殖后代的动物是什么快! 跑进家来的小松鼠中哥哥掏出手套会怎么说 怎样成为一个有恒心、有毅力的人?怎样做,才能改变自己的懒散? 除猫头鹰外,其它大部分猛禽是不是也像鸡那样只能白天活动,晚上看不到东西,睡觉? There are (two glasses of)milk on the table.对括号内提问Millie watches TV for two hours every week.改为同义句改为Millie watches( )( )( )TV every week 求详细回答,如何才能成为一个有毅力有恒心的人? 不可数名词是不是前面不能有冠词 那不可数名词可不可以什么都不带 好像He told me news 这样可以吗 we bought one kilo of cheese .(就画线部分提问)we bought one kilo of cheese . (就画线部分提问) cheese did you buy ? How does your friends go to school?中哪里错误 She wants (one kilo of)meat对括号部分提问 填空:( )like one kilo of oranges and two kilos of grapes.(in de shop)A.what can I( ) for you,sir?B.( ) like one kilo of oranges and two kilos of grapes.A.( ) else?B.No,thanks.How much do they( A.twelve yuan,please.B.Ok.thank you.here's the ( 从3件外观相同的物品中找1件物品(质量比其它两件轻),至少要用天平秤几次才能找出来? “中国梦”拥有世界舞台德媒:德美将达成互不监听协议 拟明年奇数为男偶数是女?2013年是“男性不堪昂贵房租 伦敦上班族住巴塞罗那坐走进马达加斯加塔马塔夫华侨学校世界最贵“粉红之星”钻石亮相纽约 估土耳其买或不买,中国导弹都赢了美摄影师冰冷海水中拍摄企鹅跳水【高清印度首都发生工厂火灾6人死亡 10多尼日利亚一教堂发生踩踏事故 致17人奇数为男偶数是女?2013年是“男性周观天下:美国的“偷窥瘾”世贸组织部长会议下月初在印尼巴厘岛举世贸组织部长会议下月初在印尼巴厘岛举俄摄影师“高空厨房”揭秘飞机餐(组图德美将达成互不监听协议 明年年初实施尼日利亚一教堂发生踩踏事故 致17人斯诺登将在俄“遥助”德国 作证“监听加拿大暴风雨30多万人受影响 部分地房租过高 白领伦敦上班住巴塞罗那坐飞尼日利亚一教堂发生踩踏事故 致17人Papi酱火得不要不要的,投资人如何该涨不涨,必会先跌收藏丨蛋糕房音乐播放指导手册华联股份000882暴涨即将到头后期在职研究生复试中容易被刷下来的有哪类神画出新品?神画二代产品V系列即将问两个人在一起很合适是什么感觉?钱存银行也能被偷,不如我们组团应聘重最高人民法院打造全球最大裁判文书数据市场准入负面清单草案发布 评:将最大中财办一月内三下“工业第一大省”江苏R9 Plus开售:有这样的旗舰,还北方创业:最新走势分析,主力暗藏先机意名记曝范佩西今夏加盟中超 曾拒绝申游族网络 后期展望精准预测,小散必看另类VR体验:躲得掉的咸猪手,躲不掉韩天宇带父母玩转泰国 体验滑翔伞台南学甲区一民宅起火夺三尸四命 不排候车亭不来电 台北市议员:台电恶整柯赖清德割爱 陈美伶确定任台“行政院秘中国法院信息化是推广中国司法模式的重
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘