2016-03-31 50 views
2

çizer benim formun OnPaint olay var kodudur:BeginPath TextOut EndPath burada ters metin

enter image description here

olarak: Burada

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

ama formda elde ediyoruz Metnin ters çevrildiğini görebiliyorsunuz (metnin mavi ve arka plan gri olması gerekiyor, ancak diğer yol etrafta ve sarı çizgi metin yerine arka planın etrafında). Bunu nasıl düzeltebileceğimi bilen var mı?

C++ Builder 10 Seattle kullanıyorum, ancak Delphi veya salt C++ hilesi olduğunu bilen varsa, bununla da çalışabilirim.

teşekkürler Bu açıklanmıştır

cevap

4

TextOut 'ın documentation:

TextOut fonksiyonu bir yol parantez içine yerleştirilir

, sistemi içeren TrueType metin için bir yol oluşturur her karakter ve karakter kutusu. Oluşturulan bölge, metnin kendisinden ziyade metnin dışındaki karakter kutusudur. öğesini, aracılığıyla arka plan modunu TextOut işlevini yol parantezine yerleştirmeden önce TrueType metninin anahatına eklenmiş bölgeyi elde edebilirsiniz. Aşağıdaki, bu yordamı gösteren örnek koddur.

aşağıda belirtilen örnek kod ve snippet'imin Delphi uyarlamasıdır sarı özetlenen mavi metni çizer:

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

Teşekkür Akyüz. Hile “TextOut” un önündeki 'Canvas-> Brush-> Style = bsClear; – Sam