如何让 TStatusBar 的各个panel字体显示不同的颜色 ( 积分: 50 )

  • 主题发起人 主题发起人 青云
  • 开始时间 开始时间

青云

Unregistered / Unconfirmed
GUEST, unregistred user!
比如在From1上放两个Button,实现下面功能:

procedure TForm1.Button1Click(Sender: TObject);
begin
StatusBar1.Panels[0].font.color:=clRed;
StatusBar1.Panels[1].font.color:=clBlack;
end;


procedure TForm1.Button2Click(Sender: TObject);
begin
StatusBar1.Panels[0].font.color:=clBlack;
StatusBar1.Panels[1].font.color:=clRed;
end;

上面这段代码的是错误的,不过已经很清楚的表达了我的意思。
我想知道如何实现这样的功能?
 
设置statusbar每一个TStatusPanel的Style为psOwnerDraw,然后在OnDrawPanel中写代码自己写画布:
procedure TForm1.StatusBar1DrawPanel(StatusBar: TStatusBar;
Panel: TStatusPanel; const Rect: TRect);
begin
case Panel.ID of
0: StatusBar.Canvas.Font.Color := clred;
1: StatusBar.Canvas.Font.Color := clBlue;
2: StatusBar.Canvas.Font.Color := ClYellow;
end;

StatusBar.Canvas.TextRect(Rect, Rect.Left, Rect.Top, Panel.Text);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
StatusBar1.Panels[0].Text := '333333';
StatusBar1.Panels[1].Text := 'gegddsf';
StatusBar1.Panels[2].Text := 'sdasasa';
end;
试试看~~~是你要的结果不~~
 
楼上的兄弟,好方法!
我也用了 StatusBar1DrawPanel ,但是发现只有窗体大小改变的时候,才触发该事件。
你提供了把StatusBar1.Panels的text 重写一遍来触发,挺有创意的。

我试试
 
procedure TForm1.Button1Click(Sender: TObject);
begin
StatusBar1.Panels[0].Text := '333333';
StatusBar1.Panels[1].Text := 'gegddsf';
StatusBar1.Panels[2].Text := 'sdasasa';
end;


这个方法,我测试过了,不能触发 StatusBar1DrawPanel 事件。

必须是 panels.text 发生变化才能触发:
于是我这样写:

procedure TFrom1.Button1Click(Sender: TObject);
var
i:Integer;
sTemp:string;
begin
inherited;
for i:=0 to StatusBar1.Panels.Count -1 do
begin
sTemp:=StatusBar1.Panels.Text;
StatusBar1.Panels.Text:='';
StatusBar1.Panels.Text:= sTemp;
end;

这样确实可以了,不过感觉写法很怪
 
将每个panel的style设置为csownerdraw;
然后在statuspanel的drawpanel事件中加如下代码
if panel =StatusBar.Panels[0] then
begin
statusbar.Canvas.Brush.color:=clred;
statusbar.Canvas.FillRect(Rect);
statusbar.Canvas.TextOut(10,10,'panel0');
end
else
begin
statusbar.Canvas.Brush.color:=clblue;
statusbar.Canvas.FillRect(Rect);
statusbar.Canvas.TextOut(100,10,'panel1');
end;
可以试一下
 
用第三方控件吧,1stClass中的TfcStatusBar,不用任何代码就能实现你想要的效果
 
procedure TForm1.StatusBar1DrawPanel(StatusBar: TStatusBar;
Panel: TStatusPanel; const Rect: TRect);
const
Colors: array[0..4] of TColor = (clWhite, clBlack, clRed, clBlue, clGreen);
Flags: array[TAlignment] of Integer = (DT_LEFT, DT_RIGHT, DT_CENTER);
var
R: TRect;
begin
R := Rect;
InflateRect(R, -2, -2);
with StatusBar.Canvas do
begin
if Panel.Index < Length(Colors) then
Font.Color := Colors[Panel.Index];
DrawText(Handle, PChar(Panel.Text), Length(Panel.Text), R, Flags[Panel.Alignment] or DT_SINGLELINE or DT_VCENTER);
end;
end;

OnDrawPanel事件应该是在重绘时产生的,无论是设置Text或是Resize或是Show,Hide都会触发。直接设置Text := 'aaaa'也有效果的,D7 + WinXP sp2
 
ANiDelphi
最好
 
后退
顶部