基于C#的GDI花式探索一:绘制字符大小的控制

基于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条黑线,这个可以根据需求自行设定。

效果如下:

 到这里,就实现了字符尺寸大小的控制了。

结尾:大家觉得有帮助麻烦点个赞!另外,如果你也对图形有兴趣,我们可以一起研究探讨,欢迎随时来撩。

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值