在 Lazarus 的 TStatusBar 的所有者绘制面板中对齐文本
Align text in Owner Drawn Panels of TStatusBar in Lazarus
我需要更改几个 StatusBar 面板的字体颜色,因此我使用了 StatusBar 的 DrawPanel 事件。但是,我需要右对齐最后两个面板。这可能吗?
procedure TfrmMain.StatusBar1DrawPanel(StatusBar: TStatusBar;
Panel: TStatusPanel; const Rect: TRect);
begin
StatusBar.Canvas.Font.Name := 'Times New Roman';
StatusBar.Canvas.Font.Style := [];
StatusBar.Canvas.Font.Size := 12;
StatusBar.Canvas.Font.Color := clBlack;
if Panel.Index = 2 then
begin
StatusBar.Canvas.TextRect(Rect,Rect.Left,Rect.Top, 'TOTALS:');
end;
if Panel.Index = 3 then
begin
StatusBar.Canvas.Font.Color := clRed;
StatusBar.Canvas.TextRect(Rect,Rect.Left,Rect.Top, TotalQty);
end;
if Panel.Index = 4 then
begin
StatusBar.Canvas.Font.Color := clRed;
StatusBar.Canvas.TextRect(Rect,Rect.Left,Rect.Top, TotalStr);
end;
end;
在 Delphi 中,TCanvas
有一个重载的 TextRect()
方法接受 TextFormat
参数作为输入:
procedure TfrmMain.StatusBar1DrawPanel(StatusBar: TStatusBar;
Panel: TStatusPanel; const Rect: TRect);
begin
StatusBar.Canvas.Font.Name := 'Times New Roman';
StatusBar.Canvas.Font.Style := [];
StatusBar.Canvas.Font.Size := 12;
StatusBar.Canvas.Font.Color := clBlack;
case Panel.Index of
2: begin
StatusBar.Canvas.TextRect(Rect, Rect.Left, Rect.Top, 'TOTALS:');
end;
3: begin
StatusBar.Canvas.Font.Color := clRed;
StatusBar.Canvas.TextRect(Rect, TotalQty, [tfRight]);
end;
4: begin
StatusBar.Canvas.Font.Color := clRed;
StatusBar.Canvas.TextRect(Rect, TotalStr, [tfRight]);
end;
end;
end;
在 FreePascal 中,TCanvas
有一个重载的 TextRect()
方法,它接受一个 Style
参数作为输入:
procedure TfrmMain.StatusBar1DrawPanel(StatusBar: TStatusBar;
Panel: TStatusPanel; const Rect: TRect);
var
Style: TTextStyle;
begin
StatusBar.Canvas.Font.Name := 'Times New Roman';
StatusBar.Canvas.Font.Style := [];
StatusBar.Canvas.Font.Size := 12;
StatusBar.Canvas.Font.Color := clBlack;
case Panel.Index of
2: begin
StatusBar.Canvas.TextRect(Rect, Rect.Left, Rect.Top, 'TOTALS:');
end;
3: begin
StatusBar.Canvas.Font.Color := clRed;
Style.Alignment := taRightJustify;
// set other Style settings as needed...
StatusBar.Canvas.TextRect(Rect, Rect.Left, Rect.Top, TotalQty, Style);
end;
4: begin
StatusBar.Canvas.Font.Color := clRed;
Style.Alignment := taRightJustify;
// set other Style settings as needed...
StatusBar.Canvas.TextRect(Rect, Rect.Left, Rect.Top, TotalStr, Style);
end;
end;
end;
如果您使用的 Delphi/FreePascal 版本没有这些参数,您将不得不直接使用 Win32 API DrawText()
函数:
procedure TfrmMain.StatusBar1DrawPanel(StatusBar: TStatusBar;
Panel: TStatusPanel; const Rect: TRect);
var
TextRect: TRect;
begin
StatusBar.Canvas.Font.Name := 'Times New Roman';
StatusBar.Canvas.Font.Style := [];
StatusBar.Canvas.Font.Size := 12;
StatusBar.Canvas.Font.Color := clBlack;
case Panel.Index of
2: begin
StatusBar.Canvas.TextRect(Rect, Rect.Left, Rect.Top, 'TOTALS:');
end;
3: begin
StatusBar.Canvas.Font.Color := clRed;
TextRect := Rect;
DrawText(StatusBar.Canvas.Handle, PChar(TotalQty), Length(TotalQty), TextRect, DT_RIGHT);
// alternatively, to avoid making a copy:
//DrawText(..., PRect(@Rect)^, ...);
end;
4: begin
StatusBar.Canvas.Font.Color := clRed;
TextRect := Rect;
DrawText(StatusBar.Canvas.Handle, PChar(TotalStr), Length(TotalStr), TextRect, DT_RIGHT);
// alternatively, to avoid making a copy:
//DrawText(..., PRect(@Rect)^, ...);
end;
end;
end;
我需要更改几个 StatusBar 面板的字体颜色,因此我使用了 StatusBar 的 DrawPanel 事件。但是,我需要右对齐最后两个面板。这可能吗?
procedure TfrmMain.StatusBar1DrawPanel(StatusBar: TStatusBar;
Panel: TStatusPanel; const Rect: TRect);
begin
StatusBar.Canvas.Font.Name := 'Times New Roman';
StatusBar.Canvas.Font.Style := [];
StatusBar.Canvas.Font.Size := 12;
StatusBar.Canvas.Font.Color := clBlack;
if Panel.Index = 2 then
begin
StatusBar.Canvas.TextRect(Rect,Rect.Left,Rect.Top, 'TOTALS:');
end;
if Panel.Index = 3 then
begin
StatusBar.Canvas.Font.Color := clRed;
StatusBar.Canvas.TextRect(Rect,Rect.Left,Rect.Top, TotalQty);
end;
if Panel.Index = 4 then
begin
StatusBar.Canvas.Font.Color := clRed;
StatusBar.Canvas.TextRect(Rect,Rect.Left,Rect.Top, TotalStr);
end;
end;
在 Delphi 中,TCanvas
有一个重载的 TextRect()
方法接受 TextFormat
参数作为输入:
procedure TfrmMain.StatusBar1DrawPanel(StatusBar: TStatusBar;
Panel: TStatusPanel; const Rect: TRect);
begin
StatusBar.Canvas.Font.Name := 'Times New Roman';
StatusBar.Canvas.Font.Style := [];
StatusBar.Canvas.Font.Size := 12;
StatusBar.Canvas.Font.Color := clBlack;
case Panel.Index of
2: begin
StatusBar.Canvas.TextRect(Rect, Rect.Left, Rect.Top, 'TOTALS:');
end;
3: begin
StatusBar.Canvas.Font.Color := clRed;
StatusBar.Canvas.TextRect(Rect, TotalQty, [tfRight]);
end;
4: begin
StatusBar.Canvas.Font.Color := clRed;
StatusBar.Canvas.TextRect(Rect, TotalStr, [tfRight]);
end;
end;
end;
在 FreePascal 中,TCanvas
有一个重载的 TextRect()
方法,它接受一个 Style
参数作为输入:
procedure TfrmMain.StatusBar1DrawPanel(StatusBar: TStatusBar;
Panel: TStatusPanel; const Rect: TRect);
var
Style: TTextStyle;
begin
StatusBar.Canvas.Font.Name := 'Times New Roman';
StatusBar.Canvas.Font.Style := [];
StatusBar.Canvas.Font.Size := 12;
StatusBar.Canvas.Font.Color := clBlack;
case Panel.Index of
2: begin
StatusBar.Canvas.TextRect(Rect, Rect.Left, Rect.Top, 'TOTALS:');
end;
3: begin
StatusBar.Canvas.Font.Color := clRed;
Style.Alignment := taRightJustify;
// set other Style settings as needed...
StatusBar.Canvas.TextRect(Rect, Rect.Left, Rect.Top, TotalQty, Style);
end;
4: begin
StatusBar.Canvas.Font.Color := clRed;
Style.Alignment := taRightJustify;
// set other Style settings as needed...
StatusBar.Canvas.TextRect(Rect, Rect.Left, Rect.Top, TotalStr, Style);
end;
end;
end;
如果您使用的 Delphi/FreePascal 版本没有这些参数,您将不得不直接使用 Win32 API DrawText()
函数:
procedure TfrmMain.StatusBar1DrawPanel(StatusBar: TStatusBar;
Panel: TStatusPanel; const Rect: TRect);
var
TextRect: TRect;
begin
StatusBar.Canvas.Font.Name := 'Times New Roman';
StatusBar.Canvas.Font.Style := [];
StatusBar.Canvas.Font.Size := 12;
StatusBar.Canvas.Font.Color := clBlack;
case Panel.Index of
2: begin
StatusBar.Canvas.TextRect(Rect, Rect.Left, Rect.Top, 'TOTALS:');
end;
3: begin
StatusBar.Canvas.Font.Color := clRed;
TextRect := Rect;
DrawText(StatusBar.Canvas.Handle, PChar(TotalQty), Length(TotalQty), TextRect, DT_RIGHT);
// alternatively, to avoid making a copy:
//DrawText(..., PRect(@Rect)^, ...);
end;
4: begin
StatusBar.Canvas.Font.Color := clRed;
TextRect := Rect;
DrawText(StatusBar.Canvas.Handle, PChar(TotalStr), Length(TotalStr), TextRect, DT_RIGHT);
// alternatively, to avoid making a copy:
//DrawText(..., PRect(@Rect)^, ...);
end;
end;
end;