Delphi t绿极闪烁。我该怎么做?

Delphi t绿极闪烁。我该怎么做?,delphi,treeview,Delphi,Treeview,我喜欢有一个闪烁的节点。我如何做到这一点呢?公共控件中没有内置任何功能来实现这一点,因此您需要自己完成 使用TTimer,每次触发时,更改节点的任何属性,以实现闪烁效果。公共控件中没有内置任何功能来实现此目的,因此您需要自己完成 使用TTimer,每次启动时,更改节点的任何属性,以实现闪烁效果。以下内容绝不是一个完整的解决方案,而是David答案的简单示例: type TForm1 = class(TForm) TreeView1: TTreeView; Timer1: TT

我喜欢有一个闪烁的节点。我如何做到这一点呢?

公共控件中没有内置任何功能来实现这一点,因此您需要自己完成


使用
TTimer
,每次触发时,更改节点的任何属性,以实现闪烁效果。

公共控件中没有内置任何功能来实现此目的,因此您需要自己完成


使用
TTimer
,每次启动时,更改节点的任何属性,以实现闪烁效果。

以下内容绝不是一个完整的解决方案,而是David答案的简单示例:

type
  TForm1 = class(TForm)
    TreeView1: TTreeView;
    Timer1: TTimer;
    Button1: TButton;
    Button2: TButton;
    procedure TreeView1CustomDrawItem(Sender: TCustomTreeView; Node: TTreeNode;
      State: TCustomDrawState; var DefaultDraw: Boolean);
    procedure Timer1Timer(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    FHighTime: Boolean;
    FHighNode: TTreeNode;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Timer1Timer(Sender: TObject);
var
  R: TRect;
begin
  if Assigned(FHighNode) then begin
    FHighTime := not FHighTime;
    FHighNode.MakeVisible;
    R := FHighNode.DisplayRect(True);
    InvalidateRect(TreeView1.Handle, @R, True);
  end else begin
    if FHighTime then
      TreeView1.Invalidate;
    FHighTime := False;
    Timer1.Enabled := False;
  end;
end;

procedure TForm1.TreeView1CustomDrawItem(Sender: TCustomTreeView;
  Node: TTreeNode; State: TCustomDrawState; var DefaultDraw: Boolean);
const
  Colors: array [Boolean] of TColor = (clWindowText, clWindow);
  HiColors: array [Boolean] of TColor = (clHighlightText, clHighlight);
begin
  if Node = FHighNode then begin
    if cdsSelected in State then
      TreeView1.Canvas.Font.Color := HiColors[FHighTime]
    else
      TreeView1.Canvas.Font.Color := Colors[FHighTime];
  end;
end;


procedure TForm1.Button1Click(Sender: TObject);
begin
  // test
  FHighNode := TreeView1.Items[2];
  Timer1.Enabled := True;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  FHighNode := nil;
end;

您可能希望更改设计,以便设置突出显示节点就像调用setter,等等。。但无论如何,你明白了。

下面的内容绝不是一个完整的解决方案,而是大卫答案的一个简单例子:

type
  TForm1 = class(TForm)
    TreeView1: TTreeView;
    Timer1: TTimer;
    Button1: TButton;
    Button2: TButton;
    procedure TreeView1CustomDrawItem(Sender: TCustomTreeView; Node: TTreeNode;
      State: TCustomDrawState; var DefaultDraw: Boolean);
    procedure Timer1Timer(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    FHighTime: Boolean;
    FHighNode: TTreeNode;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Timer1Timer(Sender: TObject);
var
  R: TRect;
begin
  if Assigned(FHighNode) then begin
    FHighTime := not FHighTime;
    FHighNode.MakeVisible;
    R := FHighNode.DisplayRect(True);
    InvalidateRect(TreeView1.Handle, @R, True);
  end else begin
    if FHighTime then
      TreeView1.Invalidate;
    FHighTime := False;
    Timer1.Enabled := False;
  end;
end;

procedure TForm1.TreeView1CustomDrawItem(Sender: TCustomTreeView;
  Node: TTreeNode; State: TCustomDrawState; var DefaultDraw: Boolean);
const
  Colors: array [Boolean] of TColor = (clWindowText, clWindow);
  HiColors: array [Boolean] of TColor = (clHighlightText, clHighlight);
begin
  if Node = FHighNode then begin
    if cdsSelected in State then
      TreeView1.Canvas.Font.Color := HiColors[FHighTime]
    else
      TreeView1.Canvas.Font.Color := Colors[FHighTime];
  end;
end;


procedure TForm1.Button1Click(Sender: TObject);
begin
  // test
  FHighNode := TreeView1.Items[2];
  Timer1.Enabled := True;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  FHighNode := nil;
end;

您可能希望更改设计,以便设置突出显示节点就像调用setter,等等。。但无论如何,你明白了……除非该应用程序是供你个人使用的,请,请,请,不要让任何东西闪烁。这让人分心又烦人。就像动画和其他“请看我”UI“feaures”一样。除非该应用程序是供您个人使用的,请,请,请,不要让任何东西闪烁。这让人分心又烦人。就像动画和其他“请看我”UI“feaures”。