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

利用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.

微App专场:不同平台下微App开发运营那些事 25载工程经验,HBase七年——BDTC2013讲师Michael Stack 或许对你创业有所启示:10个英国快速增长的科技创业公司 小米游戏中心10月报告:分析各种手游活动之优劣 欢网王智勇:传统电视厂商须补互联网基因 透露与百度合作细节 支付宝声波支付之初体验 首款使用HSA架构的Kaveri APU、多款异构计算开发工具APU13上齐亮相 分享10段实用的HTML5代码 十条建议送给那些初入职场的小白 这是要灭掉DC的节奏?谷歌欲推Android摄像头API 支持RAW 专访产品经理Markus Spiering:冬眠多年后的Flickr如何在夹缝中生存? 创业与投资专题论坛:硬件的现在!创业的未来? 造就Office新用法:微软推WP应用 可遥控Office文件 成为一名PHP专家其实并不难 前富士康CEO程天纵:创新来自长尾,创业源于创客! 最危险的开源项目——比特币 11月20日:微软正式发布Windows 1.0 回顾历代Windows版本界面 微软CEO鲍尔默卸职前在股东会上的最后演讲 微软改革员工排名制度或将开启新篇章 【快讯】SAP联合中国电信,又一外商公有云曲线入华 微软CloudOS云操作系统构建企业级三云合一 IE11支持JavaScript新型API,Web应用国际化更便捷 谷歌推订阅应用Play Newsstand:杂志+RSS阅读器 【信息图】到2020年开发者、设计师、测试员的数量将达到史无前例的高度 推广与盈利专题论坛:中国影响世界,世界定义中国 SlideIdea CEO李建忠:移动产品的技术面思考 BDTC→→百度林仕鼎、腾讯蒋杰、阿里唐洪论道大数据平台与技术 谷歌首席互联网布道师:隐私保护并不是一种正常行为 微软公开“挑衅”谷歌,出售反谷歌标语T恤 四大UX设计原则,打造网站最佳浏览体验 【BDTC讲师】黄晓庆:从小灵通到Hadoop与实时大数据分析 为什么不能筛选数据? 有关Acrobat 组件的错误 关于火车查询 CTreeCtrl 的同一item项被多次点击时,会出发什么消息?你知道吗? WINCE的市场 控件ID有何用? 初学XML,请问ASP传回的中文字怎么是乱码? 请问圆锥体侧面积计算公式是什么?快阿,正在考试!!!!!!!!!!!!!! (♂逍遙剑♂) 过来聊聊!进来! 怎样用文件的形式对数据库进行备份? 能在标题栏添加控件吗?谁能告诉我? 谁知道在Activex控件中事件执行顺序的问题 3山好可怜,被女人抓住了把柄,知道了粗细长短,哎。。。 想在odbc里用程序的方法建立驱动,怎么实现? vc编的DLL怎样处理LIB在BCB中可以直接用哦?我用WINAPI那个约定 救命的!!! 深圳的“同志”好多啊!有一个哥们还向我推荐了一个同志网站,可惜我不是同志,如果有同志需要的话,可以去找那些深圳同志接头! 有懂EJB ,weblogic 大连的朋友吗? to fightwolf:give she some color to see see. 装delphi 6之前是不是要装ie5.5? 现在有一个问题:在大数据量传输的情况下,想采用异步传送方式,请问如何实现? 关于比例问题!! 有人说:做程序员很累,但我很快乐?广大程序员朋友们,有谁同意这个说法吗? 那该怎么办? MFC开发的ActiveX怎么都是OCX,可不可以是DLL,如果可以该怎么做。 如何获得当前活动控件的引用? 哪里有获得指定IP地址的机器网卡MAC地址的源程序? 新手上路:请问系统安全的市场前景如何? 'select * from a where b like ''[as]%'''这一句有没有错呢? 哪能找到 VBScript 5.0 的联机文档 为什么第七期的杂志我还没收到啊!!~~,原以为提前先订几期,会早点收到!唉!~~ php打开CSV文件的问题!答来分去! 各位有用过aspchart这个控件的吗?为什么我不能生成图片呢? 我有一个问题大家帮我UP一下 用HTML可以制作留言版吗?有使用mailto的吗? 大哥们,小弟我准备学JAVA了给推荐几本好书吧!小弟不胜感激啊! 因为JAVA,我差点把机子砸了 网络协议相关——向大侠请教 longyear,来一下啊。 我的一个在installshield for vc6.0下制作的安装程序用installshield professional 6.1编译时出错 在运行期间只有这个控键的句柄如何知道它是不是TForm? 如何动态生成组件? CTreeCtrl 的item项已被选中,再次点击怎么触发同样的事件?我明白了,你明白了没有? 为什么有冬瓜、南瓜、西瓜却没北瓜?同样的,为什么有北京、南京、东京却没西京?这个问题困扰了偶好久…… 请问GetPane得到的是什么啊? 号外号外,上海热线的吸铁石电子信箱有60M的空间,是真是假啊,我真怀疑自己看花眼了,哪位帮我确定一下,这1分就请您笑纳了 关于报表的问题--为什么细节带只打印一条记录? 初学者特来请教! 有谁能够告诉我关于RS-232口,RS-485口的有关信息???? 这个VB怎办??? 这个cookie该怎么实现? 糖尿病人能吃木糖醇的口香糖吗?正常人吃木糖醇的口香糖会发胖吗?木糖醇到底是什么? 英语翻译panel公司的中文是什么`? $1500元等于多少人民币? 木糖醇(C5H12O5)是一种新型的甜味剂.“木糖醇是由多个原子构成的物质”这说法有错吗,为什么? 英语翻译 1500毫升=()立方分米填的是分数。 添加了非糖类甜味剂的食品有哪些 要不含糖的 rear mount on vessel console panel 怎么翻译? 1500毫升=(?)升=(?)立方米 属于甜味剂、防腐剂的食品添加剂有哪些分别列出甜味剂和防腐剂的名称 我国汉字的"六书”是指什么 1500-2000毫升相当几杯的水啊? ds1621中sendstop函数void sendstop() { SDA =0; SCL=1; _nop_(); SDA=1; i2c_busy=0; 汉字的构造有六书?有哪六书 重量和牛顿是怎样换算的要具体的换算公式啊 C51单片机 IIC总线中 用K=(K 汉字六书指的是什么 牛顿和千克能换算吗?怎么换算呢? 可变电阻器与可变电位器有什么区别? 汉字有六书之说 指的 lb换算成牛顿还是千克阿? 变阻器是通过改变连入电路中电阻线的()来改变电阻的器件,常见的有()和电位器.一滑轮变阻器的名牌上标有“2A 20Ω“的字样,其中2A表示() 20Ω表示() 汉字构造有六书之说,是指哪六书? 牛顿和千克的换算关于减速机选型,一般要计算扭矩,N*m,其中的“N”指的是牛顿力,或者说是千克力吧,现在问题是,有些地方说1Kg=1N(1米力矩上1牛可以拉动1Kg物体),有些地方说1Kg=9.8牛(自由 3296电位器做可变电阻接法3296电位器是有三个管脚,如何把三个管脚的电位器接成两个管教的可变电阻 根据词语的不同意思写句子尖锐 (1)物体有锋芒,容易刺破其他物体的:---------------------------------------------------------------------------------------------------(2)(言论、斗争等)激烈------------------ 急公斤与牛顿换算问题0.05--0.6KG剩以平方厘米等于多少N剩以平方米? 为什么I2C总线的SCL和SDL要串接电阻呢 根据句子的意思写词语.1:觉得意外或惊喜.2:冬季最寒冷的时期.3:能适应各种环境 在任何环境中都能满足. 牛顿和重量之间是怎么换算的?1牛=?KG. i2c为何加上拉电阻? 根据词语的 不同意思写句子生气:生命力,活力: 公斤和牛顿换算关系 sda?sda?什么来的? 根据词语的意思写句子 公斤和牛顿如何换算 1+1=?sdaasdasdasdadassssssssssssssss 根据下面句子的意思写词语.1.称心如意,感到非常满意的样子.2.争的向前,生怕落后.3.形容极度惊慌,行动失常的样子. 英磅/英寸怎么转换成牛顿/MM 比方说:25.5LB/IN转化成N/MM怎么转换 根据汉字的写法,从() 看() 牧() 友()炙() 书()例如“休”,左边是“人”,右边是“木”,人走到树木旁边,表示歇息的意思.按我上面这种说法来答. 《产品质量法》和国家标准《预包装食品标签通则》(GB7718)规定的食品标签必须标注的内容是什么? 牛顿怎样转换为吨 表示“书写”意思的汉字还有什么 规定国家标准格式的国标是哪个?国标号多少封皮丢了 想自己做一个也就是说国家标准的标准是什么? 液压扭矩扳手上显示单位是压力怎么转换力矩在使用液压扭矩扳手紧M30(10.9级)螺栓时,压力表上显示到350bar,能转换到力矩吗?有多大?M30(10.9级)预紧力极限值是多少?与压力表显示数值关系吗 在括号里填写与前面汉字意思相同的字组词.怨() ()冷 包() 愧() 阻() 枯() 寻() ()啸 胡萝卜素用英语怎么说 压力值怎么换算成力矩值液压力矩扳手上面的读数 (PIS mpa) 怎么换算成力矩值(N.m) 根据汉语意思填写英语不要在晚上和朋友到处闲逛.Don`t______ ________with your friends at night. 我想请问下,GB2760-2011中,固体饮料类的食品添加剂没有β胡萝卜素,但是在其他的食品中属于食品添加剂, 力矩3530N.m 怎么转换成 液压泵的压力MPa扭紧螺栓的时候是用个液压扳手,用力矩扳手,是3530N.m 现在要换算成压力,因为我用的是液压扳手,要看压力的,怎么换算,或者缺什么条件不能换 练好汉字的书写具体有何意义? 请问GB2760?请问GB2760中的甘油和苯甲酸钠的化学名称是什么,它们的规定用量是多少,标准是什么? 1N等于多少g 英语翻译要比较舒服的翻译,什么面板a,版面a,图层a,读着很不顺 1500克等于多少两? 1N/25cm等于多少g/25mm还有,请问1N/25mm等于多少g/25mm? 如何正确避免 甜味剂 如(木糖醇) 的危害 use bracket $1500等于多少人民币
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn