【问题标题】:Delphi button transitions using VCL使用 VCL 的 Delphi 按钮转换
【发布时间】:2019-04-17 15:34:20
【问题描述】:

有没有什么方法可以使用 Delphi 和 VCL 进行转换(例如,当您单击红色按钮时变为绿色)?类似于 CSS 过渡的东西...

【问题讨论】:

  • 只是古玩你知道缓动函数吗?
  • 如果你说是,那么这就是你的答案。 :)
  • @NasreddineGalfout 是的,我是 Delphi 的新手,有什么方法可以使用动画循环吗?我可以从那里拿走它:P
  • 那你就会对codeProject c#中的this article感兴趣了,思路基本一样
  • 虽然这是使用 C#,但我似乎找不到任何形式的 Delphi 动画循环:/

标签: delphi vcl


【解决方案1】:

这是我快速研究的成果

  • 首先你需要 TAnimateEasing 来自 thissourceForge 存储库。
  • AnswerAnswer 用 Ja​​va 编写,讲述如何从一种颜色变为另一种颜色。
  • Answer(我的)关于自定义 TSpeedButton。

你把所有这些结合起来就得到了这个

如您所见,我对 java 答案的翻译不是那么好,但这将是一个不同的问题。您问如何在按钮中进行转换,这就是您的答案

unit NCRSpeedButton;

interface

uses
  Winapi.Windows, Vcl.Controls, Winapi.Messages, Vcl.Graphics, System.Classes, AnimateEasing;

type
  TButtonState = (bs_Down, bs_Normal, bs_Active);

  TNCRSpeedButton = class(TGraphicControl)
  private
    FEasingAnimation: TAnimateEasing;
    FColor: TColor;
    FFromColor : TColor;
    FToColor : TColor;
    FBorderColor: TColor;
    procedure CMMouseDown(var Message: TMessage); message WM_LBUTTONDOWN;
    procedure CMMouseUp(var Message: TMessage); message WM_LBUTTONUP;
    procedure SetBorderColor(aBorderColor: TColor);
    procedure SetFromColor(const Value: TColor);
    procedure SetToColor(const Value: TColor);
    procedure AnimateTickEvent(Sender: TObject; Value: Extended);
    procedure ANotifyEvent(Sender: TObject);
  protected
    procedure Paint; override;
  public
    Constructor Create(Owner: TComponent); override;
    Destructor Destroy; override;
  published
    property FromColor: TColor read FFromColor write SetFromColor;
    property ToColor: TColor read FToColor write SetToColor;
    property BorderColor: TColor read FBorderColor write SetBorderColor;
    property ParentShowHint;
    property ParentBiDiMode;
    property PopupMenu;
    property ShowHint;
    property Visible;
    property OnClick;
    property OnDblClick;
    property OnMouseActivate;
    property OnMouseDown;
    property OnMouseEnter;
    property OnMouseLeave;
    property OnMouseMove;
    property OnMouseUp;
  end;


implementation
 Uses
  System.Math,
  System.UITypes;


{ TNCRSpeedButton }

Constructor TNCRSpeedButton.Create(Owner: TComponent);
begin
  inherited Create(Owner);
  FColor := clBtnFace;
  FBorderColor := clBlue;
  SetBounds(0, 0, 200, 50);
  FEasingAnimation := TAnimateEasing.Create;
  FEasingAnimation.OnTick := AnimateTickEvent;
  FEasingAnimation.OnFinish := ANotifyEvent;
end;

Destructor TNCRSpeedButton.Destroy;
begin
  FEasingAnimation.Free;
  inherited;
end;

procedure TNCRSpeedButton.Paint;
begin

  Canvas.Brush.Color := FColor;
  Canvas.FillRect(ClientRect);

  // Drawing Borders

  Canvas.Pen.Color := FBorderColor;
  Canvas.MoveTo(0, 0);
  Canvas.LineTo(Width-1, 0);
  Canvas.LineTo(Width-1, Height-1);
  Canvas.LineTo(0, Height-1);
  Canvas.LineTo(0, 0);

end;

procedure TNCRSpeedButton.AnimateTickEvent(Sender: TObject; Value: Extended);
var
  Ratio: Integer;
begin
  Ratio := 1 - Floor(Value);

  TColorRec(FColor).R := Floor((Ratio  * TColorRec(FToColor).R) + ((1 - Ratio) * TColorRec(FFromColor).R));
  TColorRec(FColor).G := Floor((Ratio  * TColorRec(FToColor).G) + ((1 - Ratio) * TColorRec(FFromColor).G));
  TColorRec(FColor).B := Floor((Ratio  * TColorRec(FToColor).B) + ((1 - Ratio) * TColorRec(FFromColor).B));

  Invalidate;
end;

procedure TNCRSpeedButton.ANotifyEvent(Sender: TObject);
begin
  FColor := FToColor;
  Invalidate;
end;

procedure TNCRSpeedButton.CMMouseDown(var Message: TMessage);
begin
  inherited;
  Invalidate;
end;

procedure TNCRSpeedButton.CMMouseUp(var Message: TMessage);
begin
  inherited;
  Invalidate;
  FColor := FFromColor;

  FEasingAnimation.Animating(0, 500, 2000, TEasingType.etBackEaseIn);
end;

procedure TNCRSpeedButton.SetBorderColor(aBorderColor: TColor);
begin
  FBorderColor := aBorderColor;
  Invalidate;
end;

procedure TNCRSpeedButton.SetFromColor(const Value: TColor);
begin
  FColor := Value;
  FFromColor  := Value;
  Invalidate;
end;

procedure TNCRSpeedButton.SetToColor(const Value: TColor);
begin
  FToColor := Value;
  Invalidate;
end;

end. 

我将把你如何解决过渡中的黑色留给你:)。

【讨论】:

  • 非常感谢,不胜感激!
  • @nick 我希望这能让您了解如何做到这一点,否则翻译 C# 项目是另一种方法。
  • 是的,谢谢!不是 Delphi 的粉丝,但工作需要它!
【解决方案2】:

标准TButton 不支持您的要求。默认情况下,它的颜色来自操作系统,而不是 VCL。

您需要一个所有者绘制的按钮来更改颜色,例如TBitBtnTSpeedBtn,否则您可以继承TButton 以手动启用BS_OWNERDRAW 窗口样式并处理WM_DRAWITEM 通知。或者使用第 3 方皮肤框架。或者,如果您的 IDE 支持,请使用 VCL 样式。

无论哪种方式,一旦你有了一个可以改变颜色的按钮,你就可以简单地使用 TTimer 来根据需要将一种颜色转换为另一种颜色。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-12-12
    • 1970-01-01
    • 2018-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多