首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >BeginPath Textout EndPath绘制倒文本

BeginPath Textout EndPath绘制倒文本
EN

Stack Overflow用户
提问于 2016-03-31 21:54:49
回答 1查看 699关注 0票数 2

下面是我在表单的OnPaint事件中拥有的代码:

代码语言:javascript
复制
int elementCount;
String tStr = L"15:00";

::BeginPath(Canvas->Handle);
::TextOut(Canvas->Handle, 5, 5, tStr.c_str(), tStr.Length());
::EndPath(Canvas->Handle);
elementCount = ::GetPath(Canvas->Handle, NULL, NULL, 0);
Canvas->Brush->Color = clBlue;
Canvas->Pen->Color = clYellow;
Canvas->Pen->Width = 4;
if(0 < elementCount)
{
    boost::scoped_array<TPoint> mPoints(new TPoint[elementCount]);
    boost::scoped_array<BYTE> mTypes(new BYTE[elementCount]);

    ::GetPath(Canvas->Handle, mPoints.get(), mTypes.get(), elementCount);
    ::FillPath(Canvas->Handle);
    ::PolyDraw(Canvas->Handle, mPoints.get(), mTypes.get(), elementCount);
}
else
    ::StrokeAndFillPath(Canvas->Handle);

但我在表格上看到的是:

正如你所看到的,文本是倒转的(文本必须是蓝色的,背景是灰色的,但是它是相反的,黄色的线是围绕在背景周围而不是文本)。有人知道我怎么解决这个问题吗?

我正在使用C++ Builder 10西雅图,但是如果有人知道德尔福或纯粹的C++技巧,我也可以使用它。

谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-03-31 22:53:55

这一点在TextOut文档中有解释。

TextOut函数放置在路径括号内时,系统将为TrueType文本生成一个路径,其中包括每个字符加上其字符框。生成的区域是字符框减去文本,而不是文本本身。在将TextOut函数放置在路径括号中之前,您可以通过将背景模式设置为透明来获得文本大纲所包含的区域。下面是演示此过程的示例代码。

下面是Delphi对上述示例代码和代码片段的适应性,绘制黄色概述的蓝色文本:

代码语言:javascript
复制
procedure TForm1.FormPaint(Sender: TObject);
var
  elementCount: Integer;
  mPoints: array of TPoint;
  mTypes: array of Byte;
const
  tStr = '15:00';
begin
  BeginPath(Canvas.Handle);
  Canvas.Brush.Style := bsClear;
  TextOut(Canvas.Handle, 5, 5, PChar(tStr), Length(tStr));
  EndPath(Canvas.Handle);

  Canvas.Brush.Color := clBlue;
  Canvas.Pen.Color := clYellow;
  Canvas.Pen.Width := 4;

  elementCount := GetPath(Canvas.Handle, Pointer(nil)^, Pointer(nil)^, 0);
  if elementCount > 0 then begin
    SetLength(mPoints, elementCount);
    SetLength(mTypes, elementCount);
    GetPath(Canvas.Handle, mPoints[0], mTypes[0], elementCount);

    Canvas.Brush.Style := bsSolid;
    SelectClipPath(Canvas.Handle, RGN_AND);
    Canvas.FillRect(ClientRect);

    SelectClipRgn(Canvas.Handle, 0);
    PolyDraw(Canvas.Handle, mPoints[0], mTypes[0], elementCount);
  end else
    StrokeAndFillPath(Canvas.Handle);
end;
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36344536

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档