如何設置Button的背景顏色?急!急!!!(100分)

  • 主题发起人 delphiprogramer
  • 开始时间
D

delphiprogramer

Unregistered / Unconfirmed
GUEST, unregistred user!
大家都知道 Button 的背景顏色是不能改變的.但我在做一個程序中需要這一特性,在Button
按鈕得到焦點的時候,要改變其背景顏色. 請教各位高手,如何給Button添加一個 Color屬性
(Button.Color).我發現TCheckBox有這個Color屬性,它也是從TButtonControl繼承而來的.
怎樣把TCheckBox.Color屬性轉到TButton 中.
或者哪裡有帶Color屬性的Button控件下載...急!!!
 
重新编写一个Button控件,自己添加Color属性。
unit ColorButton;

interface

uses
Windows, Messages, SysUtils, Classes, Controls, StdCtrls,
Graphics,Forms,Dialogs,Buttons,ExtCtrls;

type
TDrawButtonEvent=procedure(Control:TWinControl;Rect:TRect;
State:TOwnerDrawState) of Object;


type
TColorButton = class(TButton)
private
{ Private declarations }
FCanvas:TCanvas;
IsFocused:Boolean;
FOnDrawButton:TDrawButtonEvent;
protected
{ Protected declarations }
procedure CreateParams(var Params:TCreateParams);override;
procedure SetButtonStyle(ADefault:Boolean);override;
procedure CMEnabledChanged(var Message:TMessage);message CM_ENABLEDCHANGED;
procedure CMFontChanged(var Message:TMessage);message CM_FONTCHANGED;
procedure CNMeasureItem(var Message:TWMMeasureItem);message CN_MEASUREITEM;
procedure CNDrawItem(var Message:TWMDrawItem);message CN_DRAWITEM;
procedure WMLButtonDblClk(var Message:TWMLButtonDblClk);message WM_LBUTTONDBLCLK;
procedure DrawButton(Rect:TRect;State:Uint);
public
{ Public declarations }
constructor Create(AOwner:TComponent);override;
destructor Destroy;override;
property Canvas:TCanvas read FCanvas;
published
{ Published declarations }
property OnDrawButton:TDrawButtonEvent read FOnDrawButton write FOnDrawButton;
property Color;
end;

procedure Register;

implementation

procedure Register;
begin
RegisterComponents('Standard', [TColorButton]);
end;

constructor TColorButton.Create(AOwner:TComponent);
begin
inherited Create(AOwner);
FCanvas:=TCanvas.Create;
end;

destructor TColorButton.Destroy;
begin
inherited Destroy;
FCanvas.Free;
end;

procedure TColorButton.CreateParams(var Params:TCreateParams);
begin
inherited CreateParams(Params);
with Params do
Style:=Style or BS_OWNERDRAW;
end;

procedure TColorButton.SetButtonStyle(ADefault:Boolean);
begin
if ADefault<>IsFocused then
begin
IsFocused:=ADefault;
Refresh;
end;
end;

procedure TColorButton.CNMeasureItem(var Message:TWMMeasureItem);
begin
with Message.MeasureItemStruct^ do
begin
ItemWidth:=Width;
itemHeight:=Height;
end;
end;

procedure TColorButton.CNDrawItem(var Message:TWMDrawItem);
var
SaveIndex:integer;
begin
with Message.DrawItemStruct^ do
begin
SaveIndex:=SaveDC(hDC);
FCanvas.Lock;
try
FCanvas.Handle:=hDC;
FCanvas.Font:=Font;
FCanvas.Brush:=Brush;
DrawButton(rcItem,ItemState);
finally
FCanvas.Handle:=0;
FCanvas.Unlock;
RestoreDC(hDC,SaveIndex);
end;
end;
Message.Result:=1;
end;

procedure TColorButton.CMEnabledChanged(var Message:TMessage);
begin
inherited;
Invalidate;
end;

procedure TColorButton.CMFontChanged(var Message:TMessage);
begin
inherited;
Invalidate;
end;

procedure TColorButton.WMLButtonDblClk(var Message:TWMLButtonDblClk);
begin
Perform(WM_LBUTTONDOWN,Message.Keys,Longint(Message.Pos));
end;

procedure TColorButton.DrawButton(Rect:TRect;State:Uint);
var
Flags,OldMode:Longint;
IsDown,IsDefault,IsDisabled:Boolean;
OldColor:TColor;
OldRect:TRect;
begin
OldRect:=Rect;
Flags:=DFCS_BUTTONPUSH or DFCS_ADJUSTRECT;
IsDown:=State and ODS_SELECTED<>0;
ISDefault:=State and ODS_FOCUS<>0;
IsDisabled:=State and ODS_DISABLED<>0;

if IsDown then
Flags:=Flags or DFCS_PUSHED;
if IsDisabled 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(Rect.Left,Rect.Top,Rect.Right,Rect.Bottom);
InFlateRect(Rect,-1,-1);
end;

if IsDown then
begin
FCanvas.Pen.Color:=clBtnShadow;
FCanvas.Pen.Width:=1;
FCanvas.Brush.Color:=clBtnFace;
FCanvas.Rectangle(Rect.Left,Rect.Top,Rect.Right,Rect.Bottom);
InFlateRect(Rect,-1,-1);
end
else
DrawFrameControl(FCanvas.Handle,Rect,DFC_BUTTON,Flags);

if IsDown then OffsetRect(Rect,1,1);

OldColor:=Fcanvas.Brush.Color;
FCanvas.Brush.Color:=Color;
FCanvas.FillRect(Rect);
FCanvas.Brush.Color:=OldColor;
OldMode:=SetBkMode(FCanvas.Handle,TRANSPARENT);
FCanvas.Font.Color:=clBtnText;
if isDisabled then
DrawState(FCanvas.Handle,FCanvas.Brush.Handle,nil,Integer(Caption),0,
((Rect.Right-Rect.Left)-FCanvas.TextHeight(Caption)) div 2,
((Rect.Bottom-Rect.Top)-FCanvas.TextHeight(Caption)) div 2,
0,0,DST_TEXT or DSS_DISABLED)
else
DrawText(FCanvas.Handle,PChar(Caption),-1,Rect,
DT_SINGLELINE or DT_CENTER or DT_VCENTER);
SetBkMode(FCanvas.Handle,OldMode);

if Assigned(FOnDrawButton) then
FOndrawButton(Self,Rect,TOWnerDrawState(LongRec(State).Lo));

if IsFocused and IsDefault then
begin
Rect:=OldRect;
InflateRect(Rect,-4,-4);
FCanvas.Pen.Color:=clWindowFrame;
FCanvas.Brush.Color:=clBtnFace;
DrawFocusRect(FCanvas.Handle,Rect);
end;
end;
end.
 
To:Carfield2001
非常感謝你的幫助,希望能多一些像你這樣的大富翁.你一定是高手,還望你以後多多指教.
多謝!多謝!!!
 
TO:Carfield2001
首先感謝你的幫助!
請問你一個關於TColorButton的問題.這個控件確實能實現設置背景顏色的功能.但
在使用過程中,如果將TColorButton.Enabled設為False,這時Caption的字體會自動
靠右對齊,當TColorButton控件得到焦點時,字體會自動居中.有辦法解決這個問題嗎.
我加你100分,多謝!
 
顶部