2013-08-08 4 views
3

Привет Я использую следующий код, чтобы нарисовать поворот текста в приложении Delphi. Пользователь может выбрать, если использовать или не использовать GDI + нарисовать текст:Получить координаты пределов текста с помощью Delphi

procedure TForm1.Button1Click(Sender: TObject); 
var 
    MyLogFont: TLogFont; 
    MyFont: HFont; 
    t: string; 
    ff: IGPFontfamily; 
    ft: IGPFont; 
    br: IGPSolidBrush; 
    gr: IGPGraphics; 
    pp: TGPPointF; 
    Pen: IGPPen; 
begin 
    t := 'Hello'; 

    if not DrawUsingGDIP.Checked then 
    begin 
     // Draw using GDI 
     FillChar(MyLogFont, Sizeof(MyLogFont), 0); 
     with MyLogFont do 
     begin 
     lfHeight:=0; 
     lfWidth:=0; 
     lfEscapement:=-StrToInt(Edit1.Text)*10; 
     lfOrientation:=-StrToInt(Edit1.Text)*10; 
     lfWeight:=FW_NORMAL; 
     lfItalic:=0; 
     lfUnderline:=0; 
     lfStrikeOut:=0; 
     lfCharSet:=DEFAULT_CHARSET; 
     lfOutPrecision:=OUT_DEFAULT_PRECIS; 
     lfClipPrecision:=CLIP_DEFAULT_PRECIS; 
     lfQuality:=DEFAULT_QUALITY; 
     lfPitchAndFamily:=1; 
     end; 
     MyFont:=CreateFontIndirect(MyLogFont); 
     Form1.Canvas.Font.Handle:=MyFont; 
     Form1.Canvas.Font.Name := 'Arial'; 
     Form1.Canvas.Font.Size := 13; 
     Form1.Canvas.TextOut(103, 100, t); 
    end 
    else 
    begin 
     // Draw using GDI+ 
     Pen := TGPPen.Create($FF000000); 

     ff := TGPFontFamily.Create('Arial'); 
     ft := TGPFont.Create(ff, 16, FontStyleRegular, UnitPixel); 
     br := TGPSolidBrush.Create(TGPColor.Red); 

     gr := TGPGraphics.Create(Form1.Canvas.Handle); 

     gr.SetTextRenderingHint(TextRenderingHintAntiAlias); 
     gr.TranslateTransform(100.0, 100.0); 
     gr.RotateTransform(StrToInt(Edit1.Text)); 

     pp := TGPPointF.Create(0, 0); 
     gr.DrawString(t, ft, pp, br); 

     gr.ResetTransform; 
    end; 
end; 

Теперь мне нужно знать (если это возможно без вывода текста) координаты вершин прямоугольника, который ограничивает текст (см изображения):

vertices

есть простой способ, чтобы получить эти координаты, так и без использования GDI + библиотеки?

+1

Ваш код, как представляется, GDI +. Пожалуйста, объясните, что вы подразумеваете под GDI и без него. Для начала GDI + построен поверх GDI. Таким образом, вы используете его независимо от того, что. –

+0

@DavidHeffernan Извините, я совершил небольшую ошибку. Я исправлю вопрос (GDI -> GDI +) – Martin

+1

Хорошо, я догнал. Возможно, лучшее имя, чем «CheckBox1», поможет! –

ответ

0

Для реализации GDI вы можете использовать что-то вроде

tsiz := Form1.Canvas.TextExtent(t);  // tsiz : tagSIZE 

    ang := (2.0*Pi*StrToInt(Edit1.Text))/360; // ang : double 

    tpts[0].X := 100; // tpts : Array[0..4] of TPoint 
    tpts[0].Y := 100; 
    tpts[1].X := 100 + Round(tsiz.cx * Cos(ang)); 
    tpts[1].Y := 100 + Round(tsiz.cx * Sin(ang)); 
    tpts[2].X := tpts[1].X - Round(tsiz.cy*Sin(ang)); 
    tpts[2].Y := tpts[1].Y + Round(tsiz.cy*Cos(ang)); 
    tpts[3].X := tpts[0].X - Round(tsiz.cy*Sin(ang)); 
    tpts[3].Y := tpts[0].Y + Round(tsiz.cy*Cos(ang)); 
    tpts[4] := tpts[0]; 

    //tpts now contains corner points of the bounding rect 

    Form1.Canvas.TextOut(100, 100, t); // draw text 
    Form1.Canvas.Polyline(tpts);  // draw bounding rect 

для GDI + это намного проще

sft := TGPStringFormat.GenericDefault;  // sft : IGPStringFormat 
    mRect := gr.MeasureString(t, ft, pp, sft); // mRect : TGPRectF 
    // do this after transforms 
    // mRect is now the bounding rect 
    gr.DrawRectangle(Pen,mRect); 
    // mRect is transformed by DrawRectangle - coordinates can be 
    // calculated in the same way as the GDI case where 
    // mRect.Width -> tsiz.cx and mRect.Height -> tsiz.cy 

enter image description here

+0

Это прекрасно. Спасибо. У вас есть решение с переменной выравнивания? (например, SetTextAlign (DC, TA_CENTER + TA_BASELINE), для GDI и sFormat.Alignment: = StringAlignmentCenter; для GDI +) – Martin

+0

@Martin - Я ожидаю, что что-то подобное должно работать. Выравнивание имеет смысл только в том случае, если вы рисуете его в прямоугольник, поэтому смещения будут вычисляться аналогичным образом. –

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