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

Posted

技术标签:

【中文标题】在 Delphi 中初始程序加载后更改一个 TStatusPanel 的颜色?【英文标题】:Changing the color of one TStatusPanel after initial program load in Delphi? 【发布时间】:2014-12-23 06:52:03 【问题描述】:

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

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

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

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

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.

【问题讨论】:

也许您只是没有将第二个面板的样式设置为 psOwnerDraw ..现在我觉得自己很愚蠢。它现在绘制文本,但它一直在表单顶部而不是在面板内部。 DrawText(StatusBar.Canvas.Handle ...StatusBar.Canvas.Font. 让您自己回答这个问题。 :) 【参考方案1】:

OnDrawPanel 事件仅针对将其Style 设置为psOwnerDraw 的面板调用,因此请确保您已在对象检查器或代码中正确设置了Style

要绘制的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 中初始程序加载后更改一个 TStatusPanel 的颜色?的主要内容,如果未能解决你的问题,请参考以下文章

运行具有嵌套 var 访问权限的 Delphi 程序后 Excel.exe 仍处于加载状态

delphi 中ADO配置,数据连接时,显示测试连接失败,初始化提供的程序错误,灾难性故障,这是因为啥?

更改初始视图后如何加载状态栏

如何创建一个通知服务器,在数据库更改时通知 Delphi 应用程序?

delphi xe android 更改ProgressBar1进度条颜色

delphi如何调用DLL