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]
スポンサーリンク

