效果如图,支持普通、移上去、按下、弹起、禁用5种状态。

unit BmpBtn;

interface

uses

Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,

StdCtrls;

type

TButtonLayout = (blGlyphLeft, blGlyphRight, blGlyphTop, blGlyphBottom);

TDesignType = (dtMenu, dtButton);

TBmpButton = class(TGraphicControl)

private

MOver: TBitmap;

MDown: TBitmap;

MUp: TBitmap;

Bmp: TBitmap;

ActualBmp: TBitmap;

BmpDAble: TBitmap;   // 禁用状态图像

FGlyph: TIcon;

//FTransparentGlyph: Boolean;

FTransparentBmp: Boolean;

FLayout: TButtonLayout;

FSpacing: integer;

FDesignType: TDesignType; //用于菜单还是按钮

//FColorText: TColor;

BtnClick: TNotifyEvent;

OnMDown: TMouseEvent;

OnMUp: TMouseEvent;

OnMEnter: TNotifyEvent;

OnMLeave: TNotifyEvent;

procedure SetMOver(Value: TBitmap);

procedure SetMDown(Value: TBitmap);

procedure SetMUp(Value: TBitmap);

procedure SetBmp(Value: TBitmap);

procedure SetBmpDAble(Value: TBitmap);

procedure SetGlyph(Value: TIcon);      //

procedure SetLayout(Value: TButtonLayout);

//procedure SetTransparentGlyph(Value: Boolean);

procedure SetTransparentBmp(Value: Boolean);

procedure SetSpacing(Value: Integer);

// procedure SetColors(Value: TColor);

procedure SetDesignType(Value: TDesignType);

protected

procedure Paint; override;

procedure MouseDown(Button: TMouseButton; Shift: TShiftState;

X, Y: Integer); override;

procedure MouseUp(Button: TMouseButton; Shift: TShiftState;

X, Y: Integer); override;

procedure MouseEnter(var Message: TMessage); message CM_MOUSEENTER;

procedure MouseLeave(var Message: TMessage); message CM_MOUSELEAVE;

procedure TextChanged (var msg: TMessage); message CM_TEXTCHANGED;

procedure Click; override;

public

constructor Create(AOwner: TComponent); override;

published

property BitmapOver: TBitmap read MOver write SetMOver;

property BitmapDown: TBitmap read MDown write SetMDown;

property BitmapUp: TBitmap read MUp write SetMUp;

property BitmapDisabled: TBitmap read BmpDAble write SetBmpDAble;

property Bitmap: TBitmap read Bmp write SetBmp;

property Glyph: TIcon read FGlyph write SetGlyph; //加入图标属性

property Layout: TButtonLayout read FLayout write SetLayout;  //加入布局属性

//property TransparentGlyph: Boolean read FTransparentGlyph write SetTransparentGlyph; //加入透明度属性(去否去掩码,针对小图标)

property TransparentBmp: Boolean read FTransparentBmp write SetTransparentBmp; //加入透明度属性(去否去掩码,针对背景图像)

property Spacing: integer read FSpacing write SetSpacing; //加入图标和文字的间距属性

property Font;  //加入文字属性

property Caption; //加入文字

// property ColorText: TColor read FColorText write SetColors; //文字颜色

property DesignType: TDesignType read FDesignType write SetDesignType; //指定设计类型

property OnClick: TNotifyEvent read BtnClick write BtnClick;

property OnMouseDown: TMouseEvent read OnMDown write OnMDown;

property OnMouseUp: TMouseEvent read OnMUp write OnMUp;

property OnMouseEnter: TNotifyEvent read OnMEnter write OnMEnter;

property OnMouseLeave: TNotifyEvent read OnMLeave write OnMLeave;

property Enabled;

property ShowHint;

property ParentShowHint;

property ParentFont;

property Visible;

end;

procedure Register;

implementation

procedure Register;

begin

RegisterComponents('SkinsDesign', [TBmpButton]);

end;

{ TImageButton }

constructor TBmpButton.Create(AOwner: TComponent);

begin

inherited Create(AOwner);

MOver := TBitmap.Create;

MDown := TBitmap.Create;

MUp := TBitmap.Create;

Bmp := TBitmap.Create;

BmpDAble := TBitmap.Create;

ActualBmp := TBitmap.Create;

FGlyph := TIcon.Create;

//TransparentGlyph := True;

FSpacing := 4;

//FColorText := clBlack;

Width := 75;

Height := 25;

Canvas.Brush.Color := clBtnFace;

ShowHint := true;

end;

procedure TBmpButton.Paint;

var

TempBmp: TBitMap;

CaptionRect: TRect;

GlyphLeft, GlyphTop, TextTop, TextLeft, TextWidth, TextHeight: integer;

//TextColor: TColor;

begin

inherited Paint;

TempBmp := TBitMap.Create;

TempBmp.Width := Width;

TempBmp.Height := Height;

TempBmp.TransparentColor:= clFuchsia;

TempBmp.Transparent := FTransparentBmp;

if ActualBmp.Width = 0 then ActualBmp.Assign(Bmp);

TempBmp.Canvas.FillRect(Rect(0,0,Width,Height));

if Enabled or (BmpDAble.Width = 0) then TempBmp.Canvas.Draw(0,0,ActualBmp)

else begin

Width := BmpDAble.Width;

Height := BmpDAble.Height;

TempBmp.Canvas.Draw(0,0,BmpDAble);

end;

TempBmp.Canvas.Font := Font;

TextWidth := TempBmp.Canvas.TextWidth(Caption);

TextHeight := TempBmp.Canvas.TextHeight(Caption);

TextTop := (Height - TextHeight) div 2;

TextLeft := (Width - TextWidth) div 2;

if not Glyph.Empty then

begin

GlyphLeft:= 0;

case FLayout of

blGlyphLeft:   begin

GlyphTop:= (Height - FGlyph.Height) div 2;

GlyphLeft:= TextLeft - FGlyph.Width div 2;

inc(TextLeft, FGlyph.Width div 2);

if not (Caption = '') then begin

GlyphLeft:= GlyphLeft - FSpacing div 2 - FSpacing mod 2;

inc(TextLeft, FSpacing div 2);

end;

end;

blGlyphRight:  begin

GlyphTop:= (Height - FGlyph.Height) div 2;

GlyphLeft:= TextLeft + TextWidth - FGlyph.Width div 2;

inc(TextLeft, - FGlyph.Width div 2);

if not (Caption = '') then begin

GlyphLeft:= GlyphLeft + FSpacing div 2 + FSpacing mod 2;

inc(TextLeft, - FSpacing div 2);

end;

end;

blGlyphTop:    begin

GlyphLeft:= (Width - FGlyph.Width) div 2;

GlyphTop:= TextTop - FGlyph.Height div 2 - FGlyph.Height mod 2;

inc(TextTop, FGlyph.Height div 2);

if not (Caption = '') then begin

GlyphTop:= GlyphTop - FSpacing div 2 - FSpacing mod 2;

inc(TextTop, + FSpacing div 2);

end;

end;

blGlyphBottom: begin

GlyphLeft:= (Width - FGlyph.Width) div 2;

GlyphTop:= TextTop + TextHeight - Glyph.Height div 2;

inc(TextTop, - FGlyph.Height div 2);

if not (Caption = '') then begin

GlyphTop:= GlyphTop + FSpacing div 2 + FSpacing mod 2;

inc(TextTop, - FSpacing div 2);

end;

end;

end;

end;

{if FBtnState = bsDown then

begin

inc(GlyphTop, 1);

inc(GlyphLeft, 1);

end; }

//FGlyph.TransparentColor:= FGlyph.Canvas.Pixels[0, 0];

//FGlyph.Transparent:= FTransparentGlyph;

TempBmp.Canvas.Draw(GlyphLeft, GlyphTop, FGlyph);

with CaptionRect do begin

Top:= TextTop;

Left:=TextLeft;

Right:= Left + TextWidth;

Bottom:= Top + TextHeight;

end;

if Caption <> '' then begin

TempBmp.Canvas.Brush.Style:= bsClear;

DrawText(TempBmp.Canvas.Handle,

PChar(Caption),

length(Caption),

CaptionRect,

DT_CENTER or DT_VCENTER or DT_SINGLELINE or DT_NOCLIP);

end;

Canvas.Draw(0, 0, TempBmp);

TempBmp.Free;

end;

procedure TBmpButton.Click;

begin

inherited Click;

Paint;

if Enabled then if Assigned(BtnClick) then BtnClick(Self);

end;

procedure TBmpButton.SetMOver(Value: TBitmap);

begin

MOver.Assign(Value);

Paint;

end;

procedure TBmpButton.SetMDown(Value: TBitmap);

begin

MDown.Assign(Value);

Paint;

end;

procedure TBmpButton.SetMUp(Value: TBitmap);

begin

MUp.Assign(Value);

Paint;

end;

procedure TBmpButton.SetBmp(Value: TBitmap);

begin

Bmp.Assign(Value);

ActualBmp.Assign(Value);

Width := Bmp.Width;

Height := Bmp.Height;

Paint;

end;

procedure TBmpButton.SetBmpDAble(Value: TBitmap);

begin

BmpDAble.Assign(Value);

paint;

end;

procedure TBmpButton.MouseDown(Button: TMouseButton; Shift: TShiftState;

X, Y: Integer);

begin

inherited MouseDown(Button, Shift, X, Y);

if (Button = mbLeft) and Enabled then begin

if Assigned (OnMDown) then OnMDown(Self, Button, Shift, X, Y);

if MDown.Width > 0 then begin

ActualBmp.Assign(MDown);

Width := MDown.Width;

Height := MDown.Height;

Paint;

end;

end;

end;

procedure TBmpButton.MouseUp(Button: TMouseButton; Shift: TShiftState;

X, Y: Integer);

//var MouseOverButton: Boolean;

//    P: TPoint;

begin

Case FDesignType of

dtMenu:

begin

ActualBmp.Assign(MDown);

Paint;

end;

dtButton:

begin

inherited MouseUp(Button, Shift, X, Y);

end;

end;

//if (x>0) and (y>0) and (x<width) and (y<height) then

{if (Button = mbLeft) and Enabled then begin

if Assigned (OnMUp) then OnMUp(Self, Button, Shift, X, Y);

if MUp.Width > 0 then begin

GetCursorPos(P);

MouseOverButton := (FindDragTarget(P, True) = Self);

if MouseOverButton then begin

Width := MUp.Width;

Height := MUp.Height;

Canvas.FillRect(Rect(0,0,Width,Height));

Canvas.Draw(0,0,MUp);

end else begin

Width := bmp.Width;

Height := Bmp.Height;

Canvas.FillRect(Rect(0,0,Width,Height));

Canvas.Draw(0,0,Bmp);

end;

end else begin

if MouseOverButton = false then begin

Width := MOver.Width;

Height := MOver.Height;

Canvas.FillRect(Rect(0,0,Width,Height));

Canvas.Draw(0,0,MOver);

end else begin

Width := bmp.Width;

Height := Bmp.Height;

Canvas.FillRect(Rect(0,0,Width,Height));

Canvas.Draw(0,0,Bmp);

end;

end;

end;  }

end;

procedure TBmpButton.MouseEnter(var Message: TMessage);

begin

if Enabled then begin

if MOver.Width > 0 then begin

ActualBmp.Assign(MOver);

Width := MOver.Width;

Height := MOver.Height;

Paint;

end;

end;

end;

procedure TBmpButton.MouseLeave(var Message: TMessage);

begin

Case FDesignType of

dtMenu:

begin

Exit;

end;

dtButton:

begin

if Enabled then begin

if Bmp.Width > 0 then begin

ActualBmp.Assign(Bmp);

Width := Bmp.Width;

Height := Bmp.Height;

Paint;

end;

end;

end;

end;

end;

procedure TBmpButton.SetGlyph(Value: TIcon);

begin

FGlyph.Assign(Value);

Invalidate;

end;

procedure TBmpButton.SetLayout(Value: TButtonLayout);

begin

FLayout:= Value;

Invalidate;

end;

{procedure TBmpButton.SetTransparentGlyph(Value: Boolean);

begin

FTransparentGlyph:= Value;

Invalidate;

end; }

procedure TBmpButton.SetSpacing(Value: Integer);

begin

FSpacing:= Value;

Invalidate;

end;

{procedure TBmpButton.SetColors(Value: TColor);

begin

FColorText := Value;

Paint;

end;  }

procedure TBmpButton.TextChanged(var msg: TMessage);

begin

Invalidate;

end;

procedure TBmpButton.SetDesignType(Value: TDesignType);

begin

FDesignType := Value;

Invalidate;

end;

procedure TBmpButton.SetTransparentBmp(Value: Boolean);

begin

FTransparentBmp:= Value;

Invalidate;

end;

end.

http://blog.csdn.net/zang141588761/article/details/52287872

Delphi皮肤之 - 图片按钮的更多相关文章

  1. [示例] Firemonkey 图片按钮(3态)

    说明:Firemonkey 图片按钮(支持三种状态:MouseOver, MouseDown, MouseUp,可各别指定图片) 原码下载:[示例]TestImageButton_圖片按鈕(3态).z ...

  2. [CSS]Input标签与图片按钮对齐

    页面直接摆放一个input文本框与ImageButton图片按钮,但是发现没有对齐: <input type="text" id="txtQty" /&g ...

  3. Expression Blend4经验分享:制作一个简单的图片按钮样式

    这次分享如何做一个简单的图片按钮经验 在我的个人Silverlight网页上,有个Iphone手机的效果,其中用到大量的图片按钮 http://raimon.6.gwidc.com/Iphone/de ...

  4. 漂亮的自适应宽度的多色彩CSS图片按钮

    一.素材               二.效果 三.CSS *{padding:0;margin:0} /*----------------------------------- 自适应宽度图片按钮 ...

  5. WPF利用Image实现图片按钮

    之前有一篇文章也是采用了Image实现的图片按钮,不过时间太久远了,忘记了地址.好吧,这里我进行了进一步的改进,原来的文章中需要设置4张图片,分别为可用时,鼠标悬浮时,按钮按下时,按钮不可用时的图片, ...

  6. 在VC中,为图片按钮添加一些功能提示(转)

    在VC中,也常常为一些图片按钮添加一些功能提示.下面讲解实现过程:该功能的实现主要是用CToolTipCtrl类.该类在VC  msdn中有详细说明.首先在对话框的头文件中加入初始化语句:public ...

  7. Android ImageButton Example 图片按钮

    Android ImageButton Example 图片按钮 使用“android.widget.ImageButton” 展现一个具有背景图片的按钮 本教程将展现一个具有名字为 c.png背景图 ...

  8. 使用KindEditor富文本编辑器,点击批量上传按钮没有选择图片按钮

    问题:批量上传没有选择图片按钮

  9. WPF控件库:图片按钮的封装

    需求:很多时候界面上的按钮都需要被贴上图片,一般来说: 1.按钮处于正常状态,按钮具有背景图A 2.鼠标移至按钮上方状态,按钮具有背景图B 3.鼠标点击按钮状态,按钮具有背景图C 4.按钮处于不可用状 ...

随机推荐

  1. Java循环输出一个菱形与阶乘倒数

    package javafirst; public class HomeWork { public static void main(String[] args){ System.out.printl ...

  2. [02]基于webservice权限系统

    面前,我们已经介绍过.如何使用cxf建立webservice. 那我们要介绍的这款许可制度表结构. 此权限管理系统分为部门管理.员工管理.角色管理,权限管理,授权的人才和企业管理(这里不涉及) 角色管 ...

  3. poj1639 Picnic Planning,K度限制生成树

    题意: 矮人虽小却喜欢乘坐巨大的轿车,车大到能够装下不管多少矮人.某天,N(N≤20)个矮人打算到野外聚餐.为了集中到聚餐地点,矮人A 要么开车到矮人B 家中,留下自己的轿车在矮人B 家,然后乘坐B ...

  4. visual studio 2015安装win10 SDK文件校验错误的解决方法

    这段时间想看一下UWP开发,于是下载了visual 2015 update1社区版,但是在安装完成时提示,windows 10 sdk文件校验码错误,如下图(图片是借用的,我当时没有截屏,错误号是一样 ...

  5. 报错:javax.servlet.jsp.PageContext cannot be resolved to a type;javax.servlet.jsp.JspException cannot be resolved to a type

    Multiple annotations found at this line: - javax.servlet.jsp.PageContext cannot be resolved to a typ ...

  6. java 中的两个常用命令

    这两个命令,分别为,javac 和java 实际操作如下图:

  7. 注释为基础的SpringMVC

    SpringMVC根据征求意见 正在使用SpringMVC以前的评论.首先,为使说明.于springMVC3.x版本号之后提供了很easy的启用注解方法仅仅须要的-servlet.xml中加上< ...

  8. Ado.net连接字符串

    学习刘皓的 文章ADO.NET入门教程(三) 连接字符串,你小觑了吗? 连接字符串主要有DataSource 指定地址 通常是ip 如果Express 就要使用形如 ./Express或者 (loca ...

  9. VC中引用第三方库,常见的库冲突问题

    Q:VC中引用第三方库,常见的库冲突问题 环境:[1]VS2008 [2]WinXP SP3 A1(方法一): [S1]第三方库(Binary形式的)如果同主程序冲突,则下载第三方库的源码[S2]保持 ...

  10. MySQL第五个学习笔记 该数据表的操作

    MySQL在创建表,创建.frm文件保存表和列定义.索引存储在一个.MYI(MYindex)且数据存储在有.MYD(MYData)扩展名的文件里.   一.用SHOW/ DESCRIBE语句显示数据表 ...