下面是我在表单的OnPaint事件中拥有的代码:
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++技巧,我也可以使用它。
谢谢
发布于 2016-03-31 22:53:55
这一点在TextOut的文档中有解释。
当TextOut函数放置在路径括号内时,系统将为TrueType文本生成一个路径,其中包括每个字符加上其字符框。生成的区域是字符框减去文本,而不是文本本身。在将TextOut函数放置在路径括号中之前,您可以通过将背景模式设置为透明来获得文本大纲所包含的区域。下面是演示此过程的示例代码。
下面是Delphi对上述示例代码和代码片段的适应性,绘制黄色概述的蓝色文本:
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;https://stackoverflow.com/questions/36344536
复制相似问题