文字位置情報の取得と設定
位置情報の取得
| やりたいこと | プロパティまたはメソッド名 | 参考サイト |
|---|---|---|
| 位置座標 ⇒ 文字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の使い方をしていない気がするが。。。
参考サイト
- RichTextBox Tips メニュー < C# 2005 Tips HOME < HIRO's.NET
- コントロール(System.Windows.Forms) - .NET Tips (VB.NET,C#...)
- RichTextBox Class (System.Windows.Forms) | Microsoft Docs
- Edit Control Messages - Win32 apps | Microsoft Docs
-
右端が選択されている場合、取得結果=文字数(=
Text.Length)となりえるので注意。 ↩ -
書式を変えるだけなのに
TextChangedイベントが発生するようなので注意。(設定に依存?) ↩ ↩2 -
ただし、
TextBoxだと文字を入力しただけだと、WM_PAINTメッセージが発火しない。 ↩