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

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

打开浏览器并进入指定网址-VB资料 得到用户的IP地址 -VB资料 电话拨号 -VB资料 电子邮件的标准格式 (RFC 822)-VB资料 断开拨号网络的连接-VB资料 断开与 Internet 的连接 -VB资料 发送电子邮件附件-VB资料 VB获得用户网络登录名 基 于Win95 的VB5 串 口 通 信 程 序 基于Win95的VB5串口通信程序 检测运程数据传送的断线-VB资料 简单电子邮件发送程序-VB资料 VB建立拨号联接 -VB资料 将所有窗口最小化-VB资料 VB利用IE控件访问Internet VB利用IE控件设计简易浏览器 VB利用Mscomm32控件判断MODEM是否打开,或者正在工作,并且判断拨号时是否遇忙音 VB利用TAPI进行电话拨号 利用VB访问Internet 利用VB设计聊天室 利用Visual Basic实现无线通讯 VB利用Winsock控件实现局域网通信 VB如何从 Internet 上取回某一个网页的內容? VB如何检测是否已连接到Internet? VB如何利用Winsock控件编写自己的Internet程序 VB如何每天抓取 Internet 上某一个网页中的图片来更换桌面的壁纸 VB如何启动拨号网路中的连线? VB如何使用MSCOMM32.OCX发送大于80H的字符,可否给个示例程序? VB如何用VB打开默认浏览器或默认发信程序? VB如何用Visual Basic编写小型的网络系统 VB如何在程序中启动 NT 的【拨号连接】对话框? 如何实现MicroHelp即状态栏的分段 麻烦各位介绍几个有SCJP模拟题的网址!谢谢!!!! 关于Read&Data! 现在只能显示最新的120篇,能不能家多点呀,例如最新1000篇? VS.net哪里有正式版的下载呀?大侠们有没有地址呀? 谁能告诉我哪儿有TR下载,不是TRW,谢谢!50分相送~ 求助!!急!急!…… console下可以用ado访问sql server数据库马? 诸位仁兄,帮小弟推荐一本学J2EE的书。 DataModule4.ClientDataSet1.Locate的问题求救! NetLocalGroupEnum 如何使用列举远程用户 谁有有关游戏开发方面的软件工程文章? 各位大虾有无利用VC打开JPEG(JPG)图像并显示的源代码? 有关单文档多视图的一个小问题,答出有100分可拿!!! 如何优化编译,让编译后的文件最小? 请问软件是vfp3.0写的但是现在只有6.0,能转换么?是否需要重新编译?怎么编译,谢谢 vs.net 在PHP中如何把E_MAIL同时发给两个人? 有关注册表和其他一些问题 正版的vs。net几张盘? 有rtlinux的RCS库开发经验的朋友们 ACCESS能够,为什么SQL SERVER却不能?? 怎样生成新窗口? 有一个按扭,点一下后运行别的exe文件,代码怎么编啊? 请教各位大虾,有关带串口的数码相机的咨询! 有一个按扭,点一下后运行别的exe文件,代码怎么编啊?另外,点一个按扭,使c;\file1的文件,拷贝到d;\file2 有rtlinux的RCS库开发经验的朋友们 100分呀,还有挑战性,一个有点难度的问题,再网格控间上如何添加事件!!! 回答问题有钱给...用ATL创建一个全局COM(只启动一个实例)供所有客户端使用 无助,真喜欢一位小姐(不是那个‘小姐’别误会)真太想知道她有没有男友了,请问有什么办法知道么? 我能过高程么 请教各位大侠,如何简单的实现游戏人物动作的控制? 自己开发了一个软件,用于写jsp是自动生成一些get set 以及连接数据库代码的 问个很简单的问题 简单的问题 假设一个C编程高手首次遇到“sinx=x-x^3/3!+x^5/5!-.....+(-1)^n*x^(2n+1)/(2n+1)!” 各位大虾有无用VC处理JPEG(JPG)图像文件格式的源代码? 谁发给我一张自考的学位证书,我的分全给他! BCB6的5张光盘内容?? system.data.sqlclient 和system.data.oledb 请问怎么抓IP包 各位VB数据库编程高手看看啊!有谁能解? 钩子! 您想学习Delphi 6新功能WebSnap吗?进来看看吧! 我想再了解一下实例和共享变量的有关问题? ICQ的非ICQ联系,怎么导入和导出? 谁告诉我如何使用java创建,分析,修改一个xml,给我例子 有关writeprocessmemory的问题,大侠请进 web service求教 dll调用的问题: 求学数表达式导数开形的算法? 请问我们这里的高岭土开采价值如何?二氧化硅 54.55 氧化铝25.72 三氧化二铁 3.09 二氧化钛 1.13 烧失量11.51 题量多一点 八年级下册物理期中试卷压强公式 目前,中国已经是世界第几大温室气体排放国 常温下,在27.5g水中溶解12.5gCuso4`‘5H2O(式量为250).恰好达到饱和,该溶液密度为1.21g/cm的立方1)该溶液中溶质电离出的隂阳离子的总物质的量2)该溶液中的Cuso4的物质的量的浓度3)取出20ml该溶液,配 金钱 爱情 生命 哪个重要?3Q同样重要 美国为什么成为世界上温室气体排放量最大的国家如题 常温下在27.5g水中溶解12.5gCuSO4.5H2O,恰好达到饱和,该溶液密度为1.21g/cm3溶液中的溶质是什么,是五水硫酸铜还是硫酸铜?其他关于溶解带有结晶水的物质的问题中的溶质又是什么?这道题中溶质的 生命和爱情还有金钱谁重要·?3Q 目前,中国已经是世界第( )大温室气体排放国 A 1 B2 C3 D4 NaHCO3+SO2反应方程式 “温室气体”都包含哪些? 喷塑前处理不知道哪位从事过喷塑的朋友帮我解答一下:1、喷塑前有脱脂、酸洗、表调、磷化等还有没有其它的工序?2、以上所有的工序的操作顺序是怎样的?比如是先表调还是先酸洗,希望 用汽油添加剂真的可以提高汽油标号吗? 知识方面的小常识!3Q! 在镀锌板表面喷塑起泡是怎么回事? (选择题)用跟毛皮摩擦过的橡胶棒接触带电的验电器的金属球,发现验电器的金属箔先合拢后张开,则______A 验电器原来带负电,后来带正电B 验电器原来带正电,后来带负电C 验电器先后都带正 求NaHSO3与HNO3的反应方程式 细菌靠把有机物分解成无机物获得能量来生活,这是为什么?按理来说,不是有机物才有能量的吗?他把有机物都分解了,能量何来?而且他说他只是把有机物分解成无机物,也没说他自己吸收无机物 温室气体中危害最大的气体 NaHSO3溶液与稀硝酸反应的离子方程式还有 过量二氧化硫通入澄清石灰水中的离子方程式 用澄清石灰水怎样区分一氧化碳和二氧化碳 温室气体的最大危害是什么 试举例两种常见的温室气体 说明它们在化工生产中有何用途希望能得到点有用的东西 没办法啊 NaHSO3与HNO3NaHSO3粉末与硝酸反应是怎样的?如果是NaHSO3溶液与硝酸呢?硝酸浓度不同会不会发生不同的反应?听别人说有硝铵什么的,这个反应会不会生成硝铵啊... 一个圆柱形铁皮油桶内装满汽油,现在倒出汽油的的60%后,还剩30升汽油,如果这个油桶的底面积是10平方分米 吸收SO2用NaHSO3还是Na2SO3/ 将NaHSO3粉末加入HNO3溶液中发生的反应答案提示上说NaHO3粉末加入HNO3溶液中,开始产生气体,当HNO3浓度很小时放出SO2气体,当HNO3溶液浓度适中时产生氮的氧化物.求这几个阶段的化学方程式.请加 石灰水加二氧化碳的化学方程式是什么 Na2SO3+SO2+H2O为什么会生成NaHSO3啊?原理. 有概念,公式,记住是粤沪版的,不是人教版的~ 温室气体的主要成分及危害juti Na2SO3+SO2+H2O为什么会生成NaHSO3?他们不是拥有同一个酸根SO3-?为什么还能反应? 骨头是由什么成分组成的拜托各位了 3Q 至少指出最常见的两种温室气体,并说明它们最大的危害是什么? 用毛皮摩擦过的橡胶棒去接触带电的验电器,验电器的张角变小,则验电器带什么电( )选项A 正电 B 负电 C 可能负电可能正电 D 可能不带电答案给的是A,但是也有人认为是D请给予正确答案, kClO3和NaHSO3反应放热吗? 温室气体的最大危害是什么?试列举两种最常见的温室气体,并说明它们在化工生产中有何用途(各举两例)? 将用毛皮摩擦过的橡胶棒接触已带了电的验电器金属球,发现金属箔张角先减小为零后又张开,这是什么原因?验电器原来带什么电?第二问我知道,是正电?帮我解释下市什么原因吧,不懂 为什么 H2SO4 与KCLO3反应方程式?H2SO4 与KCLO3反应方程式是什么?爆炸性气体生成.其他条件都没有. 温室气体的最大危害是什么?试列举两种最常见的温室气体,并说明它们在化工生产中有 人生在生命中最重要是什么?人是动物吗?拜托各位了 3Q 手持金属棒与丝绸摩擦.金属棒不带电.为什么? Na2CO3 和 SO2反应Na2co3和SO2如何反应?子曾经曰过要分三步进行,写出SO2少量,较少,过量时的反应方程式. NaCO3和SO2反应方程式 人体什么细胞具有分裂能力?3Q NaHCO3能与什么反应生成Na2CO3?除NaOH外 茎具有运输功能,能够运输 A水,无机盐,二氧化碳 B 水,无机盐,有机物 人体中所含那些元素把人体中所含元素写出来最好把它按比重排列一下~ 3m燃油系统清洁添加剂7029[100mL]每瓶可混多少93号汽油,依据什么? NaCO3与SO2反应吗 人体含有哪几种元素 燃油系统清洁添加剂作用大吗? 动物能从外界摄取水、无机盐和二氧化碳来制造有机物吗? 新装修的房子哪些绿植有净化空气的作用 请问汽油清洁添加剂平时能不能使用? 向NaCO3溶液中通入SO2的离子反应方程式 写出详细过程 刚搬刚新装修的房子,请问多放绿植可以减少室内有化学污染吗?有什么办法完全袪除室内有毒物质呀? 某科研小组用高岭土(主要成分是Al2O3.2SiO2.8226.2H2O并含少量CaO、Fe2O3)研制新型净水剂(铝的化合物),其实验步骤如下::将土样和纯碱混匀,加热熔融,冷却后用水浸取熔块,过滤,弃去残渣,滤液用盐 被称作活化石的海洋生物是什么 图片 八年级下册物理期中试卷(新课程)谁有啊,现在
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘