我想出了如何从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);
}
}
在这个列表中,我以为我会看到我的字体?好吧,我没有:-(而且我不确定我错过了什么或做错了任何帮助都会很好,因为我被卡住了..
麦克
答案 0 :(得分:0)
如评论中所述,您尝试使用的字体是Adobe Type 1字体。 Winform不支持哪些,它只能与TrueType字体一起使用。字体映射器不会枚举它,你会得到一个后备字体,Microsoft Sans Serif是常用字体。