2016-03-31 3 views
2

вот код, который я имею в OnPaint случае моей формы:BeginPath TextOut EndPath рисует перевернутый текст

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); 

, но вот то, что я получаю от формы:

enter image description here

, как вы можете увидеть, что текст выходит инвертированным (текст должен быть синим и серым, а наоборот, а желтая - вокруг фона вместо текста). Кто-нибудь знает, как я могу это исправить?

Я использую C++ Builder 10 Seattle, но если кто-то знает, что Delphi или чистый трюк C++, я тоже могу с этим работать.

Спасибо

ответ

4

Это объясняется в TextOut «s documentation:

Когда функция 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; 
+0

Благодаря AKYÜZ. Хитрость заключалась в том, чтобы добавить 'Canvas-> Brush-> Style = bsClear;' прямо перед 'TextOut'. – Sam

Смежные вопросы