button的按钮有二种颜色的渐层变化(200分)

  • 主题发起人 主题发起人 Sophiezz
  • 开始时间 开始时间
S

Sophiezz

Unregistered / Unconfirmed
GUEST, unregistred user!
请问
如何创建一个tbutton的类使之能有二种颜色的渐层变化的色层, 并在程式执行时能动态改变它?
 
从twincontrol开始把canvas开放出来,重新写一个新的tbutton类。没试过,理论而已:)
 
如果是我做,我就直接用图片。
 
来自:晨晨, 时间:2004-5-20 10:37:18, ID:2619262
如果是我做,我就直接用图片。

方法可行,到时候不满意,换图片就可以了。
 
我们公司的一个三态按钮类:
unit uegimagebtn;

interface

uses
Windows, Messages, SysUtils, Classes, Controls, ExtCtrls,Graphics,Dialogs;

type
TEgImageBtn = class(TImage)
private
FBFistDraw : Boolean;
FDownImage: TBitmap;
FOverImage: TBitmap;
FUpImage: TBitmap;
bmousein:boolean;
procedure SetDownImage(const Value: TBitmap);
procedure SetOverImage(const Value: TBitmap);
procedure CMMouseEnter(var Message: TMessage); message CM_MOUSEENTER;
procedure CMMouseLeave(var Message: TMessage); message CM_MOUSELEAVE;
procedure MouseDown(Button: TMouseButton; Shift: TShiftState;
X, Y: Integer); override;
procedure MouseUp(Button: TMouseButton; Shift: TShiftState;
X, Y: Integer); override;

{ Private declarations }
protected
procedure paint; override;
{ Protected declarations }
public
{ Public declarations }
constructor Create(AOwner: TComponent); override;
destructor destroy; override;
published
{ Published declarations }
property Action;
property DownImage : TBitmap read FDownImage write SetDownImage;
property OverImage : TBitmap read FOverImage write SetOverImage;
end;

procedure Register;

implementation

procedure Register;
begin
RegisterComponents('亿格', [TEgImageBtn]);
end;

procedure TEgImageBtn.CMMouseEnter(var Message: TMessage);
begin
if bmousein then
exit;
bmousein:=true;
self.Picture.Assign(self.OverImage);
end;

procedure TEgImageBtn.CMMouseLeave(var Message: TMessage);
begin
bmousein:=false;
self.Picture.Assign(self.FUpImage);
end;

constructor TEgImageBtn.Create(AOwner: TComponent);
begin
inherited Create(AOwner);;
FUpImage := TBitmap.Create();
FDownImage := TBitmap.Create();
FOverImage := TBitmap.Create();
FUpImage.Assign(self.Picture.Bitmap);
self.FBFistDraw := True;
end;

destructor TEgImageBtn.destroy;
begin
FOverImage.Free();
FDownImage.Free();
FUpImage.Free();
inherited Destroy;
end;

procedure TEgImageBtn.MouseDown(Button: TMouseButton; Shift: TShiftState; X,
Y: Integer);
begin
inherited MouseDown(Button,Shift,X,Y);
self.Picture.Assign(self.FDownImage);
end;

procedure TEgImageBtn.MouseUp(Button: TMouseButton; Shift: TShiftState; X,
Y: Integer);
begin
inherited MouseUp(Button,Shift,X,Y);
self.Picture.Assign(self.FUpImage);
end;

procedure TEgImageBtn.paint;
begin
inherited paint();
if FBFistDraw then
begin
FBFistDraw := False;
self.FUpImage.Assign(self.Picture.Bitmap);
end;
end;


procedure TEgImageBtn.SetDownImage(const Value: TBitmap);
begin
FDownImage.Assign(Value);
end;


procedure TEgImageBtn.SetOverImage(const Value: TBitmap);
begin
FOverImage.Assign(Value);
end;

end.
 
我在程式的動態執行, 要做到在一個button使二種顏色的變化放在上面如紅色---紫色(混合後)---藍色的由上而下的變化, 如果用圖片可能逹不到我老闆的要求, 各位大大 , 請幫幫忙[:(]
 
我也接触这方面不久,觉得如下就可以符合你的要求啦/!要有其他的要求,再补充!

{
初始:蓝色;
鼠标左键按下:红色;
鼠标放开:黑色;
鼠标移开:蓝色;
}


unit ColorBtn;

interface

uses Windows, Messages, SysUtils, Classes, Controls, ExtCtrls,
Graphics,Dialogs;

type

TColorBtn = class(TGraphicControl)
private
OnMDown: TMouseEvent;
OnMUp: TMouseEvent;
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 MouseLeave(var Message: TMessage); message CM_MOUSELEAVE;
procedure Click;override;
public
constructor Create(AOwner: TComponent);override;
published
property OnMouseDown: TMouseEvent read OnMDown write OnMDown;
property OnMouseUp: TMouseEvent read OnMUp write OnMup;
end;

procedure Register;

implementation

procedure Register;
begin
RegisterComponents('MyTest', [TColorBtn]);
end;

{ TColorBtn }

procedure TColorBtn.Click;
begin
inherited;

end;

constructor TColorBtn.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
Width := 30;
Height := 30;
end;

procedure TColorBtn.MouseDown(Button: TMouseButton; Shift: TShiftState; X,
Y: Integer);
begin
inherited MouseDown(Button, Shift, x, y);
canvas.Brush.Color := clRed;
canvas.FillRect(Rect(0,0,30,30));
end;

procedure TColorBtn.MouseLeave(var Message: TMessage);
begin
Paint;
end;

procedure TColorBtn.MouseUp(Button: TMouseButton; Shift: TShiftState; X,
Y: Integer);
begin
inherited MouseUp(Button, Shift, x, y);
canvas.Brush.Color := clBlack;
canvas.FillRect(Rect(0,0,30,30));
end;

procedure TColorBtn.Paint;
begin
inherited Paint;
canvas.Brush.Color := clBlue;
canvas.FillRect(Rect(0,0,30,30));
end;

end.

哈哈,是不是觉得太简单了啊...
 
啊? 也不知道是不是自己的悟性太差,现在都搞糊涂了,,什么颜色由上而下地变化,听不懂 [:(]
我上面的代码符合你的要求不?[8D] 应该可以了吧!
 
做到类似如 http://alf-li.tripod.com/concmd15.zip 其程式中的介面设计的btton变化的动作
 
是http://member.hkbn.net/%7Elialfred/convertz711.zip 才对 , 那是一个中文繁/简内码转换器的程式
 
真不懂你说的什么。
如果你只想用按下按钮时的效果。这样就可以了

在鼠标按下的时候,触发按下事件,在事件里处理‘紅色’
方法有两种,
1.用图片附值的方法,
例:
BitBtn1.Glyph.Canvas
2.用加图的方法
紫色(混合後)---藍色
方法一样

最后可以打包成ATX
 
用图片,蠢方法。
这真的是很简单的问题呀,这么这么多人都回答不了,把问题说清楚一点,我回答你,关键在于paint。
关键是下面这个过程,其他的,不用我说,简单的不得了,怎么做控件,你应该清楚。
procedure FillGradient(const DC: HDC; const ARect: TRect; const StartColor,
EndColor: TColorRef; const Direction: TGradDir);
var
rc1, rc2, gc1, gc2,
bc1, bc2, Counter: Integer;
Brush: HBrush;
begin
rc1 := GetRValue(StartColor);
gc1 := GetGValue(StartColor);
bc1 := GetBValue(StartColor);
rc2 := GetRValue(EndColor);
gc2 := GetGValue(EndColor);
bc2 := GetBValue(EndColor);

if Direction = gdTopBottom then
for Counter := ARect.Top to ARect.Bottom do
begin
Brush := CreateSolidBrush(
RGB((rc1 + (((rc2 - rc1) * (ARect.Top + Counter)) div ARect.Bottom)),
(gc1 + (((gc2 - gc1) * (ARect.Top + Counter)) div ARect.Bottom)),
(bc1 + (((bc2 - bc1) * (ARect.Top + Counter)) div ARect.Bottom))));
FillRect(DC, Rect(0, ARect.Top, ARect.Right, ARect.Bottom - Counter + 1), Brush);
DeleteObject(Brush);
end
else
for Counter := ARect.Left to ARect.Right do
begin
Brush := CreateSolidBrush(
RGB((rc1 + (((rc2 - rc1) * (ARect.Left + Counter)) div ARect.Right)),
(gc1 + (((gc2 - gc1) * (ARect.Left + Counter)) div ARect.Right)),
(bc1 + (((bc2 - bc1) * (ARect.Left + Counter)) div ARect.Right))));
FillRect(DC, Rect(ARect.Left, ARect.Top, ARect.Right - Counter +1, ARect.Bottom), Brush);
DeleteObject(Brush);
end;
end;÷

 
多人接受答案了。
 

Similar threads

S
回复
0
查看
1K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
922
SUNSTONE的Delphi笔记
S
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
后退
顶部