C#加载后可以使用的字体

C#加载后可以使用的字体,c#,fonts,C#,Fonts,我知道如何从C#app加载PS字体,它会在我的系统上的所有应用程序(如word、记事本等)中显示并可用,但在我的C#app中除外(当然这也是我需要它的地方) 我需要将该字体指定给WinForm上的文本框。加载字体后,我尝试将字体分配给如下文本框:“GXSTRA03是我加载的字体” 但它总是默认为“Microsoft无衬线”大小=12.0 下面是我用来加载字体的代码: using System.Runtime.InteropServices; private static uint WM_FONT

我知道如何从C#app加载PS字体,它会在我的系统上的所有应用程序(如word、记事本等)中显示并可用,但在我的C#app中除外(当然这也是我需要它的地方)

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

但它总是默认为“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);

            }

      }
private void fontList(){
listBox1.Items.Clear();
InstalledFontCollection fontsCollection=新安装的FontCollection();
FontFamily[]fontFamilies=fontsCollection.Families;
列表字体=新列表();
foreach(fontFamilies中的FontFamily字体)
{
listBox1.Items.Add(font.Name);
}
}
在这个列表中,我想我会看到我的字体?嗯,我不知道:-(我不确定我错过了什么或做错了什么,在我陷入困境的那一刻,任何帮助都是很好的.)


Mike

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

Adobe Type 1字体不能从Winforms应用程序中使用,只能使用它支持TrueType字体。可能是WPF,但我对此表示怀疑,它已移动到OpenType。ho boy从未想过我将不得不提出另一种方法。你应该将此作为答案,我会接受。嗨,如果我理解正确,请问一个简短的问题,如果我的应用程序中有RichText组件,我希望用户选择fon这是在系统上,他们想要的是安装的Postscript字体,但他们无法选择该字体?写字板使用RichTextBox。试试看。是的,它在那里工作,就像我说的,我可以在任何其他应用程序中使用该字体,而不是加载该字体的应用程序中使用该字体。这是我的,但我的应用程序说该字体不存在
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);

            }

      }