WinForm(C/S)項(xiàng)目中使用矢量字體(FontAwsome、Elegant)圖標(biāo)
1、介紹
字體圖標(biāo)在Web應(yīng)用中最為常見(jiàn),字體圖標(biāo)是矢量的,矢量圖意味著每個(gè)圖標(biāo)都能在所有大小的屏幕上完美呈現(xiàn),可以隨時(shí)更改大小和顏色,而且不失真。字體圖標(biāo)常見(jiàn)的有Font Awesome和Elegant Icon Font,她們不僅圖標(biāo)數(shù)量多,還可以免費(fèi)使用。這些圖標(biāo)如果能用在WinForm項(xiàng)目中,不僅可以帶來(lái)更加直觀的界面效果,也能讓圖標(biāo)不再局限于類似png類型,本文將介紹在WinForm項(xiàng)目中如何使用字體圖標(biāo)。
2、字體圖標(biāo)的選擇
網(wǎng)上IconFont資源很多,同時(shí)很多提供SVG下載的網(wǎng)站都會(huì)提供對(duì)應(yīng)的IconFont文件。本文就以:比較流行且開(kāi)源免費(fèi)的FontAwesome字體圖標(biāo)為例,講解.NET開(kāi)發(fā)的WinForm項(xiàng)目如何使用。
FontAwesome,官網(wǎng):https://fontawesome.com.cn/v4/icons

在上圖中,我們可以看到每個(gè)圖標(biāo)都有對(duì)應(yīng)的Unicode編碼,我們需要使用這個(gè)編碼來(lái)做圖標(biāo)的展示。
3、使用方法
下載字體圖標(biāo)到本地,放到項(xiàng)目相應(yīng)的位置,如在我們的項(xiàng)目中使用了兩類字體圖標(biāo),F(xiàn)ontAwesome和ElegantIcon,如下圖所示。


在項(xiàng)目中定義字體編碼對(duì)應(yīng)的枚舉部分代碼如下所示。
/// <summary>
/// 圖標(biāo)枚舉,包含Awesome圖標(biāo)和Elegant圖標(biāo),分別以A和E開(kāi)頭
/// </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
}
定義字體圖標(biāo)加載公共類:FontImagesHelper.cs,此類不僅支持對(duì)待加載圖標(biāo)指定尺寸大小、還可以設(shè)置前景色和背景色。

FontImagesHelper.cs源碼如下:
/// <summary>
/// 字體圖標(biāo)圖片,awesome字體默認(rèn)加載,elegant字體在使用時(shí)延遲加載
/// </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>
/// 構(gòu)造函數(shù)
/// </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>
/// 獲取圖標(biāo)
/// </summary>
/// <param name="iconName">圖標(biāo)名稱</param>
/// <param name="imageSize">圖標(biāo)大小</param>
/// <param name="foreColor">前景色</param>
/// <param name="backColor">背景色</param>
/// <returns>圖標(biāo)</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>
/// 獲取圖標(biāo)
/// </summary>
/// <param name="iconName">圖標(biāo)名稱</param>
/// <param name="imageSize">圖標(biāo)大小</param>
/// <param name="foreColor">前景色</param>
/// <param name="backColor">背景色</param>
/// <returns>圖標(biāo)</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>
/// 獲取圖標(biāo)
/// </summary>
/// <param name="iconName">圖標(biāo)名稱</param>
/// <param name="imageSize">圖標(biāo)大小</param>
/// <param name="foreColor">前景色</param>
/// <param name="backColor">背景色</param>
/// <returns>圖標(biāo)</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框架產(chǎn)品中整合了字體圖標(biāo)的使用,框架模塊的圖標(biāo)按字體圖標(biāo)進(jìn)行了整合加載,如下圖所示。

調(diào)用對(duì)應(yīng)圖標(biāo)的代碼。
var img = FontImagesHelper.GetImage("A_fa_address_card", 26, "#66B9BF");
除了上面提到的字體圖標(biāo),我們還可以使用阿里巴巴矢量圖標(biāo)庫(kù),地址:https://www.iconfont.cn/
4、參考文章
RDIFramework.NET CS敏捷開(kāi)發(fā)框架 V6.1發(fā)布(.NET6+、Framework雙引擎、全網(wǎng)唯一)
.NET開(kāi)發(fā)WinForm(C/S)項(xiàng)目整合三種服務(wù)訪問(wèn)模式(直連、WCF、WebAPI)
作者:
RDIF
出處:
http://www.rzrgm.cn/huyong/
Email:
406590790@qq.com
QQ:
406590790
微信:
13005007127(同手機(jī)號(hào))
框架官網(wǎng):
http://www.guosisoft.com/
http://www.rdiframework.net/
框架其他博客:
http://blog.csdn.net/chinahuyong
http://www.rzrgm.cn/huyong
國(guó)思RDIF開(kāi)發(fā)框架
,
給用戶和開(kāi)發(fā)者最佳的.Net框架平臺(tái)方案,為企業(yè)快速構(gòu)建跨平臺(tái)、企業(yè)級(jí)的應(yīng)用提供強(qiáng)大支持。
關(guān)于作者:系統(tǒng)架構(gòu)師、信息系統(tǒng)項(xiàng)目管理師、DBA。專注于微軟平臺(tái)項(xiàng)目架構(gòu)、管理和企業(yè)解決方案,多年項(xiàng)目開(kāi)發(fā)與管理經(jīng)驗(yàn),曾多次組織并開(kāi)發(fā)多個(gè)大型項(xiàng)目,在面向?qū)ο蟆⒚嫦蚍?wù)以及數(shù)據(jù)庫(kù)領(lǐng)域有一定的造詣。現(xiàn)主要從事基于
RDIF
框架的技術(shù)開(kāi)發(fā)、咨詢工作,主要服務(wù)于金融、醫(yī)療衛(wèi)生、鐵路、電信、物流、物聯(lián)網(wǎng)、制造、零售等行業(yè)。
如有問(wèn)題或建議,請(qǐng)多多賜教!
本文版權(quán)歸作者和CNBLOGS博客共有,歡迎轉(zhuǎn)載,但未經(jīng)作者同意必須保留此段聲明,且在文章頁(yè)面明顯位置給出原文連接,如有問(wèn)題,可以通過(guò)微信、郵箱、QQ等聯(lián)系我,非常感謝。

字體圖標(biāo)在Web應(yīng)用中最為常見(jiàn),字體圖標(biāo)是矢量的,矢量圖意味著每個(gè)圖標(biāo)都能在所有大小的屏幕上完美呈現(xiàn),可以隨時(shí)更改大小和顏色,而且不失真。字體圖標(biāo)常見(jiàn)的有Font Awesome和Elegant Icon Font,她們不僅圖標(biāo)數(shù)量多,還可以免費(fèi)使用。這些圖標(biāo)如果能用在WinForm項(xiàng)目中,不僅可以帶來(lái)更加直觀的界面效果,也能讓圖標(biāo)不再局限于類似png類型,本文將介紹在WinForm項(xiàng)目中如何使用字體圖標(biāo)。
浙公網(wǎng)安備 33010602011771號(hào)