项目中使用了微软雅黑字体,支持的操作系统从xp到w10,有的操作系统自带有这个字体有的操作系统则不带需要自行安装,安装字体的代码示例网上很容易就能找到,文章最后也会贴出,实际编写时想实现如果操作系统已经有该字体就不在安装,因此先做了系统字体枚举判断,不存在时安装字体.实践中发现没有微软雅黑字体的电脑每次都会报错找不到字体,经过半天的专研发现操作系统字体删掉之后,系统枚举中仍然有该字体,导致程序不会自动安装,找到原因后去掉系统枚举判断,改为判断系统字体文件夹中是否存在字体文件,问题解决
安装字体示例类
using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Runtime.InteropServices; using System.Text; namespace GlobalResource { public class FontHelper { [DllImport("kernel32.dll", SetLastError = true)] static extern int WriteProfileString(string lpszSection, string lpszKeyName, string lpszString); [DllImport("gdi32")] private static extern int AddFontResource(string lpFileName); /// <summary>安装字体</summary> /// <param name="fontPath">要安装的字体物理路径[包括文件名和扩展名]</param> public static void InstallFont(string fontPath) { string fontFileName = Path.GetFileName(fontPath); string fontNameWithoutExtenstion = Path.GetFileNameWithoutExtension(fontPath); string FontPath = Environment.GetEnvironmentVariable("WINDIR") + "\\fonts\\" + fontFileName; if (!File.Exists(FontPath))//[[判断系统文件夹中是否存在字体文件,不存在时执行字体安装]] { File.Copy(fontPath, FontPath); AddFontResource(FontPath); WriteProfileString("fonts", fontNameWithoutExtenstion + "(TrueType)", fontFileName); } } /// <summary> /// 获取所有安装的字体名称[[操作系统已经删除的字体,仍然在此系统枚举中]] /// </summary> /// <returns></returns> public static List<string> GetFontNames { get { List<string> listFamily = new List<string>(); System.Drawing.Text.InstalledFontCollection fonts = new System.Drawing.Text.InstalledFontCollection(); foreach (System.Drawing.FontFamily family in fonts.Families) { listFamily.Add(family.Name); } return listFamily; } } } }
文章评论