C#アプリからPSフォントをロードする方法を見つけました.C#アプリを除いて、ワード、メモ帳などのシステム上のすべてのアプリで表示され、使用できます(もちろん、これが必要な場所です)。
そのフォントを 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#アプリでは機能しないため、他のアプリのようにフォント変更イベントをリッスンする必要があると考えたので、以下のコードを追加しました
protected override void WndProc(ref Message m)
{
switch (m.Msg)
{
case WM_FONTCHANGE:
{
fontList();
break;
}
}
base.WndProc(ref m); // proceed with default processing
}
フォントのリストが変更されたことを通知するアプリに送信されるシステム メッセージをキャプチャします。メッセージを受け取ったら、font List 関数を呼び出して、読み込まれたフォントをアプリが認識できるかどうかを確認します。
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);
}
}
このリストの中に、自分のフォントが表示されると思いましたか? まあ、私は知りません:-(そして、私が見逃したものや間違っているものがわからない..
マイク