如何绘制“未”着色的文本?

5
我正在寻找一种以反色绘制文本的方法。对于形状,我们有TPenMode可以设置为pmNot,但对于文本来说,这是不可行的。那么我该怎么做呢?

你想要实现什么?你确定它能够与抗锯齿文本一起工作吗? - Andreas Rejbrand
1
@Andreas:好的,这个项目的这一部分不需要抗锯齿文本;所以它是否能工作并不重要。 - Javid
我认为您需要使用GDI+来控制文本的轮廓。 - Cosmin Prund
1
你是在问如何绘制倒置文本,还是在问如何使用自定义笔绘制文本?标题问的是前者,但正文问的是后者,它们是两个不同的问题。请编辑以使它们匹配。 - Rob Kennedy
如果您之所以问这个问题是因为您想要倒置的文本来增加背景的对比度,请注意当文本颜色为灰色时,倒置将不起作用。 - Jeroen Wiert Pluimers
显示剩余2条评论
2个回答

9
这就是它的作用:
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 TForm1.FormClick(Sender: TObject);
begin
  Canvas.Brush.Color := clRed;
  Canvas.FillRect(ClientRect);
  DrawTextNOT(Canvas.Handle, Canvas.Font, 'This is a test.', 20, 100);
//  DrawTextNOT(Canvas.Handle, Canvas.Font, 'This is a test.', 20, 100);
end;

您可能还想禁用ClearType。要做到这一点,我向您推荐之前的SO问题


1
我刚刚编辑了答案,所以您不需要提供矩形,这样函数就会尊重画布的当前字体。 - Andreas Rejbrand
1
你总是最棒的!它运行良好!;) 我会照顾好其他事情,所以不用担心 :x - Javid
一如既往的好答案! - Gabriel

2

GDI文本并不是用笔绘制的。您是否考虑将文本绘制到临时位图上,并使用BitBlt进行复制?可能有一些dwRop光栅操作的组合可以实现您想要的效果。


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