问题: 如何改变控件Button的颜色? ( 积分: 100 )
分类: 控件 - 开发
来自: 小弟(陈生), 时间: 2002-11-11 18:43:00, ID: 1425534
要求做到的效果是:当鼠标移到Button控件上颜色就改变;移开鼠标颜色就变回原来的颜色。
来自: misxjq, 时间: 2002-11-11 18:45:00, ID: 1425535
你是改变button的背景颜色还是字体颜色?清说清楚!
来自: xyl999, 时间: 2002-11-11 18:47:00, ID: 1425538
button.color := clBlue
button.font.color := clwhite;
..................
来自: Derlin, 时间: 2002-11-11 18:48:00, ID: 1425541
可以用FlatButton 第三方控件
来自: louhong, 时间: 2002-11-11 18:54:00, ID: 1425558
在OnEnter里:
button1.color:=clXXXX; //你想要的颜色
在OnExit里:
button1.color:=clUUUU;//你原来的颜色
来自: aizb, 时间: 2002-11-11 19:54:00, ID: 1425644
如果不想用第三方控件也不想用TSpeedButton的话(为什么不用呢?),
你就需要自己定一个控件了,至于如何写,你可以分析一下Delphi的Buttons
单元中的TBitBtn控件的源码,你可以从TBitbtn上继承,主要是要重载DrawItem方法,
不过很遗憾,DrawItem方法是静态方法,不能重载了,所以只好重载CN_DRAWITEM消息处
理函数,这个函数的执行过程可以参照DrawItem方法,只不过加入绘制颜色的语句
就可以了,不过别忘了增加两个颜色属性.
另外如果要做到鼠标感知,还需要重载CM_MOUSEENTER和CM_MOUSELEAVE消息处理函数.
来自: aizb, 时间: 2002-11-11 19:56:00, ID: 1425648
楼上有两位,如果用过Delphi的话请看看TButton控件有没有Color属性.
来自: 小弟(陈生), 时间: 2002-11-11 20:02:00, ID: 1425657
是改变字体的颜色,有办法吗?
来自: 宁柯, 时间: 2002-11-11 20:08:00, ID: 1425663
我倒是有个主意,你干脆用Panel组件算了,在Panel组件的OnClick时间里面写处理的
代码,在OnEnter和OnExit里面写改变颜色的代码!
来自: 老人家, 时间: 2002-11-11 20:08:00, ID: 1425664
SetCaptureControl
呵呵
来自: Richard3000, 时间: 2002-11-11 21:09:00, ID: 1425761
>>是改变字体的颜色,有办法吗?
這個好辦,font.color:=..
改變Button的顏色就不容易了,可以用別的控件或者有Panel代替,我用的是
Panel不過也不好,Enable=False的時候,不能變成灰色
来自: aizb, 时间: 2002-11-11 21:13:00, ID: 1425772
如果一定要用TButton的话,改变字体的颜色也不行,如果仅仅是改变字体的颜色的话,用TBitbtn不就可以了?
来自: delphi浪客, 时间: 2002-11-12 3:54:00, ID: 1426113
两个消息
Procedure CMMouseEnter(var Message: TMessage); message CM_MOUSEENTER;
Procedure CMMouseLeave(var Message: TMessage); message CM_MOUSELEAVE;
再这里面修改颜色
来自: 小弟(陈生), 时间: 2002-11-12 7:36:00, ID: 1426140
如果可以的话,请把原代码写出来,好让我参考参考,因为我是个初学者有许多不明的地方。
来自: vine, 时间: 2002-11-12 10:54:00, ID: 1426633
问题是TButton和TbitBtn都没有publish Color这个属性
如果你要设置字体颜色用TbitBtn还可以
可以用其它第三方控件
如CoolCOntrols
里面的TCoolBtn有Color属性
还有onMouseLeave 和 onMouseEnter事件
设置就方便啦
在51delphi有下
来自: aizb, 时间: 2002-11-12 20:28:00, ID: 1428083
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Buttons;
type
TMyBitBtn = class(TBitBtn)
private
procedure CMMouseEnter(var Message: TMessage); message CM_MOUSEENTER;
procedure CMMouseLeave(var Message: TMessage); message CM_MOUSELEAVE;
published
end;
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
private
BT:TMyBitBtn;
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
{ TMyBitBtn }
procedure TMyBitBtn.CMMouseEnter(var Message: TMessage);
begin
inherited;
Font.Color:=clRed;
Font.Size:=16;
Refresh;
end;
procedure TMyBitBtn.CMMouseLeave(var Message: TMessage);
begin
inherited;
Font.Color:=clBtnText;
Font.Size:=9;
Refresh;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
BT:=TMyBitBtn.Create(Self);
BT.Caption:='NewButton';
BT.Parent:=Self;
BT.Width:=150;
BT.Height:=50;
end;
end.
来自: wr960204, 时间: 2002-11-13 8:48:00, ID: 1428620
Tbutton的颜色并没有公开出来。
可以TLable(Button1).Color:=clBlue;
来自: wql, 时间: 2002-11-13 9:14:00, ID: 1428682
试了一下,可以改变字体的颜色,Font.Color:=clRed改为Color:=clRed; 后可以看到快速
的 Button颜色红了一下又改变会灰色,再试
procedure TMyBitBtn.WMEraseBkgnd(var Message: TWMEraseBkgnd);
begin
inherited;
brush.Color:=clred;
end;
也不行!
来自: 视觉音乐, 时间: 2002-11-13 9:19:00, ID: 1428702
这个问题以前讨论过的,用强制转换可以,因为button的canvas属性是只读的。
来自: aizb, 时间: 2002-11-14 18:37:00, ID: 1432480
你们不用去试验了,不行的,如果要改变按钮的颜色只有重写CN_DRAWITEM消息.至于字体颜色嘛,用TBitbtn不用改什么不就可以了?
来自: jsxjd, 时间: 2002-11-14 21:55:00, ID: 1432908
是比较难的。
来自: cnjyl, 时间: 2002-11-14 22:36:00, ID: 1432966
同意上面说法。除非自已写组件。
来自: whynozg, 时间: 2002-11-17 13:01:00, ID: 1437277
API 函数
来自: joe-liu, 时间: 2002-11-29 14:20:00, ID: 1471284
button控件沒有color的屬性呀.....,用bitbtn吧....
来自: 小乙, 时间: 2002-11-29 14:28:00, ID: 1471315
可以用Toolbar+Imaglist组合,并且Toolbar.button的Flat属性设为True;imagelist属性...
自己领悟去吧!
来自: protagonist, 时间: 2002-11-29 14:42:00, ID: 1471367
Button的变色问题是个值得研究,假如急得话就用Bitbtn先代替一下。
不急的话可以学习学习。
来自: cowbird, 时间: 2002-11-29 14:45:00, ID: 1471378
关注中。。。
来自: hpn_cao(小海), 时间: 2002-12-07 16:15:00, ID: 1493088
unit Button1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, Buttons;
type
TButton1 = class(TButton)
private
FColor: TColor;
FCanvas: TCanvas;
IsFocused: Boolean;
procedure SetColor(Value: TColor);
procedure DrawItem(const DrawItemStruct: TDrawItemStruct);
procedure CNMeasureItem(var Message: TWMMeasureItem); message CN_MEASUREITEM;
procedure CNDrawItem(var Message: TWMDrawItem); message CN_DRAWITEM;
procedure CMFontChanged(var Message: TMessage); message CM_FONTCHANGED;
procedure CMEnabledChanged(var Message: TMessage); message CM_ENABLEDCHANGED;
procedure DrawButtonText(Canvas: TCanvas; const Caption: string;
TextBounds: TRect; State: TButtonState);
protected
procedure CreateParams(var Params: TCreateParams); override;
procedure SetButtonStyle(ADefault: Boolean); override;
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
published
property Color: TColor read FColor write SetColor default clBtnFace;
{ Published declarations }
end;
procedure Register;
implementation
procedure Register;
begin
RegisterComponents('Samples', [TButton1]);
end;
{ TButton1 }
procedure TButton1.CMEnabledChanged(var Message: TMessage);
begin
inherited;
Invalidate;
end;
procedure TButton1.CMFontChanged(var Message: TMessage);
begin
inherited;
Invalidate;
end;
procedure TButton1.CNDrawItem(var Message: TWMDrawItem);
begin
DrawItem(Message.DrawItemStruct^);
end;
procedure TButton1.CNMeasureItem(var Message: TWMMeasureItem);
begin
with Message.MeasureItemStruct^ do
begin
itemWidth := Width;
itemHeight := Height;
end;
end;
constructor TButton1.Create(AOwner: TComponent);
begin
inherited;
FCanvas := TCanvas.Create;
FColor := clBtnFace;
end;
procedure TButton1.CreateParams(var Params: TCreateParams);
begin
inherited CreateParams(Params);
Params.Style := Params.Style or BS_OWNERDRAW;
end;
destructor TButton1.Destroy;
begin
FCanvas.Free;
inherited;
end;
procedure TButton1.DrawButtonText(Canvas: TCanvas; const Caption: string;
TextBounds: TRect; State: TButtonState);
begin
with Canvas do
begin
Brush.Style := bsClear;
if State = bsDisabled then
begin
OffsetRect(TextBounds, 1, 1);
Font.Color := clWhite;
DrawText(Handle, PChar(Caption), Length(Caption), TextBounds, 0);
OffsetRect(TextBounds, -1, -1);
Font.Color := clDkGray;
DrawText(Handle, PChar(Caption), Length(Caption), TextBounds, 0);
end else
DrawText(Handle, PChar(Caption), Length(Caption), TextBounds,
DT_CENTER or DT_VCENTER or DT_SINGLELINE);
end;
end;
procedure TButton1.DrawItem(const DrawItemStruct: TDrawItemStruct);
var
IsDown, IsDefault: Boolean;
State: TButtonState;
R: TRect;
begin
FCanvas.Handle := DrawItemStruct.hDC;
R := ClientRect;
with DrawItemStruct do
begin
IsDown := itemState and ODS_SELECTED <> 0;
IsDefault := itemState and ODS_FOCUS <> 0;
if not Enabled then State := bsDisabled
else if IsDown then State := bsDown
else State := bsUp;
end;
if IsFocused or IsDefault then
begin
FCanvas.Pen.Color := clWindowFrame;
FCanvas.Pen.Width := 1;
FCanvas.Brush.Style := bsClear;
FCanvas.Rectangle(R.Left, R.Top, R.Right, R.Bottom);
InflateRect(R, -1, -1);
end;
if IsDown then
begin
FCanvas.Pen.Color := clBtnShadow;
FCanvas.Pen.Width := 1;
FCanvas.Brush.Color := FColor;
FCanvas.Rectangle(R.Left, R.Top, R.Right, R.Bottom);
InflateRect(R, -1, -1);
end
else
with FCanvas do
begin
DrawEdge(Handle, R, BDR_RAISEDINNER or BDR_RAISEDOUTER, BF_RECT or BF_ADJUST);
FCanvas.Pen.Color := FColor;
FCanvas.Pen.Width := 1;
FCanvas.Brush.Color := FColor;
FCanvas.Rectangle(R.Left, R.Top, R.Right, R.Bottom);
InflateRect(R, -1, -1);
end;
if IsFocused then
begin
R := ClientRect;
问题讨论没有结束 ...