我有一个程序,其底部的状态栏包含三个元素。我想用不同的字体颜色重新绘制第二个元素以表示用户是有效的。我的问题的第一部分是:
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
事件提供的 StatusBar
的 Canvas
:
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/