エディットコントロールについて調べたこと、考えたことをまとめる。
ポイント
- 基本的なエディットコントロールの使用方法は、ユーザもしくはプログラムからテキストを範囲選択した状態で、選択範囲に対する操作をメッセージで指示すること
- 全体と範囲選択に対する操作を混同してはならない
- printf的な書式指定のできる出力関数を用意しておくと便利
開発・実行環境
プロセッサ: Intel(R) Core(TM) i5-5200U CPU @2.20GHz
メモリ: 8.00 GB
OS: Windows 8.1 (64bit)
compiler: Microsoft (R) C/C++ Optimizing Compiler Version 19.00.24215.1 for x86
Visual Studio: 14.0
コード
主に参考にさせていただいたのは、こちらのサイト様です[1][2]。
状態指定系
- SendMessage(hEdit, EM_SETREADONLY, FALSE, 0); // 読み取り専用の解除(入力を許可する)
- SendMessage(hEdit, EM_SETREADONLY, TRUE, 0); // 読み取り専用の指定(入力を禁止する)
- ShowWindow(hEdit, SW_SHOW); // エディットコントロールの表示
- ShowWindow(hEdit, SW_HIDE); // エディットコントロールの非表示
範囲選択系
- SendMessage(hEdit, EM_SETSEL, 0, -1); // 全体を選択
- SetFocus(hEdit); // フォーカスを合わせる
- // 末尾にカーソルを移動した状態でフォーカスを合わせる
- int index = GetWindowTextLength(hEdit);
- SetFocus(hEdit);
- SendMessage(hEdit, EM_SETSEL, (WPARAM)index, (LPARAM)index);
テキスト取得系
- SendMessage(hEdit, WM_COPY, 0, 0); // 選択範囲をコピーする
- SendMessage(hEdit, WM_CUT, 0, 0); // 選択範囲をカットする
- SendMessage(hEdit, WM_GETTEXT, (WPARAM)dst_size, (LPARAM)dst); // 選択範囲の文字列をクリップボードを介さずに取得する
テキスト編集系
- SendMessage(hEdit, WM_PASTE, 0, 0); // 選択範囲に貼り付けする
- SendMessage(hEdit, WM_CLEAR, 0, 0); // 選択範囲をクリアする
取得系、編集系のコマンドはユーザまたはプログラムにより選択された範囲に対してのみ実行される。
選択がなされていない場合には、何事も起こらない。
特にWM_CLEARなどはややこしいと思う。
端末でclearコマンドを入力すればバッファがクリアされるので、同じようにクリアされるのかと、暗黙の内に誤った認識を持っていた。
エディットコントロールの中身を丸ごと書き換える。
- void EditControl::Set(const wchar_t* format, ...) {
- wchar_t buffer[EDIT_BUFFER_MAX] = {0};
- va_list args;
- va_start(args, format);
- vswprintf_s(buffer, ARRAYSIZE(buffer), format, args);
- SetFocus(hEdit);
- SendMessage(hEdit, WM_SETTEXT, (WPARAM)0, (LPARAM)buffer);
- return;
- }
可変長引数を用いて実装。
可変長引数については、先日説明した[3]。
printfと同じように使うことができる。
エディットコントロールにすでに含まれるテキストはそのままに、末尾にテキストを新たに追加する。
- void EditControl::Add(const wchar_t* format, ...) {
- wchar_t buffer[EDIT_BUFFER_MAX] = {0};
- va_list args;
- va_start(args, format);
- vswprintf_s(buffer, ARRAYSIZE(buffer), format, args);
- int index = GetWindowTextLength(hEdit);
- SetFocus(hEdit);
- SendMessage(hEdit, EM_SETSEL, (WPARAM)index, (LPARAM)index);
- SendMessage(hEdit, EM_REPLACESEL, 0, (LPARAM)buffer);
- return;
- }
MSDNにテキストの追加方法に関する説明がある[4]。
まとめ
選択範囲に対する操作が基本のようだが、全体に対する操作として一まとめにした方がプログラマには優しいかもしれない。
付録
今回のコードの最新版はここに上げておく。
0 件のコメント:
コメントを投稿
コメント表示は承認制に設定しています