加载后可以使用 C# 字体

本文关键字:字体 可以使 加载 | 更新日期: 2023-09-27 18:36:01

我想出了如何从 C# 应用程序加载 PS 字体,它会显示并且可以在我的系统上的所有应用程序中使用,例如 word、记事本等,除了我的 C# 应用程序(当然这是我需要它的地方)。

我需要将该字体分配给我的 WinForm 上的文本框。加载字体后,我尝试将字体分配给文本框,如下所示:"GXSTRA03是我加载的字体"

 printFont = new Font("GXSTRA03", 12);
 txtDisplyFont.Font = printFont;

但它始终默认为"Microsoft无衬线"大小=12.0

以下是我用来加载字体的代码:

using System.Runtime.InteropServices;
private static uint WM_FONTCHANGE = 0x1D;
        [DllImport("gdi32.dll")]
        static extern int AddFontResource(string lpFilename);
        [DllImport("gdi32.dll")]
        static extern bool RemoveFontResource(string lpFileName);
        [DllImport("user32.dll", CharSet = CharSet.Auto)]
        private static extern int SendMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam);
private void LoadFont{
               int result = AddFontResource(@"C:'Temp'Font2'GXSTRA03.PFM|C:'Temp'Font2'GXSTRA03.PFB");
                long msg = SendMessage(HWND_BROADCAST, WM_FONTCHANGE, IntPtr.Zero, IntPtr.Zero);
}

就像我上面说的,这适用于我的 c# 应用程序,所以我认为我需要像其他应用程序一样侦听字体更改事件,所以我添加了以下代码

protected override void WndProc(ref Message m)
    {
        switch (m.Msg)
        {
            case WM_FONTCHANGE:
                {
                    fontList();
                    break;
                }
        }
        base.WndProc(ref m);  // proceed with default processing
    }

我捕获发送到我的应用程序的系统消息,告诉我字体列表已更改。 当我收到消息时,我调用字体列表函数以查看我的应用是否可以看到加载的字体。

private void fontList(){
            listBox1.Items.Clear();
            InstalledFontCollection fontsCollection = new InstalledFontCollection();
            FontFamily[] fontFamilies = fontsCollection.Families;
            List<string> fonts = new List<string>();
            foreach (FontFamily font in fontFamilies)
            {
                listBox1.Items.Add(font.Name);
            }
      }

在这个列表中,我以为我会看到我的字体?好吧,我没有:-( 而且我不确定我错过了什么或做错了什么,在我陷入困境的那一刻,任何帮助都会很棒。

话筒

加载后可以使用 C# 字体

如注释中所述,您尝试使用的字体是 Adobe Type 1 字体。 Winform不支持哪些字体,它只能与TrueType字体一起使用。 字体映射器不会枚举它,你会得到一个备用字体,Microsoft无衬线字体是通常的字体。

相关文章: