进入旧版 | 服务项目 | 成功案例 | 联系方式 | 过客留言 | 友情链接
   
设为首页
加入收藏
联系我们
网站首页 | 新闻资讯 | 操作系统 | 办公软件 | 网络软件 | 工具软件 | 媒体动画 | 网页制作 | 网站开发 | 程序开发 | 平面设计
Photoshop视频教程 | Word入门 | Flash入门 | JScript | VBScript | ASP | PHP | ADO | 网页特效 | 3DS MAX6.0命令 | 系统进程
您当前的位置:GOODSGY电脑学习网 -> 程序开发 -> DLEPHI -> 文章内容  
利用Delphi消息处理建立类似Windows开始菜单

利用Delphi美化你的菜单www.goodsgy.com

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


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

       OnMeasureItem事件的定义如下:www.goodsgy.com

       type TMenuMeasureItemEvent = procedure (Sender: TObject; ACanvas: TCanvas; www.goodsgy.com

var Width, Height: Integer) of object;www.goodsgy.com

property OnMeasureItem: TMenuMeasureItemEvent;www.goodsgy.com

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

OnDrawItem事件的定义如下:www.goodsgy.com

type TMenuDrawItemEvent = procedure (Sender: TObject; ACanvas: TCanvas; www.goodsgy.com

ARect: TRect; Selected: Boolean) of object;www.goodsgy.com

property OnDrawItem: TMenuDrawItemEvent;www.goodsgy.com

该事件在菜单绘制时引发,其中参数Acanvas定义菜单绘制对象,参数Arect制定菜单的绘制区域,参数Selected定义当前菜单项是否被选中。www.goodsgy.com

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

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

下面来介绍具体的程序,首先利用图像软件建立一个长条型的位图文件(你可以根据你的需要设定图像的高宽比,在我的图像中是10:1)。在Delphi中建立一个新的工程,在Form1中加入一个TImage控件,将控件的AutoSize属性设置为True。然后在Form1中加入一个TMainMenu控件,将它的OwnerDraw属性设置为True(这一点很重要,否则程序无法实现)在该TMainMenu下加入6个TMenuItem对象(鼠标右健点击TMainMenu控件,然后点击弹出菜单的Menu Designer 项,就可以在设计窗口中添加菜单条了),将它们的Name属性分别设置为 Caption1、Caption2、…、Caption6。www.goodsgy.com

下面是具体的程序清单:www.goodsgy.com

unit OwnerMenu;www.goodsgy.com

 www.goodsgy.com

interfacewww.goodsgy.com

 www.goodsgy.com

useswww.goodsgy.com

  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,www.goodsgy.com

  Menus, ExtCtrls, StdCtrls, ImgList;www.goodsgy.com

 www.goodsgy.com

typewww.goodsgy.com

  TForm1 = class(TForm)www.goodsgy.com

    MainMenu1: TMainMenu;www.goodsgy.com

    Main1: TMenuItem;www.goodsgy.com

    Caption1: TMenuItem;www.goodsgy.com

    Caption2: TMenuItem;www.goodsgy.com

    Caption3: TMenuItem;www.goodsgy.com

    Caption4: TMenuItem;www.goodsgy.com

    Caption5: TMenuItem;www.goodsgy.com

    Caption6: TMenuItem;www.goodsgy.com

    Image1: TImage;www.goodsgy.com

    procedure Caption1MeasureItem(Sender: TObject; ACanvas: TCanvas;www.goodsgy.com

      var Width, Height: Integer);www.goodsgy.com

    procedure Caption2MeasureItem(Sender: TObject; ACanvas: TCanvas;www.goodsgy.com

      var Width, Height: Integer);www.goodsgy.com

    procedure Caption3MeasureItem(Sender: TObject; ACanvas: TCanvas;www.goodsgy.com

      var Width, Height: Integer);www.goodsgy.com

    procedure Caption4MeasureItem(Sender: TObject; ACanvas: TCanvas;www.goodsgy.com

      var Width, Height: Integer);www.goodsgy.com

    procedure Caption5MeasureItem(Sender: TObject; ACanvas: TCanvas;www.goodsgy.com

      var Width, Height: Integer);www.goodsgy.com

    procedure Caption6MeasureItem(Sender: TObject; ACanvas: TCanvas;www.goodsgy.com

      var Width, Height: Integer);www.goodsgy.com

    procedure Caption1DrawItem(Sender: TObject; ACanvas: TCanvas;www.goodsgy.com

      ARect: TRect; Selected: Boolean);www.goodsgy.com

    procedure Caption2DrawItem(Sender: TObject; ACanvas: TCanvas;www.goodsgy.com

      ARect: TRect; Selected: Boolean);www.goodsgy.com

    procedure Caption3DrawItem(Sender: TObject; ACanvas: TCanvas;www.goodsgy.com

      ARect: TRect; Selected: Boolean);www.goodsgy.com

    procedure Caption4DrawItem(Sender: TObject; ACanvas: TCanvas;www.goodsgy.com

      ARect: TRect; Selected: Boolean);www.goodsgy.com

    procedure Caption5DrawItem(Sender: TObject; ACanvas: TCanvas;www.goodsgy.com

      ARect: TRect; Selected: Boolean);www.goodsgy.com

    procedure Caption6DrawItem(Sender: TObject; ACanvas: TCanvas;www.goodsgy.com

      ARect: TRect; Selected: Boolean);www.goodsgy.com

  privatewww.goodsgy.com

    { Private declarations }www.goodsgy.com

  publicwww.goodsgy.com

    procedure DrawItem(Sender: TMenuItem; ACanvas: TCanvas;ARect: TRect;www.goodsgy.com

      Selected: Boolean;strOUt:String);www.goodsgy.com

    { Public declarations }www.goodsgy.com

  end;www.goodsgy.com

 www.goodsgy.com

varwww.goodsgy.com

  Form1: TForm1;www.goodsgy.com

  i,iH,Ind,iW,iRate:Integer;www.goodsgy.com

  rTemp:TRect;www.goodsgy.com

  iG1,iG2:Integer;www.goodsgy.com

 www.goodsgy.com

implementationwww.goodsgy.com

 www.goodsgy.com

{$R *.DFM}www.goodsgy.com

 www.goodsgy.com

procedure TForm1.DrawItem(Sender: TMenuItem; ACanvas: TCanvas;ARect: TRect;www.goodsgy.com

        Selected: Boolean;strOut:String);www.goodsgy.com

varwww.goodsgy.com

  j:Integer;www.goodsgy.com

beginwww.goodsgy.com

  i:=ARect.Bottom -ARect.Top;   //获得贴图的高度和宽度www.goodsgy.com

  Ind:=Sender.MenuIndex;www.goodsgy.com

  iH:=Round(Image1.Height/6*Ind);         //获得贴图位置www.goodsgy.com

  //将Image上相应位置的位图复制到菜单上www.goodsgy.com

  StretchBlt(ACanvas.Handle,ARect.Left,ARect.Top,iW,i,Image1.Canvas.Handle,0,iH,www.goodsgy.com

    Image1.Width,Round(Image1.Height/6),SRCCOPY);www.goodsgy.com

 www.goodsgy.com

  if Selected then begin        //该菜单项被选中www.goodsgy.com

    ACanvas.Font.Color := clWhite;www.goodsgy.com

    rTemp:=ARect;www.goodsgy.com

    rTemp.Left := rTemp.left+iW;www.goodsgy.com

    iG1:=Round((rTemp.Right - rTemp.Left)/10);www.goodsgy.com

 www.goodsgy.com

    rTemp.Right := rTemp.Left +iG1;www.goodsgy.com

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

      ACanvas.Brush.Color := RGB(0,0,j*25);www.goodsgy.com

      ACanvas.FillRect(rTemp);www.goodsgy.com

 www.goodsgy.com

      rTemp.Left := rTemp.Left +iG1;www.goodsgy.com

      rTemp.Right := rTemp.Left +iG1;www.goodsgy.com

    end;www.goodsgy.com

  endwww.goodsgy.com

  else begin            //该菜单项没有被选中www.goodsgy.com

    ACanvas.Brush.Color := cl3DLight;   //设置背景色为浅灰www.goodsgy.com

    rTemp:=ARect;www.goodsgy.com

    rTemp.Left := rTemp.left+iW;www.goodsgy.com

    ACanvas.FillRect(rTemp);www.goodsgy.com

    ACanvas.Font.Color := clBlack;www.goodsgy.com

  end;www.goodsgy.com

  //设置Canvas的画笔填充模式为透明www.goodsgy.com

  ACanvas.Brush.Style:=bsClear;www.goodsgy.com

  //在菜单上输出文字www.goodsgy.com

  ACanvas.TextOut(ARect.Left+iW+5,ARect.Top,strOut);www.goodsgy.com

end;www.goodsgy.com

 www.goodsgy.com

procedure TForm1.Caption1MeasureItem(Sender: TObject; ACanvas: TCanvas;www.goodsgy.com

  var Width, Height: Integer);www.goodsgy.com

beginwww.goodsgy.com

  //在OnMeasureItem事件中改变菜单的宽度和高度,下面5个程序同www.goodsgy.com

  //改变菜单的宽度和高度以容纳文本www.goodsgy.com

  Height:=ACanvas.TextHeight('Caption1')+5;www.goodsgy.com

  Width:=ACanvas.TextWidth('Caption1')+5;www.goodsgy.com

  iRate:=Round(Image1.Height/(Height*6));www.goodsgy.com

  iW:=Round(Image1.Width /iRate);www.goodsgy.com

  Width:=Width+iW;      //根据计算改变菜单宽度以容纳附加的文本www.goodsgy.com

end;www.goodsgy.com

 www.goodsgy.com

procedure TForm1.Caption2MeasureItem(Sender: TObject; ACanvas: TCanvas;www.goodsgy.com

  var Width, Height: Integer);www.goodsgy.com

beginwww.goodsgy.com

  Height:=ACanvas.TextHeight('Caption1')+5;www.goodsgy.com

  Width:=ACanvas.TextWidth('Caption1')+5; www.goodsgy.com

  iRate:=Round(Image1.Height/(Height*6));www.goodsgy.com

  iW:=Round(Image1.Width /iRate);www.goodsgy.com

  Width:=Width+iW;www.goodsgy.com

end;www.goodsgy.com

 www.goodsgy.com

procedure TForm1.Caption3MeasureItem(Sender: TObject; ACanvas: TCanvas;www.goodsgy.com

  var Width, Height: Integer);www.goodsgy.com

beginwww.goodsgy.com

  Height:=ACanvas.TextHeight('Caption1')+5;www.goodsgy.com

  Width:=ACanvas.TextWidth('Caption1')+5; www.goodsgy.com

  iRate:=Round(Image1.Height/(Height*6));www.goodsgy.com

  iW:=Round(Image1.Width /iRate);www.goodsgy.com

  Width:=Width+iW;www.goodsgy.com

end;www.goodsgy.com

 www.goodsgy.com

procedure TForm1.Caption4MeasureItem(Sender: TObject; ACanvas: TCanvas;www.goodsgy.com

  var Width, Height: Integer);www.goodsgy.com

beginwww.goodsgy.com

  Height:=ACanvas.TextHeight('Caption1')+5;www.goodsgy.com

  Width:=ACanvas.TextWidth('Caption1')+5; www.goodsgy.com

  iRate:=Round(Image1.Height/(Height*6));www.goodsgy.com

  iW:=Round(Image1.Width /iRate);www.goodsgy.com

  Width:=Width+iW;www.goodsgy.com

end;www.goodsgy.com

 www.goodsgy.com

procedure TForm1.Caption5MeasureItem(Sender: TObject; ACanvas: TCanvas;www.goodsgy.com

  var Width, Height: Integer);www.goodsgy.com

beginwww.goodsgy.com

  Height:=ACanvas.TextHeight('Caption1')+5;www.goodsgy.com

  Width:=ACanvas.TextWidth('Caption1')+5; www.goodsgy.com

  iRate:=Round(Image1.Height/(Height*6));www.goodsgy.com

  iW:=Round(Image1.Width /iRate);www.goodsgy.com

  Width:=Width+iW;www.goodsgy.com

end;www.goodsgy.com

 www.goodsgy.com

procedure TForm1.Caption6MeasureItem(Sender: TObject; ACanvas: TCanvas;www.goodsgy.com

  var Width, Height: Integer);www.goodsgy.com

beginwww.goodsgy.com

  Height:=ACanvas.TextHeight('Caption1')+5;www.goodsgy.com

  Width:=ACanvas.TextWidth('Caption1')+5; www.goodsgy.com

  iRate:=Round(Image1.Height/(Height*6));www.goodsgy.com

  iW:=Round(Image1.Width /iRate);www.goodsgy.com

  Width:=Width+iW;www.goodsgy.com

end;www.goodsgy.com

 www.goodsgy.com

procedure TForm1.Caption1DrawItem(Sender: TObject; ACanvas: TCanvas;www.goodsgy.com

  ARect: TRect; Selected: Boolean);www.goodsgy.com

beginwww.goodsgy.com

  DrawItem(TMenuItem(Sender),ACanvas,ARect,Selected,'Caption1');www.goodsgy.com

end;www.goodsgy.com

 www.goodsgy.com

procedure TForm1.Caption2DrawItem(Sender: TObject; ACanvas: TCanvas;www.goodsgy.com

  ARect: TRect; Selected: Boolean);www.goodsgy.com

beginwww.goodsgy.com

  DrawItem(TMenuItem(Sender),ACanvas,ARect,Selected,'Caption2');www.goodsgy.com

end;www.goodsgy.com

 www.goodsgy.com

procedure TForm1.Caption3DrawItem(Sender: TObject; ACanvas: TCanvas;www.goodsgy.com

  ARect: TRect; Selected: Boolean);www.goodsgy.com

beginwww.goodsgy.com

  DrawItem(TMenuItem(Sender),ACanvas,ARect,Selected,'Caption3');www.goodsgy.com

end;www.goodsgy.com

 www.goodsgy.com

procedure TForm1.Caption4DrawItem(Sender: TObject; ACanvas: TCanvas;www.goodsgy.com

  ARect: TRect; Selected: Boolean);www.goodsgy.com

beginwww.goodsgy.com

  DrawItem(TMenuItem(Sender),ACanvas,ARect,Selected,'Caption4');www.goodsgy.com

end;www.goodsgy.com

 www.goodsgy.com

procedure TForm1.Caption5DrawItem(Sender: TObject; ACanvas: TCanvas;www.goodsgy.com

  ARect: TRect; Selected: Boolean);www.goodsgy.com

beginwww.goodsgy.com

  DrawItem(TMenuItem(Sender),ACanvas,ARect,Selected,'Caption5');www.goodsgy.com

end;www.goodsgy.com

 www.goodsgy.com

procedure TForm1.Caption6DrawItem(Sender: TObject; ACanvas: TCanvas;www.goodsgy.com

  ARect: TRect; Selected: Boolean);www.goodsgy.com

beginwww.goodsgy.com

  DrawItem(TMenuItem(Sender),ACanvas,ARect,Selected,'Caption6');www.goodsgy.com

end;www.goodsgy.com


end.
www.goodsgy.com

在百度中搜索:利用Delphi消息处理建立类似Windows开始菜单
在Google中搜索:利用Delphi消息处理建立类似Windows开始菜单
在Yahoo中搜索:利用Delphi消息处理建立类似Windows开始菜单

收藏到网摘:新浪VIVI 365key 我摘 POCO网摘 博采中心 YouNote 和讯网摘 天天收藏
[] [返回上一页] [打 印] [收 藏]

 相关文章    最新文章
· 利用Word将PDF转换DOC文件
· [图文] 利用“替换”功能来实现Word表格的..
· 利用注册表清除Word文档杀手病毒
· [组图] 利用Photoshop巧妙将人物改成“水人..
· [组图] 利用阴影的错觉,用Photoshop制作边..
· 在Excel中利用VBA创建多级选单
· [图文] 利用Win XP实现网络远程统一关机
· 巧妙利用QQ截图功能截取右键菜单图像
· 在Java中利用JCOM实现仿Excel编程详解
· [图文] 利用C#远程存取Access数据库
 
· 小技巧:如何用Delphi创建快捷方式
· Delphi版模仿熊猫烧香病毒核心源码
· Delphi“判断服务器路径”与“清空日志文..
· 应用程序敏感键的实现
· 用Delphi实现远程屏幕抓取
· 用DEPHI为应用软件建立注册机制
· 利用Hook技术实现键盘监控
· Delphi编程实现Ping操作
· 通用Delphi数据库输入控件DBPanel的实现
· 用Delphi开发屏幕保护预览程序

∷相关文章评论∷    (评论内容只代表网友观点,与本站立场无关!) [更多评论…]
站内搜索

精彩图文
  网站导航  
操作系统 办公软件 网络软件
Vista Windows2003 WindowsXP Windows2000/NT Windows9X/ME Linux 其他 Word Excel Powerpoint Outlook 金山系列 其他 网页浏览 上传下载 联络聊天 邮件工具 服务器软件 网络辅助
工具软件 媒体动画 网页制作
系统工具 媒体工具 压缩工具 图文处理 文件管理 其他 3DMAX Authorware Director Maya 视频处理 其他 Flash Dreamweaver FireWorks FrontPage LiveMotion Golive HTML/CSS 其它
网站开发 平面设计 程序设计
ASP JSP PHP CGI JavaScript VBScript XML/SOAP Web服务器 Photoshop PhotoImpact CorelDraw Illustrator Freehand 设计欣赏 其他 VB VC .NET C/C++ DELPHI JAVA

冀ICP备05019428号
Copyright © 2004-2008 电脑学习网 Inc.All rights reserved.
TEL:13832340607
QQ:39873155
E_Mail:goodsgy(#)hotmail.com   (把(#)替换成@)
MSN:goodsgy(#)hotmail.com   (把(#)替换成@)