Windows GDI中的Delphi TextRect

3
在GDI中是否有类似于Delphi TextRect的东西?我查看了DrawText、DrawTextEx,但没有找到所需的内容。我需要绘制一个进度条的百分比文本,该文本被分成两个彩色部分,例如文本的左侧是黑色,右侧是白色。通常在所有进度条中都是如此。谢谢你的回答!

在GDI中,您可以使用TextOutDrawText(DrawTextEx)。这些函数比Delphi函数包含更多功能。您需要什么特定的功能?您的TCanvas代码是什么样子的?为什么您感觉需要放弃TCanvas - Andreas Rejbrand
但我需要一个TextRect的主要思想(在那里我可以剪切文本的一部分而不是绘制它)。我在DrawText / Ex中没有看到它。请参见发布的图片,我需要像TGauge(或其他进度条)中那样绘制文本。 - maxfax
1个回答

10
你正在寻找 ExtTextOut 函数。
示例:
procedure TForm4.FormPaint(Sender: TObject);
const
  S = 'This is a sample text';
begin
  ExtTextOut(Canvas.Handle, 10, 10, ETO_CLIPPED,
    Rect(40, 10, 100, 100), PChar(S), length(S), nil)    
end;

但我认为你真正想做的是绘制“非彩色文本”

procedure DrawTextNOT(const hDC: HDC; const Font: TFont; const Text: string; const X, Y: integer);
begin
  with TBitmap.Create do
    try
      Canvas.Font.Assign(Font);
      with Canvas.TextExtent(Text) do
        SetSize(cx, cy);
      Canvas.Brush.Color := clBlack;
      Canvas.FillRect(Rect(0, 0, Width, Height));
      Canvas.Font.Color := clWhite;
      Canvas.TextOut(0, 0, Text);
      BitBlt(hDC, X, Y, Width, Height, Canvas.Handle, 0, 0, SRCINVERT);
    finally
      Free;
    end;
end;

procedure TForm4.FormPaint(Sender: TObject);
const
  S = 'This is a sample text';
var
  ext: TSize;
begin
  Canvas.Brush.Color := clBlack;
  Canvas.FillRect(Rect(0, 0, Width div 2, Height));
  Canvas.Brush.Color := clWhite;
  Canvas.FillRect(Rect(Width div 2, 0, Width, Height));
  ext := Canvas.TextExtent(S);

  DrawTextNOT(Canvas.Handle, Canvas.Font, S, (Width - ext.cx) div 2,
    (Height - ext.cy) div 2);
end;

屏幕截图
(来源:rejbrand.se)


@maxfax:好的,现在(迟到总比不到好——有时我有点“慢”……)我明白你从TextRect中缺少什么了。你要找的WinAPI函数是ExtTextOut。不过,我想是否只需绘制单个非彩色文本会更简单呢…… - Andreas Rejbrand

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接