gdi+中的drawstring函数,在字体为斜体,且右对齐的时候,为什么右边会被切掉。
已经查找了网上的几乎所有资料,都没有解决方法,当然是指用gdi+来解决,如果是通过自己计算的方法来做的话,
会比较麻烦。请高手解答。

解决方案 »

  1.   

    先用MeasureString计算一下输出内容所需的区域大小
      

  2.   

    我用MeasureString计算了啊,就是用MeasureString先计算出矩阵,然后用它的宽与高生成一个画布,然后用drawstring来写字,在斜体字体的时候,所有字体都这样,比如斜体的f,右边就会被切掉一点,要增加1/6的em后就可以了。但我之前看说gdi+会自动增加这个1/6em宽度的,但我的好像不会增加,不知道是怎么回事,我用的是delphi2007
      

  3.   

      g := TGPGraphics.Create(Canvas.Handle);
      FontFamily := TGPFontFamily.Create(WideString(trim(MemoText.Font.Name)));
      iFontStyle := FontStyleRegular;
      if SpeedButtonBold.Down then
      begin
        iFontStyle := iFontStyle or FontStyleBold;
      end;
      if SpeedButtonItalic.Down then
      begin
        iFontStyle := iFontStyle or FontStyleItalic;
      end;
      if SpeedButtonULine.Down then
      begin
        iFontStyle := iFontStyle or FontStyleUnderline;
      end;
      gpFont := TGPFont.Create(MemoText.Font.Name, Size, iFontStyle, UnitPixel);
      sb := TGPSolidBrush.Create(MakeColor(255,255,255,255));
      strFormat := TGpStringFormat.Create();
      if BitBtnLeft.Down then
      begin
        strFormat.SetFormatFlags(StringFormatFlagsNoClip);
        strFormat.SetAlignment(StringAlignmentNear);
      end
      else if BitBtnCenter.Down then
      begin
        strFormat.SetFormatFlags(StringFormatFlagsNoClip or StringFormatFlagsNoFitBlackBox);
        strFormat.SetAlignment(StringAlignmentCenter);
      end
      else
      begin
        strFormat.SetFormatFlags(StringFormatFlagsNoClip or StringFormatFlagsNoFitBlackBox);
        strFormat.SetAlignment(StringAlignmentFar);
      end;
      rc_in.X := 0;
      rc_in.Y := 0;
      rc_in.Width := 100000;
      rc_in.Height := 100000;
      g.MeasureString('sfsgsf',-1,gpFont,rc_in,strFormat,rc_out);
      iWidth := Round(rc_out.Width+0.5);
      iHeight := Round(rc_out.Height+0.5);
    //
    。以下把文字在矩形中画出来
    gpOrginRectF := MakeRect(0.0, 0.0,iWidth,iHeight);
    g.DrawString('sfsgsf',-1, gpFont, gpOrginRectF, strFormat,sb);
      

  4.   

    要点:默认情况下会加上那些位置,除非指定了StringFormat所以:你指定了StringFormat,导致空间没加上去。解决办法:StringFormat增加一个Flag   StringFormatFlagsMeasureTrailingSpaces
    回答完毕
      

  5.   

    我改成这样,
    strFormat.SetFormatFlags(StringFormatFlagsNoClip or StringFormatFlagsNoFitBlackBox or StringFormatFlagsMeasureTrailingSpaces);
    可是还是不行啊
      

  6.   

    用MeasureString测量出来,斜体和非斜体的宽度是一样的