RichTextBox - DualFont を無効にする

失敗

全角文字は MS UI Gothic、半角文字は Arial
図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 を無効にするコードを示します。

[C# - 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 メソッドを使用してください。 以下に、簡単なサンプルを示します。

[C# - SendMessage を使用し、RichTextBox の言語サポートから DualFont をはずす]
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);
}

参考サイト

コメント

コメント投稿
(非公開)
     « アイコン一覧 »
(必須)

作成日:2007/04/02
更新日:2007/04/02