Toggle navigation
首页
产品中心
全新RDIF.vNext低代码框架
镇店
.NET C/S开发框架
.NET Web敏捷开发框架
.NET 快速开发框架(全新EasyUI版本)
.NET 代码生成器
.NET WebAPI服务端开发框架
客户案例
付款方式
国思学堂
技术文章
新闻资讯
下载
关于
首页
技术文章
码农生涯
正文
原创
2024-12-09
浏览 (
5366
)
WinForm(C/S)项目中使用矢量字体(FontAwsome、Elegant)图标
## 1、介绍 字体图标在Web应用中最为常见,字体图标是矢量的,矢量图意味着每个图标都能在所有大小的屏幕上完美呈现,可以随时更改大小和颜色,而且不失真。字体图标常见的有Font Awesome和Elegant Icon Font,她们不仅图标数量多,还可以免费使用。这些图标如果能用在WinForm项目中,不仅可以带来更加直观的界面效果,也能让图标不再局限于类似png类型,本文将介绍在WinForm项目中如何使用字体图标。 ## 2、字体图标的选择 网上IconFont资源很多,同时很多提供SVG下载的网站都会提供对应的IconFont文件。本文就以:比较流行且开源免费的FontAwesome字体图标为例,讲解.NET开发的WinForm项目如何使用。 FontAwesome,官网:[https://fontawesome.com.cn/v4/icons](https://fontawesome.com.cn/v4/icons) ![FontAwesome](http://doc.rdiframework.net/rdiblog/20241208165400.png) 在上图中,我们可以看到每个图标都有对应的Unicode编码,我们需要使用这个编码来做图标的展示。 ## 3、使用方法 下载字体图标到本地,放到项目相应的位置,如在我们的项目中使用了两类字体图标,FontAwesome和ElegantIcon,如下图所示。 ![字体图标](http://doc.rdiframework.net/rdiblog/20241208165355.png) ![图标](http://doc.rdiframework.net/rdiblog/20241208165351.png) 在项目中定义字体编码对应的枚举部分代码如下所示。 ```c# /// <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](http://doc.rdiframework.net/rdiblog/20241208165345.png) FontImagesHelper.cs源码如下: ```c# /// <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框架产品中整合了字体图标的使用,框架模块的图标按字体图标进行了整合加载,如下图所示。 ![模块字体图标](http://doc.rdiframework.net/rdiblog/20241112154617.png) 调用对应图标的代码。 ```c# var img = FontImagesHelper.GetImage("A_fa_address_card", 26, "#66B9BF"); ``` 除了上面提到的字体图标,我们还可以使用阿里巴巴矢量图标库,地址:[https://www.iconfont.cn/](https://www.iconfont.cn/) ## 4、参考文章 [iconfont-阿里巴巴矢量图标库](https://www.iconfont.cn/) [FontAwesome 字体图标中文Icon](https://fontawesome.com.cn/v4/cheatsheet) [RDIFramework.NET CS敏捷开发框架 V6.1发布(.NET6+、Framework双引擎、全网唯一)](http://www.guosisoft.com/article/detail/611866730815557) [.NET开发WinForm(C/S)项目整合三种服务访问模式(直连、WCF、WebAPI)](http://www.guosisoft.com/article/detail/618251898933317) 可前往下面的地址体验、了解详情。 [http://www.guosisoft.com/product/winform](http://www.guosisoft.com/product/winform) [http://www.rdiframework.net/product/winform](http://www.rdiframework.net/product/winform) ----- 一路走来数个年头,感谢RDIFramework.NET框架的支持者与使用者,大家可以通过下面的地址了解详情。 官方网站:[http://www.guosisoft.com/](http://www.guosisoft.com/) [http://www.rdiframework.net/](http://www.rdiframework.net/) 特别说明,框架相关的技术文章请以官方网站为准,欢迎大家收藏! RDIFramework.NET框架由海南国思软件科技有限公司专业团队长期打造、一直在更新、一直在升级,请放心使用! 欢迎关注RDIFramework.NET框架官方微信公众号(微信号:**guosisoft**),及时了解最新动态。 使用微信扫描二维码立即关注 ![微信扫描二维码](http://doc.rdiframework.net/weixin.png)
正文到此结束
本文标签:
.NET
.NetCore
挨踢业界
版权声明:
本站原创文章,由
guosisoft.com
发布,遵循
CC 4.0 by-sa
版权协议,转载请附上原文出处链接和本声明。
上一篇
RDIFramework.NET CS敏捷开发框架 SOA服务三种访问(直连、WCF、WebAPI)方式
下一篇
已经到最后一篇了
热门推荐
{{article.title}}
热门指数:
浏览({{article.lookCount + 5000}})
相关文章
{{article.title}}
该篇文章的评论功能暂时被站长关闭
说给你听
本文目录
文章标签
RDIF.NET
其他
微信开发
.NET
消息交互
.NetCore
项目管理
常用工具
工作流
Web前端
数据库
挨踢业界
随机文章
团队项目开发"编码规范"之二:代码外观
RDIFramework.NET V2.9版本多语言的实现
RDIFramework.NET敏捷开发框架 ━ 工作流程组件Web业务平台
微信公众号开发系列-玩转微信开发-目录汇总
微信公众号开发C#系列-1、微信公众平台注册
团队项目开发"编码规范"之四:申明
RDIFramework.NET ━ .NET快速信息化系统开发框架 V3.2->用户管理模块新增“重置用户密码”功能
国思RDIF.vNext全新低代码快速开发框架平台发布
如何有效创建工作分解结构?
.NET快速信息化系统开发框架 V3.2->新增记录SQL执行过程
RDIFramework.NET平台代码生成器V3.1.6125.27586全新发布-更新于20161029(提供下载)
RDIFramework.NET V3.2->新增模块管理界面导出功能(可按条件导出)
WinForm(C/S)项目中使用矢量字体(FontAwsome、Elegant)图标
【保姆级教程】Vue项目调试技巧
RDIFramework.NET开发实例之产品管理(WebForm版)
.NET敏捷开发框架-RDIFramework.NET V5.1发布(跨平台)
.NET Core部署到linux(CentOS)最全解决方案,进阶篇(Supervisor+Nginx)
mysql导入大量数据时报MySQL server has gone away错误的解决办法
原创企业级控件库之大数据量分页控件
团队项目开发"编码规范"之七:控件命名规则
网站信息
文章总数:599 篇
标签总数:8 个
分类总数:8 个
留言数量:1385 条
在线人数:
89
人
运行天数:1321天
最后更新:2023-05-18
QQ:406590790
13005007127