项目中使用了微软雅黑字体,支持的操作系统从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;
}
}
}
}