开发者论坛

 找回密码
 注册 (请使用非IE浏览器)
查看: 397|回复: 0

[教程] WinForm(C/S)项目中使用矢量字体(FontAwsome、Elegant)图标

[复制链接]

0

精华

0

贡献

79

赞扬

帖子
20
软币
190
在线时间
12 小时
注册时间
2020-6-28
发表于 2024-12-9 10:41:56 | 显示全部楼层 |阅读模式
本帖最后由 13005007127 于 2024-12-9 10:43 编辑


封面.png
1、介绍
字体图标在Web应用中最为常见,字体图标是矢量的,矢量图意味着每个图标都能在所有大小的屏幕上完美呈现,可以随时更改大小和颜色,而且不失真。字体图标常见的有Font Awesome和Elegant Icon Font,她们不仅图标数量多,还可以免费使用。这些图标如果能用在WinForm项目中,不仅可以带来更加直观的界面效果,也能让图标不再局限于类似png类型,本文将介绍在WinForm项目中如何使用字体图标。
2、字体图标的选择
网上IconFont资源很多,同时很多提供SVG下载的网站都会提供对应的IconFont文件。本文就以:比较流行且开源免费的FontAwesome字体图标为例,讲解.NET开发的WinForm项目如何使用。
image-20241208160752388.png
在上图中,我们可以看到每个图标都有对应的Unicode编码,我们需要使用这个编码来做图标的展示。
3、使用方法
下载字体图标到本地,放到项目相应的位置,如在我们的项目中使用了两类字体图标,FontAwesome和ElegantIcon,如下图所示。
image-20241208162101047.png image-20241208163906314.png



在项目中定义字体编码对应的枚举部分代码如下所示。
/// <summary>
/// 图标枚举,包含Awesome图标和Elegant图标,分别以A和E开头
/// </summary>
public enum FontIcons
{
    #region Awesome    English:Awesome
    /// <summary>
    /// a fa 500PX
    /// </summary>
    A_fa_500px = 0xf26e,
    /// <summary>
    /// a fa address book
    /// </summary>
    A_fa_address_book = 0xf2b9,
    /// <summary>
    /// a fa address book o
    /// </summary>
    A_fa_address_book_o = 0xf2ba,
    /// <summary>
    /// a fa address card
    /// </summary>
    A_fa_address_card = 0xf2bb,
    #endregion
   
    #region Elegant    English:Elegant
    /// <summary>
    /// The e arrow up
    /// </summary>
    E_arrow_up = 0x21,
    /// <summary>
    /// The e arrow down
    /// </summary>
    E_arrow_down = 0x22,
    /// <summary>
    /// The e arrow left
    /// </summary>
    E_arrow_left = 0x23,
    #endregion
}
定义字体图标加载公共类:FontImagesHelper.cs,此类不仅支持对待加载图标指定尺寸大小、还可以设置前景色和背景色。
FontImagesHelper.cs源码如下:
image-20241208162817120.png
/// <summary>
/// 字体图标图片,awesome字体默认加载,elegant字体在使用时延迟加载
/// </summary>
public static class FontImagesHelper
{
    /// <summary>
    /// The m font collection
    /// </summary>
    private static readonly PrivateFontCollection fontCollection = new PrivateFontCollection();

    /// <summary>
    /// The m fonts awesome
    /// </summary>
    private static readonly Dictionary<string, Font> fontsAwesome = new Dictionary<string, Font>();

    /// <summary>
    /// The m fonts elegant
    /// </summary>
    private static readonly Dictionary<string, Font> fontsElegant = new Dictionary<string, Font>();

    /// <summary>
    /// The m cache maximum size
    /// </summary>
    private static Dictionary<int, float> cacheMaxSize = new Dictionary<int, float>();

    /// <summary>
    /// The minimum font size
    /// </summary>
    private const int MinFontSize = 8;

    /// <summary>
    /// The maximum font size
    /// </summary>
    private const int MaxFontSize = 43;

    /// <summary>
    /// 构造函数
    /// </summary>
    /// <exception cref="FileNotFoundException">Font file not found</exception>
    static FontImagesHelper()
    {
        string strFile = Path.Combine(SystemInfo.StartupPath, "Resource", "IconFont\\FontAwesome.ttf");
        fontCollection.AddFontFile(strFile);
        float size = MinFontSize;
        for (int i = 0; i <= (MaxFontSize - MinFontSize) * 2; i++)
        {
            fontsAwesome.Add(size.ToString("F2"), new Font(fontCollection.Families[0], size, FontStyle.Regular, GraphicsUnit.Point));
            size += 0.5f;
        }
    }

    /// <summary>
    /// 获取图标
    /// </summary>
    /// <param name="iconName">图标名称</param>
    /// <param name="imageSize">图标大小</param>
    /// <param name="foreColor">前景色</param>
    /// <param name="backColor">背景色</param>
    /// <returns>图标</returns>
    public static Icon GetIcon(string iconName, int imageSize = 32, Color? foreColor = null, Color? backColor = null)
    {
        FontIcons icon = (FontIcons)Enum.Parse(typeof(FontIcons), iconName);
        return GetIcon(icon, imageSize, foreColor, backColor);
    }

    /// <summary>
    /// 获取图标
    /// </summary>
    /// <param name="iconName">图标名称</param>
    /// <param name="imageSize">图标大小</param>
    /// <param name="foreColor">前景色</param>
    /// <param name="backColor">背景色</param>
    /// <returns>图标</returns>
    public static Icon GetIcon(FontIcons iconName, int imageSize = 32, Color? foreColor = null, Color? backColor = null)
    {
        try
        {
            Bitmap image = GetImage(iconName, imageSize, foreColor, backColor);
            return image != null ? ToIcon(image, imageSize) : null;
        }
        catch
        {
            return null;
        }
    }

    /// <summary>
    /// 获取图标
    /// </summary>
    /// <param name="iconName">图标名称</param>
    /// <param name="imageSize">图标大小</param>
    /// <param name="foreColor">前景色</param>
    /// <param name="backColor">背景色</param>
    /// <returns>图标</returns>
    public static Bitmap GetImage(string iconName, int imageSize = 32, Color? foreColor = null, Color? backColor = null)
    {
        try
        {
            FontIcons icon = (FontIcons)Enum.Parse(typeof(FontIcons), iconName);
            return GetImage(icon, imageSize, foreColor, backColor);
        }
        catch
        {
            return null;
        }
    }   

    /// <summary>
    /// Gets the size of the icon.
    /// </summary>
    /// <param name="iconName">The icon text.</param>
    /// <param name="graphics">The graphics.</param>
    /// <param name="font">The font.</param>
    /// <returns>Size.</returns>
    private static Size GetIconSize(FontIcons iconName, Graphics graphics, Font font)
    {
        string text = char.ConvertFromUtf32((int)iconName);
        return graphics.MeasureString(text, font).ToSize();
    }

    /// <summary>
    /// Converts to icon.
    /// </summary>
    /// <param name="srcBitmap">The source bitmap.</param>
    /// <param name="size">The size.</param>
    /// <returns>Icon.</returns>
    /// <exception cref="ArgumentNullException">srcBitmap</exception>
    private static Icon ToIcon(Bitmap srcBitmap, int size)
    {
        if (srcBitmap == null)
        {
            throw new ArgumentNullException("srcBitmap");
        }

        Icon icon;
        using (MemoryStream memoryStream = new MemoryStream())
        {
            new Bitmap(srcBitmap, new Size(size, size)).Save(memoryStream, ImageFormat.Png);
            Stream stream = new MemoryStream();
            BinaryWriter binaryWriter = new BinaryWriter(stream);
            if (stream.Length <= 0L)
            {
                return null;
            }

            binaryWriter.Write((byte)0);
            binaryWriter.Write((byte)0);
            binaryWriter.Write((short)1);
            binaryWriter.Write((short)1);
            binaryWriter.Write((byte)size);
            binaryWriter.Write((byte)size);
            binaryWriter.Write((byte)0);
            binaryWriter.Write((byte)0);
            binaryWriter.Write((short)0);
            binaryWriter.Write((short)32);
            binaryWriter.Write((int)memoryStream.Length);
            binaryWriter.Write(22);
            binaryWriter.Write(memoryStream.ToArray());
            binaryWriter.Flush();
            binaryWriter.Seek(0, SeekOrigin.Begin);
            icon = new Icon(stream);
            stream.Dispose();
        }

        return icon;
    }
}
在RDIFramework.NET框架产品中整合了字体图标的使用,框架模块的图标按字体图标进行了整合加载,如下图所示。
image-20241112154558353.png
调用对应图标的代码。
var img = FontImagesHelper.GetImage("A_fa_address_card", 26, "#66B9BF");
除了上面提到的字体图标,我们还可以使用阿里巴巴矢量图标库,地址:https://www.iconfont.cn/
4、参考文章
可前往下面的地址体验、了解详情。



一路走来数个年头,感谢RDIFramework.NET框架的支持者与使用者,大家可以通过下面的地址了解详情。
特别说明,框架相关的技术文章请以官方网站为准,欢迎大家收藏!
RDIFramework.NET框架由海南国思软件科技有限公司专业团队长期打造、一直在更新、一直在升级,请放心使用!  
欢迎关注RDIFramework.NET框架官方微信公众号(微信号:guosisoft),及时了解最新动态。
使用微信扫描二维码立即关注
weixin.jpg
回复

使用道具 举报

Archiver|手机版|小黑屋|开发者网 ( 苏ICP备08004430号-2 )
版权所有:南京韵文教育信息咨询有限公司

GMT+8, 2025-3-12 19:21

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表