您当前的位置:delphi教程 > Delphi笔记 >  居中方式画TTF字符,支持字符旋转

居中方式画TTF字符,支持字符旋转

procedure DrawTextByCenter(Canvas : TCanvas;nX,nY,nH,nW,nColor : integer;dAngle : double;sFontName,sSymbol : string);
const FOCUS_RIDUS = 30;
var
 lfont: TLogFont;
    oldFont1,OldFont2, newFont: HFont;
    FW,FH : integer;  //字体高度和宽度
    Ceta : double;   //初始角度
    OX,OY : integer;  // x offset and y offset
    OldPenColor,OldColor : TColor;
    IX,IY : integer;
    OldBrushMode : TBrushStyle;
    OldPenWidth : integer;
begin
    with lfont do begin
        lfHeight := nH;
        lfWidth  := nW;
        lfEscapement := Trunc(dAngle*1800/PI);
        lfItalic := 0;
        lfUnderline := 0;
        lfStrikeOut := 0;
        lfCharSet := 1;
        lfOutPrecision := OUT_TT_PRECIS;
        lfClipPrecision:= CLIP_DEFAULT_PRECIS;
        lfQuality := PROOF_QUALITY;
        lfPitchAndFamily := DEFAULT_PITCH;
        StrPCopy(lfFaceName,sFontName);
    end;
    newFont := CreateFontIndirect(lFont);
    oldFont1 := SelectObject(Canvas.Handle, newFont);
 //计算新的字体位置
    FW := Canvas.TextWidth(sSymbol);
    FH := Canvas.TextHeight(sSymbol);

    Ceta := Arctan(FH/FW);
    OY := Trunc(FH/2 + cos(PI/2 - dAngle + Ceta)*(Sqrt(Sqr(FW)+Sqr(FH))/2));
    OX := Trunc(FW/2 - sin(PI/2 - dAngle + Ceta)*(Sqrt(Sqr(FW)+Sqr(FH))/2));

    SetBkMode(Canvas.Handle,Transparent);

    Oldcolor := GetTextColor(Canvas.Handle);
    SetTextColor(Canvas.Handle,nColor);
    IX := nX + OX - Trunc(FW/2);
    IY := nY + OY - Trunc(FH/2);
    TextOut(Canvas.Handle,IX,IY,Pchar(sSymbol),Length(sSymbol));
    SetTextColor(Canvas.Handle,OldColor);

    DeleteObject(SelectObject(Canvas.Handle, oldFont1));
end;


查看回复
关于我们 | 网站地图 | 广告刊登 | 友情链接
Copyright ©2008 - 2010  Delphi2007.net  ,All Rights Reserved  粤ICP备09038647号
业务联系:allceoad#gmail.com QQ:20008835 最佳分辨率 1024×768