вот код, который у меня есть в 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 ++, я тоже могу с этим поработать.
Спасибо
Это объясняется в TextOut
«s документация:
Когда 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;
Других решений пока нет …