失敗
図1 RichTextBox の DualFont 機能
RichTextBox のフォントを "MS UI Gothic" に設定しているにもかかわらず、半角英数字を入力すると "Arial" フォントで表示されてしまいます。
全角文字は "MS UI Gothic" で表示されるのに…。なぜ?
環境
このレポートは、以下の環境について記述したものです。
| OS | Windows XP SP 2 |
| .NET | .NET Framework 2.0 |
原因
RichTextBox のデフォルト設定では、DualFont が有効になっています。 このため、Font プロパティの値に関わらず、半角文字では "Arial" になってしまいます。
解決策
.NET 2.0 では、IME とアジア言語のサポート (DualFont を含む) に関する LanguageOption プロパティが追加されています。 LanguageOption プロパティのデフォルト値は、AutoFont と DualFont の組み合わせになっています。
半角/全角に関わらず、RichTextBox に設定されたフォントを使用するには、DualFont を無効にする必要があります。
(1) DualFont を無効にする
以下に、RichTextBox の言語サポートから DualFont を無効にするコードを示します。
// AutoFont のみに変更 this.richTextBox1.LanguageOption = RichTextBoxLanguageOptions.AutoFont;
補足
■ .NET 1.0, 1.1 で DualFont を無効にするには?
LanguageOption プロパティは .NET 2.0 で追加されたものです。 .NET 1.0, 1.1 で DualFont を無効にするには、Win32API の SendMessage メソッドを使用してください。 以下に、簡単なサンプルを示します。
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
// 言語オプションの取得
int optins = SendMessage(this.richTextBox1.Handle, EM_GETLANGOPTIONS, 0, 0);
// DualFont を無効化
optins = optins ^ IMF_DUALFONT;
// 言語オプションの設定
SendMessage(this.richTextBox1.Handle, EM_SETLANGOPTIONS, 0, optins);
}
// SendMessage API
[System.Runtime.InteropServices.DllImport("User32.dll")]
private static extern int SendMessage(
IntPtr hWnd, int msg, int wParam, int lParam);
// メッセージ定数
private const int IMF_DUALFONT = 0x80;
private const int WM_USER = 0x400;
private const int EM_SETLANGOPTIONS = (WM_USER + 120);
private const int EM_GETLANGOPTIONS = (WM_USER + 121);
}
