加载后可以使用C#font

时间:2013-10-18 15:35:27

标签: c# fonts

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

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

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

但它始终默认为“Microsoft Sans Serif”Size = 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#app所以我认为我需要像其他应用程序一样收听字体更改事件,所以我添加了下面的代码

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);

            }

      }

在这个列表中,我以为我会看到我的字体?好吧,我没有:-(而且我不确定我错过了什么或做错了任何帮助都会很好,因为我被卡住了..

麦克

1 个答案:

答案 0 :(得分:0)

如评论中所述,您尝试使用的字体是Adobe Type 1字体。 Winform不支持​​哪些,它只能与TrueType字体一起使用。字体映射器不会枚举它,你会得到一个后备字体,Microsoft Sans Serif是常用字体。