在.NET应用程序中嵌入/部署自定义字体

Swi*_*age 12 .net deployment fonts winforms

是否有官方方法使用.NET应用程序分发(部署)特定字体?

我们有一个(公共领域)"LED字体",用复古的LED仪表面打印数字.这是一个标准的True Type或Open Type字体,除了它看起来很时髦.

显然,为了工作,这个字体需要在用户的机器上.但我们宁愿不强迫用户"将我们的特殊字体安装到您的字体文件夹中".我们更喜欢直接从TTF加载Font对象,或者以编程方式安装字体以使其可用.

应用程序如何处理这类事情?例如,我注意到Adobe XYZ在系统上安装了各种字体而无需用户干预.这就是我们想做的事情.

编辑:好的,理想,我们宁愿直接安装字体.我们不希望我们漂亮的主题LED字体显示在用户的MS Word字体下拉列表中.我们更喜欢使用此字体,但限制其使用或外观到我们的应用程序.有什么办法吗?

编辑2:这是一个WinForms .NET 2.0应用程序.

谢谢!

小智 14

我使用自定义字体上一个asp.net网站我的自定义图形库,但是这应该也是在WinForm的工作,没有问题.您只需指定font-file,font-size和font-style,并返回font-type.

public static LoadedFont LoadFont(FileInfo file, int fontSize, FontStyle fontStyle)
{
    var fontCollection = new PrivateFontCollection();
    fontCollection.AddFontFile(file.FullName);
    if (fontCollection.Families.Length < 0)
    {
        throw new InvalidOperationException("No font familiy found when loading font");
    }

    var loadedFont = new LoadedFont();
    loadedFont.FontFamily = fontCollection.Families[0];
    loadedFont.Font = new Font(loadedFont.FontFamily, fontSize, fontStyle, GraphicsUnit.Pixel);
    return loadedFont;
}
Run Code Online (Sandbox Code Playgroud)

LoadedFont是一个简单的结构

public struct LoadedFont
{
    public Font Font { get; set; }
    public FontFamily FontFamily { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

这是为了防止FontFamily被GC和字体不起作用(asp.net,我不知道winform上是否需要它).