首 页 网络编程
网页制作 图形图象 操作系统 冲浪宝典
软件教学 认证考试

网络安全 网络办公 行业资讯 评测对比
您当前位置:站长天空 -> 软件教学-> 压缩工具
用delphi做一个有颜色属性的按钮_delphi教程
作者:网友供稿 点击:0
推荐
西部数码-全国虚拟主机10强!20余项虚拟主机管理功能,全国领先!第6代双线路虚拟主机,南北访问畅通无阻!可在线rar解压,自动数据恢复设置虚拟目录等.免费赠送访问统计,企业邮局.Cn域名注册10元/年,自助建站480元起,免费试用7天,满意再付款!P4主机租用799元/月.月付免压金
站内搜索
文章页数:[1] 

Delphi做一个有颜色属性的按钮

http://www.netgocn.com 原创

在标准的Windows程序中所有按钮均没有颜色。因此Delphi提供的所有按钮组件也均无颜色属性,有时你可能做了一个五颜六色的程序界面,而按钮颜色可能很不相称。
    在此本人提供一种用自定义组件制作有颜色属性的铵钮的方法,它遵循了Delphi的组件定义规则,完成后该按钮与普通按钮(Button)相比,多了一个Color属性,你可以永远地使用它,在设计阶段随意地改变颜色,就象是Delphi本身提供的组件一样(本文代码在Delphi 4.0下完成)。
第一步
   
打开Delphi,选择菜单的Component/New Component选项,在弹出对话框的Ancestor type下拉框中手工填入或下拉选择TButton,这是选择了我们自定义组件的祖先类,我们将以此为基础完成自定义组件的下一步代码编写(这也是自定义组件编写的第一步)。对话框中的其余可编写内容就随你的高兴而填写了,但是你必须注意Class Name(类名)不能和已有的(包括你自定义的)类名相同,同时还应该记住该自定义组件的安装位置(Palette Page下拉框中的内容)和单元文件在磁盘上的存放位置(Unit file name编辑框内容),不然以后你在何处去找它?本文以 Delphi的默认值TButton1为类名。
第二步
    做完以上工作后,按下面的OK按钮,Delphi将为你自动生成一个基本的组件代码,对这样的代码框架一般没有必要修改,一定要修改的话请注意Delphi的组件定义规则(本文只是删除了所有自动生成的注释内容),接着就应该将其文件存盘。
第三步
    在上面的代码框架中添加我们的代码,当然这是我们要做的主要工作。

1.      Delphi自动生成的单元文件的数据类型定义部份修改为:
type
TButton1 = class(TButton)
private
  FColor:TColor;
  FCanvas: TCanvas;
  IsFocused: Boolean;
  procedure SetColor(Value:TColor);
  procedure CNDrawItem(var Message: TWMDrawItem); message CN_DRAWITEM;
protected
  procedure CreateParams(var Params: TCreateParams); override;
  procedure SetButtonStyle(ADefault: Boolean); override;
public
  constructor Create(AOwner: TComponent); override;
  destructor Destroy; override;
published
  property Color:TColor read FColor write SetColor default clWhite;
end;
说明:
    a. 我们只添加了一个属性,因此在published段的代码下只有一个Color属性,并将默认颜色设为白色(clWhite,当然你可以随意改变)。
    b. 重载构造函数和析构函数,二者应为可以在外部调用,因此应将其放在public段。
    c. 读属性的私有数据域FColor和属性的写方法SetColor,应放在私有段(private),其它与此相关的非独立的变量和过程/函数等也应放在private段,以使在类以外不能访问它们。

2.      Delphi自动生成的 procedure Register可以不理它。我们在它的过程体之后,在end.(注意符号“.”)之前手工加上以下代码,完成我们在上面定义的全部过程的过程体编写(这里我们没有定义有函数原型):

//*** 构造函数 *****************************************************
constructor TButton1.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  FCanvas := TCanvas.Create;
  FColor:=clWhite;//默认颜色
end;

//*** 析构函数 *************************************************
destructor TButton1.Destroy;
begin
  FCanvas.Free;
  inherited Destroy;
end;

//*** 定义按钮样式,必须将该按钮重定义为自绘式按钮 *************
procedure TButton1.CreateParams(var Params: TCreateParams);
begin
  inherited CreateParams(Params);
  with Params do Style := Style or BS_OWNERDRAW;
end;

//*** 属性写方法 ************************************************
procedure TButton1.SetColor(Value:TColor);
begin
  FColor:=Value;
  Invalidate;
end;

//*** 设置按钮状态***********************************************
procedure TButton1.SetButtonStyle(ADefault: Boolean);
begin
  if ADefault <> IsFocused then
  begin
    IsFocused := ADefault;
    Refresh;
  end;
end;

//*** 绘制按钮 ***************************************************
procedure TButton1.CNDrawItem(var Message: TWMDrawItem);
var
  IsDown, IsDefault: Boolean;
  ARect: TRect;
  Flags: Longint;
  DrawItemStruct: TDrawItemStruct;
  wh:TSize;
begin
  DrawItemStruct:=Message.DrawItemStruct^;
  FCanvas.Handle := DrawItemStruct.hDC;
  ARect := ClientRect;
  with DrawItemStruct do
  begin
    IsDown := itemState and ODS_SELECTED <> 0;
    IsDefault := itemState and ODS_FOCUS <> 0;
  end;

  Flags := DFCS_BUTTONPUSH or DFCS_ADJUSTRECT;
  if IsDown then Flags := Flags or DFCS_PUSHED;
  if DrawItemStruct.itemState and ODS_DISABLED <> 0 then
     Flags := Flags or DFCS_INACTIVE;

  if IsFocused or IsDefault then
  begin
    //按钮得到焦点时的状态绘制
    FCanvas.Pen.Color := clWindowFrame;
    FCanvas.Pen.Width := 1;
    FCanvas.Brush.Style := bsClear;
    FCanvas.Rectangle(ARect.Left, ARect.Top, ARect.Right, ARect.Bottom);
    InflateRect(ARect, -1, -1);
  end;

  FCanvas.Pen.Color := clBtnShadow;
  FCanvas.Pen.Width := 1;
  FCanvas.Brush.Color := FColor;
  if IsDown then begin
    //按钮被按下时的状态绘制
     FCanvas.Rectangle(ARect.Left , ARect.Top, ARect.Right, ARect.Bottom);
     InflateRect(ARect, -1, -1);
  end else
     //绘制一个未按下的按钮
     DrawFrameControl(DrawItemStruct.hDC, ARect, DFC_BUTTON, Flags);
  FCanvas.FillRect(ARect);

  //绘制Caption文本内容
  FCanvas.Font := Self.Font;
  ARect:=ClientRect;
  wh:=FCanvas.TextExtent(Caption);
  FCanvas.Pen.Width := 1;
  FCanvas.Brush.Style := bsClear;
  if not Enabled then
  begin //按钮失效时应多绘一次Caption文本
     FCanvas.Font.Color := clBtnHighlight;
     FCanvas.TextOut((Width div 2)-(wh.cx div 2)+1,
                     (height div 2)-(wh.cy div 2)+1,
                      Caption);
     FCanvas.Font.Color := clBtnShadow;
  end;
  FCanvas.TextOut((Width div 2)-(wh.cx div 2),(height div 2)-(wh.cy div 2),Caption);

  //绘制得到焦点时的内框虚线
  if IsFocused and IsDefault then
  begin
     ARect := ClientRect;
     InflateRect(ARect, -4, -4);
     FCanvas.Pen.Color := clWindowFrame;
     FCanvas.Brush.Color := FColor;
     DrawFocusRect(FCanvas.Handle, ARect);
  end;
  FCanvas.Handle := 0;
end;
//** The End *********************************************************
end.

第四步:检查确认无误后选择Delphi菜单的Component/Install Component选项,在Unite file name编辑框中确认你的文件路径和名称后按OK按钮,Delphi将编译、安装该组件。
      
如果你完全按本文步聚进行,在编译安装无误后,你可以在Delphi组件标签的Samples标签页中找到一个图标和TButton一样的按钮。新建一个工程并将这个我们自义的按钮放置在Form上其默认的名称是Button11,你会看到一个白色的按钮。怎么样?通过其Color属性你以随意设置它的颜色。
     
最后说明:本文中的按钮绘制方式采用了和Delphi本身的TButton相似的绘制方式,以达到和Delphi按钮相似的动作外观。然而你想要发挥的话你可以在FCanvas这块画布上绘制任意的、你想要的、可以表达你的个性的所有文字和图形。

 有何问题请来信或留言。
欢迎试用本站软件:NetGoCN(网行)



文章整理:站长天空 网址:http://www.z6688.com/
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

文章页数:[1] 


放大字体显示 缩小字体显示 打印文章 推荐给朋友
热门文章
·web打印的另类方法-ASP教程,打印相关
·Java简单类型进行精确浮点数运算-JSP教程,Java技巧及代码
·使用JAVAMAIL发邮件的一个例子-JSP教程,邮件相关
·中国移动本地传输网建设方案初探
·传输系统中的时钟同步技术
·JSP学习经验总结(转)-JSP教程,Jsp/Servlet
·WEB打印,去页眉和页脚-ASP教程,打印相关
·Native XML数据库技术详解-.NET教程,XML应用
·jsp生成html--readtemplates-JSP教程,Jsp/Servlet
·下拉框反回选定的文字 (修改页面经常用到)-ASP教程,ASP应用
最新文章
·在xp中如何使用windows vista屏保_windows xp
·photoshop调色:cmyk模式处理单色调特效_photoshop教程
·视频分享网站视频广告发展面临的问题_营销推广
·难以置信,这样的网站每月盈利上千万_营销推广
·大站做百度主题推广 小站做google adsense_网赚技巧
·方兴东:保留alexa插件才能给站长带来快乐_站长访谈
·网友天下ceo叶灵:欢迎大家看web2.0笑话_站长访谈
·我们应该如何运营网站_站长心得
·网站从业者还要更加务实才能赚钱_站长心得
·炼成高级网络编辑的三大原则_站长心得
相关主题
  • 用delphi实现文件下载的几种方法_delphi教程
  • 用delphi创建服务程序_delphi教程
  • 用delphi开发dll来代替8581协议控制和采集华为psm—a10电源(二)_delphi教程
  • 用delphi编写系统进程监控程序_delphi教程
  • 用delphi进行nt、2000、2003服务程序的调试_delphi教程
  • 西部数码虚拟主机

    友情链接
    CNNIC 西部数码
    万网 自助建站
    虚拟主机 asp空间
    域名注册 域名
    域名申请 主页空间
    论坛空间 网站空间
    国际域名 虚拟空间
    空间租用 DDOS防火墙
    成都主机托管 四川主机托管
    主机租用 服务器租用
    网站目录 自助建站
    虚拟主机 网址大全
    软件下载
    自助链接
    虚拟主机资讯 特价虚拟主机
    版权申明:本站文章均来自网络,如有侵权,请联系我们,我们收到后立即删除,谢谢!
    关于我们:站长天空:专业提供最新的站长资讯、在线教程、虚拟主机权威评测、虚拟主机性能对比、网站制作教程,开发教程,站长工具。包括网页制作教程、冲浪宝典、编程参考、操作系统、软件教学、行业动态等。
    特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有。
    发表评论 打印  刷新     关闭