LoginSignup
1
2

More than 3 years have passed since last update.

C# - RichTextBox関連やりたいこと逆引きリファレンス【自分用】

Last updated at Posted at 2021-02-28

文字位置情報の取得と設定

位置情報の取得

やりたいこと プロパティまたはメソッド名 参考サイト
位置座標 ⇒ 文字indexの取得 GetCharIndexFromPosition
文字index ⇒ 位置座標の取得  GetPositionFromCharIndex
文字index ⇒ 行番号indexの取得  GetLineFromCharIndex dobon
行番号index ⇒ 行頭文字indexの取得 GetFirstCharIndexFromLine
現在行の行頭文字indexの取得 GetFirstCharIndexOfCurrentLine

選択位置の取得と設定

やりたいこと プロパティまたはメソッド名 参考サイト
選択開始位置(index)の取得1 SelectionStart
選択文字数の取得 SelectionLength
選択対象文字列(indexと文字数)の設定 Select
全選択 SelectAll()

書式設定

選択されている部分文字列に対して書式を設定します。※要注意2

やりたいこと プロパティまたはメソッド名 参考サイト
背景色を設定/取得 SelectionBackColor
文字の色を設定/取得 SelectionColor
フォントを設定/取得 SelectionFont
上付き下付きオフセットを設定/取得 SelectionCharOffset dobon

テキスト検索

やりたいこと プロパティまたはメソッド名 参考サイト
文字列検索 Find

パラメータ: RichTextBoxFinds

ファイル操作

自前で読み込み処理を作っても問題はないが、下記が使えるかも。

やりたいこと プロパティまたはメソッド名 参考サイト
読み込み LoadFile
保存 SaveFile

パラメータ: RichTextBoxStreamType

主要なイベント

やりたいこと イベント名 参考サイト
テキストが変更されたとき(※要注意2 TextChanged
選択文字位置または文字数が変更されたとき SelectionChanged

その他いろいろ

コントロールのプロパティ

タブ幅の指定

using System.Runtime.InteropServices;


[DllImport("user32")]
public extern static IntPtr SendMessage(IntPtr hWnd, int Msg, IntPtr wParam, IntPtr lParam);

private const int EM_SETTABSTOPS = 0x00CB;

static IntPtr SetTabStop(TextBoxBase t, int tabSize)
{
    int[] tabarray = new int[] { tabSize*4 };
    int wparam = tabarray.Length;

    IntPtr parray = Marshal.AllocCoTaskMem(Marshal.SizeOf(typeof(int)) * tabarray.Length);
    Marshal.Copy(tabarray, 0, parray, tabarray.Length);
    IntPtr ret = NativeMethods.SendMessage(t.Handle, EM_SETTABSTOPS, new IntPtr(wparam), parray);
    return ret;
}

フォントが勝手に変わる問題の対策

タブ幅設定より先に実施したほうがよい・・はず。


private const long IMF_DUALFONT = 0x80;
private const int WM_USER = 0x0400;
private const int EM_SETLANGOPTIONS = WM_USER + 120;
private const int EM_GETLANGOPTIONS = WM_USER + 121;

static IntPtr SetFixFont(TextBoxBase t)
{
    IntPtr lParam = NativeMethods.SendMessage(t.Handle, EM_GETLANGOPTIONS, new IntPtr(0), new IntPtr(0));
    lParam = new IntPtr( ((long)lParam) & (~IMF_DUALFONT));
    return NativeMethods.SendMessage(t.Handle, EM_SETLANGOPTIONS, new IntPtr(0), lParam);
}

再描画の停止と再開

描画の再開についての補足

(別記事に引っ越すかも)
RichTextBoxに関しては、描画の再開がInvalidate()RedrawWindow(Win32API)ではうまくいかない。(矢印キー操作は描画がされるが、マウス操作だと描画されないままになってしまう。)
this.ActiveControl = null; と RichTextBox.Focus(); して強引に復帰させればいけているっぽいが、現物合わせなので根拠はない。

オーナードロー

プログラム起点でSelectで書式を変えると、色々と邪魔なイベントが発生してしまうため、自前で描画したほうが整合をとりやすいかもしれない。オーナードローは有力な選択肢と思っている。(もはやRichTextBoxである必要性がないかもしれない。。。3

IMEが勝手に確定する問題の対策

色々取り込んでみた結果

ほとんどRichBoxTextの使い方をしていない気がするが。。。

参考サイト


  1. 右端が選択されている場合、取得結果=文字数(=Text.Length)となりえるので注意。 

  2. 書式を変えるだけなのにTextChangedイベントが発生するようなので注意。(設定に依存?) 

  3. ただし、TextBoxだと文字を入力しただけだと、WM_PAINTメッセージが発火しない。 

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2