2016-03-31 5 views
2

hier ist der Code, den ich in OnPaint Ereignis meiner Form haben:BeginPath TEXTOUT EndPath zieht invertierten Text

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

aber hier ist, was ich auf dem Formular erhalten:

enter image description here

als Sie können sehen, dass der Text invertiert ausgegeben wird (der Text muss blau und der Hintergrund grau sein, aber es ist andersherum und die gelbe Linie ist um den Hintergrund statt Text). Weiß jemand wie ich das beheben kann?

Ich benutze C++ Builder 10 Seattle, aber wenn jemand Delphi oder reinen C++ - Trick kennt, kann ich auch damit arbeiten.

Danke

Antwort

4

Die in TextOut ‚erklären s documentation:

Wenn die TextOut Funktion in einem Pfad Halterung platziert wird, das System einen Pfad für den Truetype-Text erzeugt, die folgenden beinhaltet jedes Zeichen plus seine Zeichenbox. Die generierte Region ist die Zeichen-Box minus dem Text und nicht der Text selbst. Sie können den Bereich erhalten, der von der Gliederung des TrueType-Texts umgeben wird, indem den Hintergrundmodus auf transparent setzt, bevor die TextOut Funktion in der Pfadklammer platziert. Es folgt ein Beispielcode, der diese Prozedur veranschaulicht.

Das ist eine Delphi-Adaption des genannten Beispielcode und Ihre Schnipsel, zieht gelb skizzierte blauen Text:

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

Dank Akyuz. Der Trick bestand darin, 'Canvas-> Brush-> Style = bsClear;' direkt vor 'TextOut' hinzuzufügen. – Sam

Verwandte Themen