使用Delphi获取文本限制的坐标

时间:2013-08-08 12:52:02

标签: delphi canvas coordinates gdi+

您好我使用以下代码在我的Delphi应用程序中绘制旋转文本。用户可以选择是否使用GDI +来绘制文本:

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 个答案:

答案 0 :(得分: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