非IT企業に勤める中年サラリーマンのIT日記

非IT企業でしかもITとは全く関係ない部署にいる中年エンジニア。唯一の趣味がプログラミングという”自称”プログラマー。

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]

スポンサーリンク

 - C#応用編