delphi - 在 Delphi 中初始程序加载后更改一个 TStatusPanel 的颜色?

标签 delphi colors c++builder statusbar ondraw

我有一个程序,其底部的状态栏包含三个元素。我想用不同的字体颜色重新绘制第二个元素以表示用户是有效的。我的问题的第一部分是:

a) 如何以与默认文本不同的颜色重新绘制文本?

和b)如何在触发事件(例如按下按钮)后以不同的颜色绘制文本?

我当前的代码如下。我试图检查面板以不同颜色重新绘制的条件是否正确(CurrentUser.Valid,这是一个 bool 值),然后尝试重新着色文本。目前这不起作用。

procedure TChatFormMain.sbarMainDrawPanel(StatusBar: TStatusBar;
  Panel: TStatusPanel; const Rect: TRect);
var
  RectForText: TRect;
begin
  if (Panel = StatusBar.Panels[1]) and (CurrentUser.Valid) then
  begin
    sbarMain.Canvas.Font.Color := clGreen;
    RectForText := Rect;
    StatusBar.Canvas.FillRect(RectForText);
    DrawText(sbarMain.Canvas.Handle, PChar(Panel.Text), -1, RectForText,
      DT_SINGLELINE or DT_VCENTER or DT_LEFT);
  end;
end;

在代码的另一部分中,我调用 StatusBar.repaint; 来尝试使用新的文本颜色重新绘制栏,这是正确的吗?

更新 MCVE:

unit colourStatusU;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.ComCtrls;

type
  TForm1 = class(TForm)
    StatusBar1: TStatusBar;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
    procedure StatusBar1DrawPanel(StatusBar: TStatusBar; Panel: TStatusPanel;
      const Rect: TRect);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  valid : boolean;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  valid := true;
  StatusBar1.Repaint;
end;

procedure TForm1.StatusBar1DrawPanel(StatusBar: TStatusBar; Panel: TStatusPanel;
  const Rect: TRect);
var
  RectForText: TRect;
begin
  if (Panel = StatusBar.Panels[1]) and (Valid) then
  begin
    Canvas.Font.Color := clGreen;
    RectForText := Rect;
    Canvas.FillRect(RectForText);
    DrawText(Canvas.Handle, PChar(Panel.Text), -1, RectForText,
      DT_SINGLELINE or DT_VCENTER or DT_LEFT);
  end;
end;

end.

最佳答案

只有 Style 设置为 psOwnerDraw 的面板才会调用 OnDrawPanel 事件,因此请确保您已设置 >在对象检查器或代码中正确设置样式

要绘制的 Canvas 必须是 TStatusBar.Canvas,但您正在使用 TForm.Canvas。使用由 OnDrawPanel 事件提供的 StatusBarCanvas:

procedure TForm1.StatusBar1DrawPanel(StatusBar: TStatusBar; Panel: TStatusPanel;
  const Rect: TRect);
var
  RectForText: TRect;
begin
  if (Panel = StatusBar.Panels[1]) and (Valid) then
  begin
    StatusBar.Canvas.Font.Color := clGreen;
    RectForText := Rect;
    StatusBar.Canvas.FillRect(RectForText);
    DrawText(StatusBar.Canvas.Handle, PChar(Panel.Text), -1, RectForText, DT_SINGLELINE or DT_VCENTER or DT_LEFT);
  end;
end;

调用Repaint()Invalidate()来强制状态栏刷新其绘制是要使用的方法。

关于delphi - 在 Delphi 中初始程序加载后更改一个 TStatusPanel 的颜色?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26598650/

相关文章:

mysql - 通过 FireDac 和 MySql 的主/详细数据快照 ¿为什么在一个客户端中写入详细记录的数据在第二个客户端中看不到?

delphi - 向 TActionList 中的 Action 添加新属性

html - 为什么无论我做什么都不能更改复选框颜色?

c++ - 将 char* 字符串参数打印到 UnicodeString 对象中

c++ - 通过 VCL 异常例程捕获 C++ 异常

firemonkey - 替换已弃用的 Release 函数

delphi - 在 Windows 7 上的 Delphi 2007 中枚举终端服务 session

Delphi调试错误的单元

c# - 使用 GDI+ 进行高级颜色混合

bash 命令在管道时保留颜色