首页 > 学院 > 开发设计 > 正文

C#利用GDI+绘制旋转文字等效果

2019-11-17 02:52:57
字体:
来源:转载
供稿:网友
C#利用GDI+绘制旋转文字等效果

C#中利用GDI+绘制旋转文本的文字,网上有很多资料,基本都使用矩阵旋转的方式实现。但基本都只提及按点旋转,若要实现在矩形范围内旋转文本,资料较少。经过琢磨,可以将矩形内旋转转化为按点旋转,不过需要经过不少的计算过程。利用下面的类可以实现该功能。

[csharp]view plaincopy在CODE上查看代码片usingSystem;
  • usingSystem.Collections.Generic;
  • usingSystem.Drawing;
  • usingSystem.Drawing.Drawing2D;
  • namespaceRotateText
  • {
  • publicclassGraphicsText
  • {
  • PRivateGraphics_graphics;
  • publicGraphicsText()
  • {
  • }
  • publicGraphicsGraphics
  • {
  • get{return_graphics;}
  • set{_graphics=value;}
  • }
  • ///<summary>
  • ///绘制根据矩形旋转文本
  • ///</summary>
  • ///<paramname="s">文本</param>
  • ///<paramname="font">字体</param>
  • ///<paramname="brush">填充</param>
  • ///<paramname="layoutRectangle">局部矩形</param>
  • ///<paramname="format">布局方式</param>
  • ///<paramname="angle">角度</param>
  • publicvoidDrawString(strings,Fontfont,Brushbrush,RectangleFlayoutRectangle,StringFormatformat,floatangle)
  • {
  • //求取字符串大小
  • SizeFsize=_graphics.MeasureString(s,font);
  • //根据旋转角度,求取旋转后字符串大小
  • SizeFsizeRotate=ConvertSize(size,angle);
  • //根据旋转后尺寸、布局矩形、布局方式计算文本旋转点
  • PointFrotatePt=GetRotatePoint(sizeRotate,layoutRectangle,format);
  • //重设布局方式都为Center
  • StringFormatnewFormat=newStringFormat(format);
  • newFormat.Alignment=StringAlignment.Center;
  • newFormat.LineAlignment=StringAlignment.Center;
  • //绘制旋转后文本
  • DrawString(s,font,brush,rotatePt,newFormat,angle);
  • }
  • ///<summary>
  • ///绘制根据点旋转文本,一般旋转点给定位文本包围盒中心点
  • ///</summary>
  • ///<paramname="s">文本</param>
  • ///<paramname="font">字体</param>
  • ///<paramname="brush">填充</param>
  • ///<paramname="point">旋转点</param>
  • ///<paramname="format">布局方式</param>
  • ///<paramname="angle">角度</param>
  • publicvoidDrawString(strings,Fontfont,Brushbrush,PointFpoint,StringFormatformat,floatangle)
  • {
  • //Savethematrix
  • MatrixmtxSave=_graphics.Transform;
  • MatrixmtxRotate=_graphics.Transform;
  • mtxRotate.RotateAt(angle,point);
  • _graphics.Transform=mtxRotate;
  • _graphics.DrawString(s,font,brush,point,format);
  • //Resetthematrix
  • _graphics.Transform=mtxSave;
  • }
  • privateSizeFConvertSize(SizeFsize,floatangle)
  • {
  • Matrixmatrix=newMatrix();
  • matrix.Rotate(angle);
  • //旋转矩形四个顶点
  • PointF[]pts=newPointF[4];
  • pts[0].X=-size.Width/2f;
  • pts[0].Y=-size.Height/2f;
  • pts[1].X=-size.Width/2f;
  • pts[1].Y=size.Height/2f;
  • pts[2].X=size.Width/2f;
  • pts[2].Y=size.Height/2f;
  • pts[3].X=size.Width/2f;
  • pts[3].Y=-size.Height/2f;
  • matrix.TransformPoints(pts);
  • //求取四个顶点的包围盒
  • floatleft=float.MaxValue;
  • floatright=float.MinValue;
  • floattop=float.MaxValue;
  • floatbottom=float.MinValue;
  • foreach(PointFptinpts)
  • {
  • //求取并集
  • if(pt.X<left)
  • left=pt.X;
  • if(pt.X>right)
  • right=pt.X;
  • if(pt.Y<top)
  • top=pt.Y;
  • if(pt.Y>bottom)
  • bottom=pt.Y;
  • }
  • SizeFresult=newSizeF(right-left,bottom-top);
  • returnresult;
  • }
  • privatePointFGetRotatePoint(SizeFsize,RectangleFlayoutRectangle,StringFormatformat)
  • {
  • PointFpt=newPointF();
  • switch(format.Alignment)
  • {
  • caseStringAlignment.Near:
  • pt.X=layoutRectangle.Left+size.Width/2f;
  • break;
  • caseStringAlignment.Center:
  • pt.X=(layoutRectangle.Left+layoutRectangle.Right)/2f;
  • break;
  • caseStringAlignment.Far:
  • pt.X=layoutRectangle.Right-size.Width/2f;
  • break;
  • default:
  • break;
  • }
  • switch(format.LineAlignment)
  • {
  • caseStringAlignment.Near:
  • pt.Y=layoutRectangle.Top+size.Height/2f;
  • break;
  • caseStringAlignment.Center:
  • pt.Y=(layoutRectangle.Top+layoutRectangle.Bottom)/2f;
  • break;
  • caseStringAlignment.Far:
  • pt.Y=layoutRectangle.Bottom-size.Height/2f;
  • break;
  • default:
  • break;
  • }
  • returnpt;
  • }
  • }
  • }

    测试代码如下:

    [csharp]view%20plaincopy派生到我的代码片
    1. usingSystem;
    2. usingSystem.Collections.Generic;
    3. usingSystem.ComponentModel;
    4. usingSystem.Data;
    5. usingSystem.Drawing;
    6. usingSystem.Windows.Forms;
    7. namespaceRotateText
    8. {
    9. publicpartialclassFormMain:Form
    10. {
    11. privateFont_font=newFont("Arial",12);
    12. privateBrush_brush=newSolidBrush(Color.Black);
    13. privatePen_pen=newPen(Color.Black,1f);
    14. privatestring_text="CrowSoft";
    15. publicFormMain()
    16. {
    17. InitializeComponent();
    18. }
    19. pr
    发表评论 共有条评论
    用户名: 密码:
    验证码: 匿名发表