加载后可以使用 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);
}
}
在这个列表中,我以为我会看到我的字体?好吧,我没有:-( 而且我不确定我错过了什么或做错了什么,在我陷入困境的那一刻,任何帮助都会很棒。
话筒
如注释中所述,您尝试使用的字体是 Adobe Type 1 字体。 Winform不支持哪些字体,它只能与TrueType字体一起使用。 字体映射器不会枚举它,你会得到一个备用字体,Microsoft无衬线字体是通常的字体。