BeginPath Textout EndPath рисует перевернутый текст
Вот код, который у меня есть в 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 Seattle, но если кто-то знает, что такое Delphi или чистый трюк на C++, я тоже могу с этим поработать.
Спасибо
1 ответ
Это объясняется в TextOut
Документация:
Когда функция TextOut помещается в скобку пути, система генерирует путь для текста TrueType, который включает в себя каждый символ плюс его поле символов. Сгенерированная область - это символьное поле минус текст, а не сам текст. Вы можете получить область, заключенную в контур текста 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;