Delphi自写组件:可设置颜色的按钮(改成BS_OWNERDRAW风格,然后CN_DRAWITEM)

    • unit ColorButton;
    • interface
    • uses
    • Windows, Messages, SysUtils, Classes, Graphics, Controls,
    • StdCtrls;
    • type
    • TColorButton = class(TButton)
    • private
    • //添加Color属性,默认clWhite
    • { Private declarations }
    • FColor:TColor;
    • FCanvas:TCanvas;
    • IsFocused:Boolean;
    • procedure SetColor(Value:Tcolor);
    • procedure CNDrawItem(var Message:TWMDrawItem);message CN_DRAWITEM;
    • protected
    • { Protected declarations }
    • procedure CreateParams(var Params:TCreateParams);override;
    • procedure SetButtonStyle(ADefault:Boolean);override;
    • public
    • { Public declarations }
    • constructor Create(AOwner:TComponent);override;
    • destructor Destroy;override;
    • published
    • { Published declarations }
    • property Color:TColor read FColor write SetColor default clWhite;
    • end;
    • procedure Register;
    • implementation
    • //**********************************
    • //*** Borland/Delphi7/Source/Vcl/checklst.pas 可做参考
    • //**********************************
    • //系统自动添加的注册函数
    • procedure Register;
    • begin
    • RegisterComponents(‘Additional‘, [TColorButton]);
    • end;
    • //*********添加构造函数***************
    • constructor TColorButton.Create(AOwner:TComponent);
    • begin
    • inherited Create(AOwner);
    • FCanvas:=TCanvas.Create;
    • FColor:=clWhite; //设置默认颜色
    • end;
    • //*********添加析构函数***************
    • destructor TColorButton.Destroy;
    • begin
    • FCanvas.Free;
    • inherited Destroy;
    • end;
    • //****定义按钮样式,必须将该按钮重定义为自绘式按钮*****
    • procedure TColorButton.CreateParams(var Params:TCreateParams);
    • begin
    • inherited CreateParams(Params);
    • with Params do Style:=Style or BS_OWNERDRAW;
    • end;
    • //****属性写方法*****
    • procedure TColorButton.SetColor(Value:TColor);
    • begin
    • FColor:=Value;
    • Invalidate;     //完全重画控件
    • end;
    • //****设置按钮状态*****
    • procedure TColorButton.SetButtonStyle(ADefault:Boolean);
    • begin
    • if ADefault<>IsFocused then
    • begin
    • IsFocused:=ADefault;
    • Refresh;
    • end;
    • end;
    • //****绘制按钮*****
    • procedure TColorButton.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;
    • end.

http://blog.csdn.net/aroc_lo/article/details/3070530

http://www.fx114.net/qa-183-149306.aspx

时间: 2024-10-28 23:14:46

Delphi自写组件:可设置颜色的按钮(改成BS_OWNERDRAW风格,然后CN_DRAWITEM)的相关文章

Delphi 利用TComm组件 Spcomm 实现串行通信

Delphi 利用TComm组件 Spcomm 实现串行通信 摘要:利用Delphi开发工业控制系统软件成为越来越多的开发人员的选择,而串口通信是这个过程中必须解决的问题之一.本文在对几种常用串口通信方法分析比较的基础上,着重讨论了Delphi开发环境下利用Spcomm控件实现PC机与单片机之间串口通信的方法,研究了Spcomm串口通信的关键技术问题,并通过一个实例给出了Spcomm控件在Delphi7.0串口通信中的应用. 1 引言目前, 随着现代信息技术的发展,计算机串口通信技术已日趋成熟.

Delphi笔记-自定义组件

Delphi笔记-自定义组件 (2010-09-08 16:46:34) 转载▼ 标签: it 分类: delphi 凡是从TComponent继承下来的对象能够被窗体设计器所操纵. 创建一个组件时应该注意的几个方面:1.首先,要确定是否需要创建一个独特的新组件.2.来好好规划一下组件的工作方式.3.做好了准备工作,不要急于实际创建组件,得先问问自己:到底需要这个组件干什么?4.把组件从逻辑上分为几个部分.这样,不仅有利于组件的模块化.简单化,而且能使代码精炼.组织良好.设计组件时,要考虑到可能

从头学Qt Quick(3)-- 用QML写一个简单的颜色选择器

先看一下效果图: 实现功能:点击不同的色块可以改变文字的颜色. 实现步骤: 一.创建一个默认的Qt Quick工程: 二.添加文件Cell.qml 这一步主要是为了实现一个自定义的组件,这个组件就是我们看到的那个色块,很明显定义成组件可以则兼UI的复用. 1 import QtQuick 2.0 2 3 Item { 4 id: container; 5 property alias cellColor: rectangle.color; 6 signal clicked(color cellC

delphi 修改Hint的字体和颜色

//修改Hint的字体和颜色   public    { Public declarations }    procedure Sshowhint(var hintstr:string;var canshow:Boolean;var HintInfo:THintInfo); procedure TForm1.FormCreate(Sender: TObject);begin  form1.Hint:= '改变提示栏';  form1.ShowHint:=true;  Application.On

Delphi 之 对话框组件

OpenDialog组件 OpenDialog用来打开文件的一个对话框. Filter 该属性可设置文件类型单击该属性如图 Filter Name设置文件的名字,Filter设置文件的类型 OpenDialog1.Filter:='文本文件(*.TXT)|*.TXT'; File file属性是Tstring类型,它返回文件名字符串及完整的路径名. FileName 用来设置打开文件对话框文件名文本框的内容.返回一个文件名及完整的路径名. Title 用来设置对话框的标题. FilterInde

css颜色属性及设置颜色的地方

css颜色属性 在css中用color属性规定文本的颜色. 默认值是not specified 有继承性,在javascript中语法是object.style.color="#FF0000" 取值方法 1,英文单词color:name;规定颜色值为颜色名称的颜色. 但是英文单词能够表达的颜色是有局限性的,不是所有的颜色都有英文名字,就像所有的颜色也不会都有中文字一样. 2,RGB(red红色,green绿色,blue蓝色) rgb格式,格式rgb(0,0,0): rgb格式,其实 就

Silverlight 设置颜色

透明色:00ff00ff //设置柱状图的颜色                ColorSet cs = new ColorSet();                cs.Id = "colorset1"; #region 设置柱状图的颜色 待开发                    string strColor = oYAXIS.Color;                    switch (strColor)                    {           

JavaGUI——设置框架背景颜色和按钮颜色

import java.awt.Color; import javax.swing.*; public class MyDraw { public static void main(String[] args) { //创建框架 JFrame myFrame=new JFrame("图画"); //myFrame.setLocation(200, 300);//第1参数表示离左屏幕边框距离,第2参数表示离屏幕上边框距离 myFrame.setSize(600, 400); myFram

delphi 08 HTML组件

///HTML组件///后面的字符串为这个控件的ID号///直线          Line         (WebBrowser1.Document as IHTMLDocument2).execCommand('InsertHorizontalRule', True, '');///按钮          Button      (WebBrowser1.Document as IHTMLDocument2).execCommand('InsertButton', True, '');//