C# 中的字体

C#中本来已经封装了通用字体Font,但是笔者认为这个Font在使用过程中很不方便。

1) Font的很多属性都是只读的,不能通过更改属性的值而对Font进行操作;必须重新初始化Font对象才行。例如:font.Size=12;是不允许的。
2) Font总归是用来写字的,但是C#中的Font类与string类没有什么联系,这给Font的使用带来了一些麻烦。比如我想要知道一个string对象使用了制定字体和字号以后,打印在屏幕上会占有多少像素?或者我要知道一个字体和字号,使得string中的内容显示在屏幕上的长度刚好适合200个像素?
3) Font和string必须的使用另外的函数方法才能显示在屏幕上,这对于经常要打印、显示Text的程序员来说,实在是太繁琐了。
为了使这些问题能够比较简单解决,请看下面的这个类:
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Text;
namespace CoolControls
{
    public class CoolFont
    {
        Font font;
        string text = string.Empty;
        #region [ 构造函数 ]
        public CoolFont()
        {
            font = new Font("Arial", 8.25F);
        }
        public CoolFont(string fontname,Single size)
        {
            font = new Font(fontname, size);
        }
        public CoolFont(Font f)
        {
            font = new Font(f,f.Style);
        }
        public CoolFont(string fontname, Single size,FontStyle style)
        {
            font = new Font(fontname, size,style);
        }
        public CoolFont(Font f, FontStyle style)
        {
            font = new Font(f, style);
        }
        public CoolFont(Font f, Single size)
        {
            Font tf = new Font(f.Name, size);
            font = new Font(tf, f.Style);
            tf.Dispose();
        }
        #endregion
        #region [ 属性 ]
        public string Text
        {
            get { return text; }
            set { text = value; }
        }
        public Font Font
        {
            get { return font; }
            set { font = value; }
        }
        public string FontName
        {
            get { return font.Name; }
            set
            {
                Font tf = new Font(value, font.Size);
                font = new Font(tf, font.Style);
                tf.Dispose();
            }
        }
        public Single FontSize
        {
            get { return font.Size; }
            set
            {
                Font tf = new Font(font.Name, value);
                font = new Font(tf, font.Style);
                tf.Dispose();
            }
        }
        public FontStyle Style
        {
            get { return font.Style; }
            set { font = new Font(font, value); }
        }
        public int Height
        {
            get { return font.Height; }
        }
        public float SizeInPoints
        {
            get { return font.SizeInPoints; }
        }
        #endregion
        #region [ 公有函数 ]
        public void FitWidth(Graphics g, float width)
        {
            this.FontSize = FitStringWidth(this.Text, this.Font, g, width);
        }
        public void FitHeight(Graphics g, float height)
        {
            this.FontSize = FitStringHeight(this.Text, this.Font, g, height);
        }
        public void FitRect(Graphics g, Rectangle rt)
        {
            this.FontSize = FitStringRect(this.Text, this.Font, g, rt);
        }
        public void DrawStringFit(Graphics g, Brush brush, Rectangle rt)
        {
            DrawStringFit(this, g, brush, rt);
        }
        public void DrawStringFit(Graphics g, Brush brush, Rectangle rt, StringAlignment alignment, StringAlignment alignmentV)
        {
            DrawStringFit(this, g, brush, rt,alignment, alignmentV);
        }
        #endregion
        #region [ 静态函数 ]
        public static SizeF GetStringSize(string s, Font f,Graphics g)
        {
            return g.MeasureString(s, f);
        }
        public static SizeF GetStringSize(CoolFont cf, Graphics g)
        {
            return g.MeasureString(cf.Text, cf.Font);
        }
        public static float FitStringWidth(string s, Font f, Graphics g, float width)
        {
            CoolFont cf = new CoolFont(f, f.Style);
            cf.Text = s;            
            SizeF sf = GetStringSize(cf, g);
            cf.FontSize = Math.Abs(sf.Width - width) / cf.Text.Length;
            sf = GetStringSize(cf, g);
            if (sf.Width > width)
            {
                while (sf.Width > width)
                {
                    cf.FontSize -= 0.1F;
                    
                    sf = GetStringSize(cf, g);
                }
            }
            else if(sf.Width < width)
            {
                while (sf.Width < width)
                {
                    cf.FontSize += 0.1F;
                    sf = GetStringSize(cf, g);
                }
                cf.FontSize -= 0.1F;
            }
            return cf.FontSize;
        }
        public static float FitStringWidth(CoolFont cf, Graphics g, float width)
        {
            return FitStringWidth(cf.Text, cf.Font, g, width);
        }
        public static float FitStringHeight(string s, Font f, Graphics g, float height)
        {
            CoolFont cf = new CoolFont(f, f.Style);
            cf.Text = s;
            SizeF sf = GetStringSize(cf, g);
            cf.FontSize = Math.Abs(sf.Height - height) / cf.Text.Length;
            sf = GetStringSize(cf, g);
            if (sf.Height > height)
            {
                while (sf.Height > height)
                {
                    cf.FontSize -= 0.1F;
                    sf = GetStringSize(cf, g);
                }
            }
            else if (sf.Height < height)
            {
                while (sf.Height < height)
                {
                    cf.FontSize += 0.1F;
                    sf = GetStringSize(cf, g);
                }
                cf.FontSize -= 0.1F;
            }
            return cf.FontSize;
        }
        public static float FitStringHeight(CoolFont cf, Graphics g, float height)
        {
            return FitStringHeight(cf.Text, cf.Font, g, height);
        }
        public static float FitStringRect(string s, Font f, Graphics g, Rectangle rt)
        {
            CoolFont cf = new CoolFont(f, f.Style);
            cf.Text = s;
            SizeF sf = GetStringSize(cf, g);
            cf.FontSize = (sf.Width - rt.Width) / cf.Text.Length;
            sf = GetStringSize(cf, g);
            if (sf.Width > rt.Width)
            {
                while (sf.Width > rt.Width)
                {
                    cf.FontSize -= 0.1F;
                    sf = GetStringSize(cf, g);
                }
            }
            else if (sf.Width < rt.Width)
            {
                while (sf.Width < rt.Width)
                {
                    cf.FontSize += 0.1F;
                    sf = GetStringSize(cf, g);
                }
                cf.FontSize -= 0.1F;
            }

            if (sf.Height > rt.Height)
            {
                while (sf.Height > rt.Height)
                {
                    cf.FontSize -= 0.1F;
                    sf = GetStringSize(cf, g);
                }
            }
            return cf.FontSize;
        }
        public static float FitStringRect(CoolFont cf, Graphics g, Rectangle rt)
        {
            return FitStringRect(cf.Text, cf.Font, g, rt);
        }
        public static void DrawStringFit(string s, Font f, Graphics g, Brush brush, Rectangle rt)
        {
            CoolFont cf = new CoolFont(f, f.Style);
            cf.Text = s;
            SizeF sf = GetStringSize(cf, g);
            cf.FontSize = Math.Abs(sf.Width - rt.Width) / cf.Text.Length;
            sf = GetStringSize(cf, g);
            if (sf.Width > rt.Width)
            {
                while (sf.Width > rt.Width)
                {
                    cf.FontSize -= 0.1F;
                    sf = GetStringSize(cf, g);
                }
            }
            else if (sf.Width < rt.Width)
            {
                while (sf.Width < rt.Width)
                {
                    cf.FontSize += 0.1F;
                    sf = GetStringSize(cf, g);
                }
                cf.FontSize -= 0.1F;
            }
            
            if (sf.Height > rt.Height)
            {
                while (sf.Height > rt.Height)
                {
                    cf.FontSize -= 0.1F;
                    sf = GetStringSize(cf, g);
                }
            }
           
            
            StringFormat format = new StringFormat();
            format.FormatFlags = StringFormatFlags.NoClip;
            format.Alignment = StringAlignment.Center;
            format.LineAlignment = StringAlignment.Center;
            g.DrawString(cf.Text, cf.Font, brush, rt, format);
        }
        public static void DrawStringFit(CoolFont cf, Graphics g, Brush brush, Rectangle rt)
        {
            DrawStringFit(cf.Text, cf.Font,g, brush, rt);
        }
        public static void DrawStringFit(string s, Font f, Graphics g, Brush brush, Rectangle rt, StringAlignment alignment, StringAlignment alignmentV)
        {
            CoolFont cf = new CoolFont(f, f.Style);
            cf.Text = s;
            SizeF sf = GetStringSize(cf, g);
            cf.FontSize = Math.Abs(sf.Width - rt.Width) / cf.Text.Length;
            sf = GetStringSize(cf, g);
            if (sf.Width > rt.Width)
            {
                while (sf.Width > rt.Width)
                {
                    cf.FontSize -= 0.1F;
                    sf = GetStringSize(cf, g);
                }
            }
            else if (sf.Width < rt.Width)
            {
                while (sf.Width < rt.Width)
                {
                    cf.FontSize += 0.1F;
                    sf = GetStringSize(cf, g);
                }
                cf.FontSize -= 0.1F;
            }
            if (sf.Height > rt.Height)
            {
                while (sf.Height > rt.Height)
                {
                    cf.FontSize -= 0.1F;
                    sf = GetStringSize(cf, g);
                }
            }

            StringFormat format = new StringFormat();
            format.FormatFlags = StringFormatFlags.NoClip;
            format.Alignment = alignment;
            format.LineAlignment = alignmentV;
            g.DrawString(cf.Text, cf.Font, brush, rt, format);
        }
        public static void DrawStringFit(CoolFont cf, Graphics g, Brush brush, Rectangle rt, StringAlignment alignment, StringAlignment alignmentV)
        {
            DrawStringFit(cf.Text, cf.Font, g, brush, rt, alignment,alignmentV);
        }
        #endregion

    }
}


这个类允许静态或者动态访问,并且实现了string,Font和Drawing的联合,使得字符串的打印、显示操作变得很容易。 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值