在Essential Studio for WinForms应用程序中使用图标字体
admin
2023-02-21 01:40:08
0

图标字体包含符号而不是数字和字母。在Web技术中,与其他图像格式相比,图标字体占主导地位。由于它们是矢量图形,体积小、易于装载,因此用户可以在不降低质量的情况下上下缩放。但唯一的限制就是单个图标只能用一种颜色绘制。

相信每一位小伙伴都会经常都有这样的疑问:可以在桌面应用程序Essential Studio for Windows Forms中使用图标字体吗?答案是肯定的!本文就为你讲解具体的操作方法。

首先,请记住,在DPI的情况下,我们只需要改变字体大小,不需要为不同的DPI缩放维护不同大小的图像。

如何添加和绘制图标字体

系统中通常可用的字体(如Arial、Times New Roman)可能没有我们需要在应用程序中使用的图标,但有许多支持创建图标字体的在线和离线应用程序。Syncfusion就免费提供了一个名为Metro Studio的离线工具。

为了演示,我们创建了一个.ttf文件,其中包含一个名为“WF Fabric”的字体系列。结果图标如下图所示。

在Essential Studio for WinForms应用程序中使用图标字体

△ 来自WF Fabric.ttf文件的图标字体

*注意:上图中显示的Unicode(e700,e701等)表示在应用程序中绘制时的相应字形。

在WinForms应用程序中包含WF Fabric.ttf文件,并在属性对话框中将其Build Action标记为Embedded Resource。

在Essential Studio for WinForms应用程序中使用图标字体

△ WF Fabric.ttf文件标记为嵌入式资源

在表单初始化期间,包括在系统内存中注册图标字体的代码。与其他字体(Arial、Times New Roman等)一样,WF Fabric也将在控制面板\所有控制面板项\字体的系统内存中注册。

public Form1()
{
    InitializeComponent();
    this.Paint += Form1_Paint;
}

private void Form1_Paint(object sender, PaintEventArgs e)
{
    PrivateFontCollection pfc = new PrivateFontCollection();
    //Extracting icon fonts from the WF Fabric.ttf file and adding into system memory.
    Stream fontAsStream = this.GetType().Assembly.GetManifestResourceStream("WindowsFormsApp1.WF Fabric.ttf");
    byte[] fontAsByte = new byte[fontAsStream.Length];
    fontAsStream.Read(fontAsByte, 0, (int)fontAsStream.Length);
    fontAsStream.Close();
    IntPtr memPointer = System.Runtime.InteropServices.Marshal.AllocHGlobal(System.Runtime.InteropServices.Marshal.SizeOf(typeof(byte)) * fontAsByte.Length);
    System.Runtime.InteropServices.Marshal.Copy(fontAsByte, 0, memPointer, fontAsByte.Length);
    pfc.AddMemoryFont(memPointer, fontAsByte.Length);
}

着至关重要的作用。pfc对象中的Families属性将保存已保存的字体系列名称。如上所述,我们创建了WF Fabric.ttf,其字体系列名称为WF Fabric。下载Essential Studio for Windows Forms最新版

现在创建一个枚举,其中包含具有相应名称的所有图标字体,并为其Unicode指定前缀0x。因此,无论您使用图标字体绘制何处,Unicode都将转换为字符串并作为参数传递给DrawString方法。

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
        this.Paint += Form1_Paint;
    }

    private void Form1_Paint(object sender, PaintEventArgs e)
    {
        PrivateFontCollection pfc = new PrivateFontCollection();
        //Extracting icon fonts from the WF Fabric.ttf file and inserting into system memory.
        Stream fontAsStream = this.GetType().Assembly.GetManifestResourceStream("WindowsFormsApp1.WF Fabric.ttf");
        byte[] fontAsByte = new byte[fontAsStream.Length];
        fontAsStream.Read(fontAsByte, 0, (int)fontAsStream.Length);
        fontAsStream.Close();
        IntPtr memPointer = System.Runtime.InteropServices.Marshal.AllocHGlobal(System.Runtime.InteropServices.Marshal.SizeOf(typeof(byte)) * fontAsByte.Length);
        System.Runtime.InteropServices.Marshal.Copy(fontAsByte, 0, memPointer, fontAsByte.Length);
        pfc.AddMemoryFont(memPointer, fontAsByte.Length);

        //Icon font's unicode "0xe700" is converted to string and drawn using e.Graphics with WF Fabric set as font family. 
        string iconChar = char.ConvertFromUtf32(IconFont.LastArrow);
        Font iconFont = new Font(pfc.Families[0], 18.5f, FontStyle.Bold);
        e.Graphics.DrawString(iconChar, iconFont, new SolidBrush(Color.Orange), new PointF(10, 10));

        //Icon font's unicode "0xe710" is converted to string and drawn using e.Graphics with WF Fabric set as font family.
        iconChar = char.ConvertFromUtf32(IconFont.Plus);
        e.Graphics.DrawString(iconChar, iconFont, new SolidBrush(Color.Red), new PointF(40, 40));

        //Icon font's unicode "0xe720" is converted to string and drawn using e.Graphics with WF Fabric set as font family.
        iconChar = char.ConvertFromUtf32(IconFont.Paint);
        e.Graphics.DrawString(iconChar, iconFont, new SolidBrush(Color.Green), new PointF(70, 70));
    }
}

public static class IconFont
{
    //0xe700, 0xe710, 0xe720 - are icon font's unicode from the WF Fabric.ttf file.
    public static int LastArrow = 0xe700;
    public static int Plus = 0xe710;
    public static int Paint = 0xe720;
}

现在是在实际场景中应用图标字体的时候了。我们准备了一个简单的演示,它显示了在自定义按钮控件上绘制的第一页、最后一页、上一页和下一页的导航图标。

参考示例:使用图标字体在WinForms按钮控件上呈现图标

在Essential Studio for WinForms应用程序中使用图标字体

△ 自定义按钮控制与图标字体和文本绘制在里面

使用图标字体的优点是:

  • 改进了所有字体大小的渲染质量;

  • 通过改变颜色为不同的主题和皮肤重用单个图标字体;

  • 通过不必相对于DPI缩放维持不同的图像大小来减小应用程序大小;

  • 添加多个图标字体以及用字母、数字和符号连接图标字体。


相关内容

热门资讯

萧美琴称年花6000元新台币保... 海峡导报综合报道 岛内朝野对8年1.25万亿元(新台币,下同)的“防务特别条例”仍无共识,台湾地区副...
巴基斯坦消息人士:美伊谈判似已... 巴基斯坦权威消息人士6日表示,美国和伊朗通过巴基斯坦进行的谈判似已显现希望,“低调的谈判有望转化为切...
雷暴大风、短时强降水、局地冰雹... 今天上午我省多地晴朗在线、升温持续,10点京广线及以东地区升至25-27℃,预计午后最高气温除了西部...
无障碍阅读“建设蓝图”出炉!多... 【大河财立方消息】 5月6日消息,中国残联、教育部、文化和旅游部、国家新闻出版署、共青团中央、全国妇...
蚂蚁集团等入股大晓机器人 【大河财立方消息】天眼查App显示,近日,大晓机器人关联公司上海大晓无限机器人有限公司发生工商变更,...
南航扭亏的AB面:物流压舱、子... 【大河财立方 记者 陈诗昂】4月30日,南方航空举行2026年一季度业绩发布会。一季报显示,南航营收...
“五一”超800场好戏燃动全城... “五一” 假期落幕,全国文旅市场持续火爆、亮点频现。山东临沂琅琊古城凭借沉浸式国风演艺、全时段互动体...
Siri升级延期,苹果或赔17... 来源:市场资讯 (来源:界面新闻) 据多家外媒报道,当地时间5月5日,美国苹果公司就一起集体诉讼达成...
时代电气获得发明专利授权:“列... 证券之星消息,根据天眼查APP数据显示时代电气(688187)新获得一项发明专利授权,专利名为“列车...
高市早苗在澳大利亚下跪献花,网... 据日本外务省网站消息,当地时间5月4日,日本首相高市早苗对澳大利亚进行访问时,前往位于堪培拉的澳大利...