C# : RichTextBoxで勝手にフォントが変わってしまう対処法
C#のRichTextBoxでフォント設定しても、後から文字を入力すると別のフォントになったりします。
これですね↓。最初にMS ゴシックに設定しているのですが、赤矢印のようにデフォルトフォント(Arial?)に戻ってしまうんです。これが結構厄介です。
[ad#top-1]
Windows APIが必要
これを対処するにはWindowsAPIが必要になります。
まずはコンストラクタの前に以下を入力します。
private const uint IMF_DUALFONT = 0x80; private const uint WM_USER = 0x0400; private const uint EM_SETLANGOPTIONS = WM_USER + 120; private const uint EM_GETLANGOPTIONS = WM_USER + 121; [System.Runtime.InteropServices.DllImport("USER32.dll")] private static extern uint SendMessage(System.IntPtr hWnd, uint msg, uint wParam, uint lParam)<span data-mce-type="bookmark" style="display: inline-block; width: 0px; overflow: hidden; line-height: 0;" class="mce_SELRES_start"></span>;
次にRichTextBoxを設定した後に以下のコードを入れればOK。
uint lParam; lParam = SendMessage(this.textBox.Handle, EM_GETLANGOPTIONS, 0, 0); lParam &= ~IMF_DUALFONT; SendMessage(this.textBox.Handle, EM_SETLANGOPTIONS, 0, lParam);
見ての通りフォントが変わらなくなりました。
ソースコード全文
こちらが上で出した図のプログラムのソースコード全文です。
using System; using System.Drawing; using System.Windows.Forms; using System.Collections.Generic; class TextFontTest{ static void Main(string[] args){ Application.Run(new MainWindow(args)); } } class MainWindow : Form{ private RichTextBox textBox; //RichTextBoxでフォントが勝手に変わらないためのAPI private const uint IMF_DUALFONT = 0x80; private const uint WM_USER = 0x0400; private const uint EM_SETLANGOPTIONS = WM_USER + 120; private const uint EM_GETLANGOPTIONS = WM_USER + 121; [System.Runtime.InteropServices.DllImport("USER32.dll")] private static extern uint SendMessage(System.IntPtr hWnd, uint msg, uint wParam, uint lParam); public MainWindow(string[] args){ this.StartPosition = FormStartPosition.CenterScreen; this.Width = 800; this.Height =600; this.Text = "テキストボックステスト"; textBox = new RichTextBox(){ Dock = DockStyle.Fill, Font = new Font("MS ゴシック", 14), AcceptsTab = true, WordWrap = false, Parent=this, }; //RichTextBoxでフォントが勝手に変わらないための処置 uint lParam; lParam = SendMessage(this.textBox.Handle, EM_GETLANGOPTIONS, 0, 0); lParam &= ~IMF_DUALFONT; SendMessage(this.textBox.Handle, EM_SETLANGOPTIONS, 0, lParam); } }
[ad#ad-1]
スポンサーリンク