文字位置情報の取得と設定
位置情報の取得
やりたいこと | プロパティまたはメソッド名 | 参考サイト |
---|---|---|
位置座標 ⇒ 文字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
メッセージが発火しない。 ↩