在winfrom上讓文字旋轉任意角度顯示
阿新 • • 發佈:2018-12-18
第一步先新建一個基類,完整程式碼如下
public class GraphicsText { private Graphics _graphics; public GraphicsText() { } public Graphics Graphics { get { return _graphics; } set { _graphics = value; } } /// <summary> /// 繪製根據矩形旋轉文字 /// </summary> /// <param name="s">文字</param> /// <param name="font">字型</param> /// <param name="brush">填充</param> /// <param name="layoutRectangle">區域性矩形</param> /// <param name="format">佈局方式</param> /// <param name="angle">角度</param> public void DrawString(string s, Font font, Brush brush, RectangleF layoutRectangle, StringFormat format, float angle) { // 求取字串大小 SizeF size = _graphics.MeasureString(s, font); // 根據旋轉角度,求取旋轉後字串大小 SizeF sizeRotate = ConvertSize(size, angle); // 根據旋轉後尺寸、佈局矩形、佈局方式計算文字旋轉點 PointF rotatePt = GetRotatePoint(sizeRotate, layoutRectangle, format); // 重設佈局方式都為Center StringFormat newFormat = new StringFormat(format); newFormat.Alignment = StringAlignment.Center; newFormat.LineAlignment = StringAlignment.Center; // 繪製旋轉後文本 DrawString(s, font, brush, rotatePt, newFormat, angle); } /// <summary> /// 繪製根據點旋轉文字,一般旋轉點給定位文字包圍盒中心點 /// </summary> /// <param name="s">文字</param> /// <param name="font">字型</param> /// <param name="brush">填充</param> /// <param name="point">旋轉點</param> /// <param name="format">佈局方式</param> /// <param name="angle">角度</param> public void DrawString(string s, Font font, Brush brush, PointF point, StringFormat format, float angle) { // Save the matrix Matrix mtxSave = _graphics.Transform; Matrix mtxRotate = _graphics.Transform; mtxRotate.RotateAt(angle, point); _graphics.Transform = mtxRotate; _graphics.DrawString(s, font, brush, point, format); // Reset the matrix _graphics.Transform = mtxSave; } private SizeF ConvertSize(SizeF size, float angle) { Matrix matrix = new Matrix(); matrix.Rotate(angle); // 旋轉矩形四個頂點 PointF[] pts = new PointF[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); // 求取四個頂點的包圍盒 float left = float.MaxValue; float right = float.MinValue; float top = float.MaxValue; float bottom = float.MinValue; foreach (PointF pt in pts) { // 求取並集 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; } SizeF result = new SizeF(right - left, bottom - top); return result; } private PointF GetRotatePoint(SizeF size, RectangleF layoutRectangle, StringFormat format) { PointF pt = new PointF(); switch (format.Alignment) { case StringAlignment.Near: pt.X = layoutRectangle.Left + size.Width / 2f; break; case StringAlignment.Center: pt.X = (layoutRectangle.Left + layoutRectangle.Right) / 2f; break; case StringAlignment.Far: pt.X = layoutRectangle.Right - size.Width / 2f; break; default: break; } switch (format.LineAlignment) { case StringAlignment.Near: pt.Y = layoutRectangle.Top + size.Height / 2f; break; case StringAlignment.Center: pt.Y = (layoutRectangle.Top + layoutRectangle.Bottom) / 2f; break; case StringAlignment.Far: pt.Y = layoutRectangle.Bottom - size.Height / 2f; break; default: break; } return pt; } }
第二步,新建一個窗體
public partial class Form1 : Form { private Font _font = new Font("Arial", 12); private Brush _brush = new SolidBrush(Color.Black); private Pen _pen = new Pen(Color.Black, 1f); private string _text = "Crow Soft"; public Form1() { InitializeComponent(); } protected override void OnPaint(PaintEventArgs e) { base.OnPaint(e); GraphicsText graphicsText = new GraphicsText(); graphicsText.Graphics = e.Graphics; // 繪製圍繞點旋轉的文字 StringFormat format = new StringFormat(); format.Alignment = StringAlignment.Center; format.LineAlignment = StringAlignment.Center; graphicsText.DrawString(_text, _font, _brush, new PointF(100, 80), format, 45f); graphicsText.DrawString(_text, _font, _brush, new PointF(200, 80), format, -45f); graphicsText.DrawString(_text, _font, _brush, new PointF(300, 80), format, 90f); graphicsText.DrawString(_text, _font, _brush, new PointF(400, 80), format, -60f); // 繪製矩形內旋轉的文字 // First line RectangleF rc = RectangleF.FromLTRB(50, 150, 200, 230); RectangleF rect = rc; format.Alignment = StringAlignment.Near; e.Graphics.DrawRectangle(_pen, rect.Left, rect.Top, rect.Width, rect.Height); graphicsText.DrawString(_text, _font, _brush, rect, format, 30); rect.Location += new SizeF(180, 0); format.LineAlignment = StringAlignment.Near; e.Graphics.DrawRectangle(_pen, rect.Left, rect.Top, rect.Width, rect.Height); graphicsText.DrawString(_text, _font, _brush, rect, format, -30); rect.Location += new SizeF(180, 0); format.LineAlignment = StringAlignment.Center; e.Graphics.DrawRectangle(_pen, rect.Left, rect.Top, rect.Width, rect.Height); graphicsText.DrawString(_text, _font, _brush, rect, format, -90); rect.Location += new SizeF(180, 0); format.LineAlignment = StringAlignment.Far; e.Graphics.DrawRectangle(_pen, rect.Left, rect.Top, rect.Width, rect.Height); graphicsText.DrawString(_text, _font, _brush, rect, format, 70); // Second line rect = rc; rect.Location += new SizeF(0, 100); format.Alignment = StringAlignment.Center; e.Graphics.DrawRectangle(_pen, rect.Left, rect.Top, rect.Width, rect.Height); graphicsText.DrawString(_text, _font, _brush, rect, format, 40); rect.Location += new SizeF(180, 0); format.LineAlignment = StringAlignment.Near; e.Graphics.DrawRectangle(_pen, rect.Left, rect.Top, rect.Width, rect.Height); graphicsText.DrawString(_text, _font, _brush, rect, format, 30); rect.Location += new SizeF(180, 0); format.LineAlignment = StringAlignment.Center; e.Graphics.DrawRectangle(_pen, rect.Left, rect.Top, rect.Width, rect.Height); graphicsText.DrawString(_text, _font, _brush, rect, format, -70); rect.Location += new SizeF(180, 0); format.LineAlignment = StringAlignment.Far; e.Graphics.DrawRectangle(_pen, rect.Left, rect.Top, rect.Width, rect.Height); graphicsText.DrawString(_text, _font, _brush, rect, format, 60); // Third line rect = rc; rect.Location += new SizeF(0, 200); format.Alignment = StringAlignment.Far; e.Graphics.DrawRectangle(_pen, rect.Left, rect.Top, rect.Width, rect.Height); graphicsText.DrawString(_text, _font, _brush, rect, format, -30); rect.Location += new SizeF(180, 0); format.LineAlignment = StringAlignment.Near; e.Graphics.DrawRectangle(_pen, rect.Left, rect.Top, rect.Width, rect.Height); graphicsText.DrawString(_text, _font, _brush, rect, format, -30); rect.Location += new SizeF(180, 0); format.LineAlignment = StringAlignment.Center; e.Graphics.DrawRectangle(_pen, rect.Left, rect.Top, rect.Width, rect.Height); graphicsText.DrawString(_text, _font, _brush, rect, format, 90); rect.Location += new SizeF(180, 0); format.LineAlignment = StringAlignment.Far; e.Graphics.DrawRectangle(_pen, rect.Left, rect.Top, rect.Width, rect.Height); graphicsText.DrawString(_text, _font, _brush, rect, format, 45); } }
這就大功告成了,執行效果如下:
讀者可以根據需求更改旋轉角度、字型大小、顏色等