将下面的代码拷贝到一个单元中,创建一个包,加入这个单元后安装.使用的时候设置好背景颜色,边框颜色,图标(png格式)相对路径的文件名称.这个控件可以利用PNG图像的颜色透明特性,背景色默认透明度为50%,可以将按钮后面的内容显示出来.GDIPAPI, GDIPOBJ, GDIPUTIL三个单元可用万一的博客上寻找下载地址.

unit u360StyleButton;

interface

uses

SysUtils, Classes, Controls, StdCtrls,Graphics, Messages, Windows,

GDIPAPI, GDIPOBJ, GDIPUTIL;

type

TBtn360Style = class(TButton)

private

FBkgColor: TColor; //鼠标悬停是的背景颜色

FEdgColor: TColor; //边框颜色

FCanvas: TCanvas;

FMouseEnter: Boolean;

FPngFileName: string;

procedure CNDrawItem(var Message:TWMDrawItem);message CN_DRAWITEM;

procedure SetPngFileName(const Value: string);

procedure SetBkgColor(const Value: TColor);

procedure SetEdgColor(const Value: TColor);

protected

procedure CreateParams(var Params:TCreateParams);override;

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

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

procedure SetButtonStyle(ADefault:Boolean);override; //必须重新找个函数 否则会按默认样式绘制

public

constructor Create(AOwner:TComponent);override;

destructor Destroy;override;

published

property PngFileName: string read FPngFileName write SetPngFileName;

property BkgColor: TColor read FBkgColor write SetBkgColor;

property EdgColor: TColor read FEdgColor write SetEdgColor;

end;

procedure Register;

implementation

constructor TBtn360Style.Create(AOwner: TComponent);

begin

inherited Create(AOwner);

DoubleBuffered := True;

FCanvas := TCanvas.Create;

FBkgColor := clBlue;

FEdgColor := clSkyBlue;

end;

destructor TBtn360Style.Destroy;

begin

FCanvas.Free;

inherited Destroy;

end;

procedure TBtn360Style.CreateParams(var Params: TCreateParams);

begin

inherited CreateParams(Params);

with Params do Style := Style or BS_OWNERDRAW;

end;

procedure TBtn360Style.SetEdgColor(const Value: TColor);

begin

if FEdgColor <> Value then

begin

FEdgColor := Value;

Invalidate;

end;

end;

procedure TBtn360Style.SetBkgColor(const Value: TColor);

begin

if FBkgColor <> Value then

begin

FBkgColor := Value;

Invalidate;

end;

end;

procedure TBtn360Style.SetButtonStyle(ADefault: Boolean);

begin

if csDesigning in ComponentState then

inherited;

end;

procedure TBtn360Style.SetPngFileName(const Value: string);

begin

if FPngFileName <> Value then

begin

FPngFileName := Value;

Invalidate;

end;

end;

procedure TBtn360Style.CMMouseEnter(var Message: TMessage);

begin

inherited;

FMouseEnter := True;

Invalidate;

end;

procedure TBtn360Style.CMMouseLeave(var Message: TMessage);

begin

inherited;

FMouseEnter := False;

Invalidate;

end;

procedure TBtn360Style.CNDrawItem(var Message: TWMDrawItem);

var

IsDown: Boolean;

ARect: TRect;

DrawItemStruct: TDrawItemStruct;

wh:TSize;

g: TGPGraphics;

pen: TGPPen;

img: TGPImage;

img2: TGPBitmap;

imgAtt: TGPImageAttributes;

i, j:Integer;

const

ColorMatrix: TColorMatrix = (

(1.0, 0.0, 0.0, 0.0, 0.0),

(0.0, 1.0, 0.0, 0.0, 0.0),

(0.0, 0.0, 1.0, 0.0, 0.0),

(0.0, 0.0, 0.0, 1.0, 0.0),

(1.0, 0.0, 0.0, 0.0, 1.0));

begin

DrawItemStruct:=Message.DrawItemStruct^;

FCanvas.Handle := DrawItemStruct.hDC;

g := TGPGraphics.Create(FCanvas.Handle);

pen := TGPPen.Create(GDIPAPI.MakeColor(128, FEdgColor and $FF, (FEdgColor shr 8) and $FF, (FEdgColor shr 16) and $FF));

img := TGPImage.Create(FPngFileName);

img2 := TGPBitmap.Create(Width, Height);

for i := 0 to img2.GetWidth do

for j := 0 to img2.GetHeight do

begin

color := GDIPAPI.MakeColor(128, FBkgColor and $FF, (FBkgColor shr 8) and $FF, (FBkgColor shr 16) and $FF);

img2.SetPixel(i, j, color);

end;

ARect := ClientRect;

with DrawItemStruct do

IsDown := itemState and ODS_SELECTED <> 0;

if FMouseEnter then   //鼠标在按钮上 则绘制一个背景及边框

begin

Perform($000B, 0, 0);

g.DrawImage(img2, 0, 0, Width, Height);

g.DrawRectangle(pen, 0, 0, Width - 1, Height - 1);

Perform($000B, 1, 0);

end;

//按钮被按下时的状态绘制

if IsDown then

begin

imgAtt := TGPImageAttributes.Create;

imgAtt.SetColorMatrix(ColorMatrix, ColorMatrixFlagsDefault, ColorAdjustTypeDefault);

g.DrawImage(img, MakeRect(0, 0, img.GetWidth, img.GetHeight),

-10, -10, img.GetWidth + 10, img.GetHeight + 10, UnitPixel, imgAtt);

FreeAndNil(imgAtt);

end

else  //绘制一个未按下的按钮

g.DrawImage(img, (Width - img.GetWidth) div 2, 10);

FreeAndNil(img);

FreeAndNil(img2);

FreeAndNil(g);

FreeAndNil(pen);

//绘制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), height - wh.cy - 10,Caption);

FCanvas.Font.Color := clBtnShadow;

end

else

FCanvas.TextOut((Width div 2)-(wh.cx div 2), height - wh.cy - 10,Caption);

FCanvas.Handle := 0;

end;

procedure Register;

begin

RegisterComponents('HenreashPackages', [TBtn360Style]);

end;

end.

使用GDI+绘制的360风格按钮控件的更多相关文章

  1. 使用GDI+绘制的360风格按钮控件(使用CN_DRAWITEM消息重绘,并使用TGPGraphics,TGPPen,TGPImage,TGPBitmap等)good

    将下面的代码拷贝到一个单元中,创建一个包,加入这个单元后安装.使用的时候设置好背景颜色,边框颜色,图标(png格式)相对路径的文件名称.这个控件可以利用PNG图像的颜色透明特性,背景色默认透明度为50 ...

  2. MFC基于对话框风格按钮控件添加图片的方法(大神止步)

    菜鸟还在研究这个东西,大神就不要看了.一直都在觉得用VC或VS建立的对话框总是全灰色感觉太单调了,如果可以在上面添加一些漂亮的图片就好了,今天终于实现了.其实挺简单的,下面就分几个步骤讲一下: 第一步 ...

  3. dskinlite(uieasy mfc界面库)使用记录2:绘制动态元素(按钮控件绘制元素动态控制,改变图片和文字)

    效果图:这4个分别是按钮按下后4种状态的效果 第88行是显示默认的按钮文字,没有id,SetWindowText改的就是它了 第87行是左边的图片,id是ico,可以通过程序控制 第89行是蓝色的文字 ...

  4. dskinlite(uieasy mfc界面库)使用记录3:绘制动态元素(按钮控件通过隐藏方式修改图片显示)

    效果图: 分别是:正常,正常鼠标悬停,按下,按下鼠标悬停 XML代码: 75,76行定义了一个image,注意id和index属性 初始化代码: click代码: 147,148,153,154:通过 ...

  5. Qt编写自定义控件11-设备防区按钮控件

    前言 在很多项目应用中,需要根据数据动态生成对象显示在地图上,比如地图标注,同时还需要可拖动对象到指定位置显示,能有多种状态指示,安防领域一般用来表示防区或者设备,可以直接显示防区号,有多种状态颜色指 ...

  6. Qt编写自定义控件9-导航按钮控件

    前言 导航按钮控件,主要用于各种漂亮精美的导航条,我们经常在web中看到导航条都非常精美,都是html+css+js实现的,还自带动画过度效果,Qt提供的qss其实也是无敌的,支持基本上所有的CSS2 ...

  7. WinRT自定义控件第一 - 转盘按钮控件

    之前的文章中,介绍了用WPF做一个转盘按钮控件,后来需要把这个控件移植到WinRT时,遇到了很大的问题,主要原因在于WPF和WinRT还是有很大不同的.这篇文章介绍了这个移植过程,由于2次实现的控件功 ...

  8. MFC编程入门之二十二(常用控件:按钮控件Button、Radio Button和Check Box)

    本节继续讲解常用控件--按钮控件的使用. 按钮控件简介 按钮控件包括命令按钮(Button).单选按钮(Radio Button)和复选框(Check Box)等.命令按钮就是我们前面多次提到的侠义的 ...

  9. C#自定义Button按钮控件

    C#自定义Button按钮控件 在实际项目开发中经常可以遇到.net自带控件并不一定可以满足需要,因此需要自定义开发一些新的控件,自定义控件的办法也有多种,可以自己绘制线条颜色图形等进行重绘,也可以采 ...

随机推荐

  1. express 使用art-template模板引擎

    下载express-art-template art-template - app.js中配置 - 注册一个模板引擎 - `app.engine('.html',express-art-templat ...

  2. Linux 临时和永久关闭 Selinux

    查看当前 Selinux 状态:getenforce 临时关闭 Selinux:setenforce 0 永久关闭 Selinux: vim /etc/sysconfig/selinux 将 SELI ...

  3. 分布式锁实现(一):Redis

    前言 单机环境下我们可以通过JAVA的Synchronized和Lock来实现进程内部的锁,但是随着分布式应用和集群环境的出现,系统资源的竞争从单进程多线程的竞争变成了多进程的竞争,这时候就需要分布式 ...

  4. Mysql学习笔记(002)-基础查询

    基础查询 # 进阶1:基础查询 /* 语法: select 查询列表 from 表名: 类似于:system.out.println(打印东西); 特点: 1.查询列表可以是:表中的字段,常量值,表达 ...

  5. jsp EL运算符

    算术运算符 算术运算符 说明 示例 结果 + 加 ${1 + 1} 2 - 减 ${1 - 1} 0 * 乘 ${1 * 2} 2 /或div 除 ${3 / 2} 1.5 %或mod 取余 ${3 ...

  6. Oracle - 单表查询相关

    -- 单表查询 -- 查询表的所有数据, *代表所有 -- select * from [表名]; -- 查询表中指定字段的值 -- select [字段1], [字段2] ... from [表名] ...

  7. PHP FILTER_VALIDATE_REGEXP 过滤器

    定义和用法 FILTER_VALIDATE_REGEXP 过滤器根据兼容 Perl 的正则表达式来验证值. Name: "validate_regexp" ID-number: 2 ...

  8. 帝国cms返回首页

    <a href="[!--news.url--]">返回首页</a>

  9. contest-20191021

    文化课读的真不开心 回来竞赛 假人 sol 根据不等式有 abs(a-b)+abs(b-c)>=abs(a-c) 那么每一个都会选. 可以发现每一段只会选在端点上(否则移到端点更优). 那么dp ...

  10. I. Five Day Couple--“今日头条杯”首届湖北省大学程序设计竞赛(网络同步赛)

    题目描述:链接点此 这套题的github地址(里面包含了数据,题解,现场排名):点此 链接:https://www.nowcoder.com/acm/contest/104/H来源:牛客网 题目描述 ...