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;
Другие вопросы по тегам