Delphi皮肤之 - 图片按钮

效果如图,支持普通、移上去、按下、弹起、禁用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皮肤之 - 图片按钮的更多相关文章
- [示例] Firemonkey 图片按钮(3态)
说明:Firemonkey 图片按钮(支持三种状态:MouseOver, MouseDown, MouseUp,可各别指定图片) 原码下载:[示例]TestImageButton_圖片按鈕(3态).z ...
- [CSS]Input标签与图片按钮对齐
页面直接摆放一个input文本框与ImageButton图片按钮,但是发现没有对齐: <input type="text" id="txtQty" /&g ...
- Expression Blend4经验分享:制作一个简单的图片按钮样式
这次分享如何做一个简单的图片按钮经验 在我的个人Silverlight网页上,有个Iphone手机的效果,其中用到大量的图片按钮 http://raimon.6.gwidc.com/Iphone/de ...
- 漂亮的自适应宽度的多色彩CSS图片按钮
一.素材 二.效果 三.CSS *{padding:0;margin:0} /*----------------------------------- 自适应宽度图片按钮 ...
- WPF利用Image实现图片按钮
之前有一篇文章也是采用了Image实现的图片按钮,不过时间太久远了,忘记了地址.好吧,这里我进行了进一步的改进,原来的文章中需要设置4张图片,分别为可用时,鼠标悬浮时,按钮按下时,按钮不可用时的图片, ...
- 在VC中,为图片按钮添加一些功能提示(转)
在VC中,也常常为一些图片按钮添加一些功能提示.下面讲解实现过程:该功能的实现主要是用CToolTipCtrl类.该类在VC msdn中有详细说明.首先在对话框的头文件中加入初始化语句:public ...
- Android ImageButton Example 图片按钮
Android ImageButton Example 图片按钮 使用“android.widget.ImageButton” 展现一个具有背景图片的按钮 本教程将展现一个具有名字为 c.png背景图 ...
- 使用KindEditor富文本编辑器,点击批量上传按钮没有选择图片按钮
问题:批量上传没有选择图片按钮
- WPF控件库:图片按钮的封装
需求:很多时候界面上的按钮都需要被贴上图片,一般来说: 1.按钮处于正常状态,按钮具有背景图A 2.鼠标移至按钮上方状态,按钮具有背景图B 3.鼠标点击按钮状态,按钮具有背景图C 4.按钮处于不可用状 ...
随机推荐
- NOIP模拟 Game - 简单博弈,dp
题意: 有n个带权球,A和B两个人,A先手拿球,一开始可以拿1个或2个,如果前一个人拿了k个,那么当前的这个人只能那k或k+1个,如果当前剩余的球不足,那么剩下的球都作废,游戏结束.假设两个人都是聪明 ...
- javaScript判断输入框是否为空
其中获得和失去焦点的时候都判断了一次 <script> function fun01(f,s){//有参函数 参数不需要参数类型!! try{ var v = document.getEl ...
- 第二十一篇:基于WDM模型的AVStream驱动架构研究
基于WDM模型的AVStream驱动架构研 这篇论文2006年早就发表, 与当时开发这个驱动正好几乎相同的时间. 近期实际项目须要, 又回过头来将AVStre ...
- 在线算法交互、可视化与演示及应用(caffe 网络配置文件 .prototxt 的可视化)
0. 全集 Explained Visually 1. 图像与视觉 Image Kernels 2. 数学操作 Convolution arithmetic:卷积: 3. 神经网络与深度学习 A Ne ...
- solr 7.x 查询及高亮
查询时的api分为两种一种是万能的set,还有一种是setxxxquery @Test public void search2() throws Exception{ HttpSolrClient s ...
- UVA 1428 - Ping pong(树状数组)
UVA 1428 - Ping pong 题目链接 题意:给定一些人,从左到右,每一个人有一个技能值,如今要举办比赛,必须满足位置从左往右3个人.而且技能值从小到大或从大到小,问有几种举办形式 思路: ...
- qmake生成vcproj & sln
qmake生成的vs工程与环境变量中的 qmakespec相关,可以有两种方法: 1.默认情况下,即环境变量qmakespec为你装的qt for vs的版本,默认生成的为该版本的vs工程,如,你装的 ...
- Android 4.0开发之GridLayOut布局实践
在上一篇教程中http://blog.csdn.net/dawanganban/article/details/9952379,我们初步学习了解了GridLayout的布局基本知识,通过学习知道,Gr ...
- SQL中的JOIN语法详解
参考以下两篇博客: 第一个是 sql语法:inner join on, left join on, right join on详细使用方法 讲了 inner join, left join, righ ...
- mysql中常见的存储引擎和索引类型
存储引擎 1. 定义 存储引擎说白了就是如何存储数据.如何为存储的数据建立索引和如何更新.查询数据等技术的实现方法.因为在关系数据库中数据的存储是以表的形式存储的,所以存储引擎也可以称为表类 ...