基于C#的GDI花式探索一:绘制字符大小的控制
对于字符串的绘制,刚开始我也只是知道个DrawString,可是需求永远不是那么简单,比如让字体拉伸,倾斜,填充,字间距等等,不是一个简单的DrawString就能搞定的。我也就这样慢慢摸索,记录下我这个摸索的过程吧。
起初我用DrawString去绘制每一个字符,却发现绘制出来的字体高度和宽度都不满足我设置的,基本都会偏小了,大家可以在画的时候加几条参考线看看,也可以用MeasureString检测下。
绘制代码如下:
float wid = 25;
float heig = 50;
PointF start = new PointF(50,50);
StringFormat stringFormat = StringFormat.GenericTypographic;
stringFormat.Alignment = StringAlignment.Near;
stringFormat.LineAlignment = StringAlignment.Near;
stringFormat.FormatFlags = StringFormatFlags.DisplayFormatControl;
Font font = new Font("Arial", heig, GraphicsUnit.Pixel);
SizeF sizet = g.MeasureString("t", font, new PointF(start.X, start.Y), stringFormat);
g.DrawString("t", new Font("Arial", heig, GraphicsUnit.Pixel), new SolidBrush(Color.Black), start.X, start.Y);
g.DrawRectangle(pen, start.X, start.Y, wid, heig);
运行效果如图:
格子是我设置的高度和宽度,明显与字体宽高有很大差别啊。这个DrawString是封装好的东西,也没别的参数可以调了。这可怎么办?
无意中我发现了一个有意思的玩意,GraphicsPath(路径)类,这个东西能添加很多图形然后生成一个路径,也可以添加字符,路径包括很多点和这些点的连接方式,绘制路径也就是绘制添加到路径的图形的轮廓。那么我就有了个想法:我对这个轮廓做一个拉伸就可以满足我设置的尺寸了,而对轮廓拉伸就是对点做变换了。
代码如下:
GraphicsPath graphicsPath = new GraphicsPath();
System.Drawing.Drawing2D.GraphicsPath path = new System.Drawing.Drawing2D.GraphicsPath();
path.AddString("t", font.FontFamily, (int)FontStyle.Regular, (float)font.Size, new PointF(start.X, start.Y), stringFormat);
PointF[] pts = path.PathPoints;
byte[] types = path.PathTypes;
RectangleF rectangleF = path.GetBounds();
for (int j = 0; j < pts.Length; j++)
{
pts[j].X = (float)wid/ rectangleF.Width * (pts[j].X - (float)rectangleF.X) + (float)start.X;
pts[j].Y = (float)heig / rectangleF.Height * (pts[j].Y - (float)rectangleF.Y) + (float)start.Y;
}
GraphicsPath pathA = new GraphicsPath(pts, types);
g.DrawPath(new Pen(Color.Black, 1.0f), pathA);
效果如下:
这回字符的宽度和高度就符合我们的设置了。
看到这里肯定要问,这是个轮廓啊,怎么变成实体的字符呢?
别急,接下来就填充这个路径。
代码如下:
Region region = new Region(pathA);
g.IntersectClip(region);
float rate = wid / 100;
for (int i = 0; i < 100; i++)
g.DrawLine(pen,start.X + i*rate,start.Y, start.X + i * rate,start.Y + heig);
g.ResetClip();
我这里是填充了100条黑线,这个可以根据需求自行设定。
效果如下:
到这里,就实现了字符尺寸大小的控制了。
结尾:大家觉得有帮助麻烦点个赞!另外,如果你也对图形有兴趣,我们可以一起研究探讨,欢迎随时来撩。