在 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;