Windows API - CUI プログラミング編 第2回 〜エディットコントロール〜

エディットコントロール

エディットコントロールは、文字列を表示・編集するための定義済みウィンドウクラスです。

前回、RegisterClassEx() API 関数を使い、独自のウィンドウクラスを登録しましたが、今回は、

TEXT("EDIT")

を用います。

エディットコントロールハンドルの発行

前回と同様、ウィンドウハンドルを発行するためには、CreateWindow() API 関数を用います。

HWND hEdit=CreateWindow(
 TEXT("EDIT"), TEXT(""),
 dwStyle, x, y, width, height,
 hWndParent, NULL, hInstance, NULL
);

x, y, width, height はウィンドウの配置位置 (x,y) とサイズ (width, height) を 表しますが、これは、親ウィンドウハンドル hWndParent の 外枠やタイトルバーをのぞいた部分の一番左上を (0,0) を基準とします。

hInstance は、WinMain() 関数の第1引数ですが、これは、親ウィンドウハンドル hWndParent さえあれば、

(HINSTANCE)GetWindowLong(hWndParent,GWL_HINSTANCE);

としても取得できます。

エディットコントロールのスタイル

第3引数の dwStyle のフラグに応じて、エディットコントロールのスタイルが決定されます。

たとえば、文字列を入力することの出来る1行エディットコントロールは、

WS_CHILD | WS_VISIBLE | ES_LEFT	

などと指定します。少なくとも、最初の2つのフラグはどんな子ウィンドウであっても指定します。 3つ目のフラグが左寄せを表すフラグです。

入力できる文字数は CreateWindow() で指定した width に依存しますが、

ES_AUTOHSCROLL

フラグを追加することで、表示できる幅を超えると自動的に水平方向にスクロールするようになります。

Enter キーを押すことで、改行することの出来るエディットコントロールは、

ES_AUTOHSCROLL | ES_AUTOVSCROLL |
WS_HSCROLL | WS_VSCROLL | ES_MULTILINE

というフラグを追加します。垂直方向、水平方向それぞれにスクロールバーが現れ、 表示できる幅・行数を超えると、スクロールバーが有効になります。

ES_READONLY | WS_BORDER

を指定すると、編集不能なエディットコントロールとなります。 WS_BORDER は、エディットコントロールに外枠をつけるフラグです。

エディットコントロールとメッセージ

SendMessage() API 関数

CreateWindow() API 関数によって発行されたウィンドウハンドルを用いると、 SendMessage() API 関数を用いて、エディットコントロールに様々な指示を与える メッセージをセンドすることが出来ます。

LRESULT SendMessage(HWND, UINT, WPARAM, LPARAM);

宣言を見れば分かるように、ウィンドウプロシージャと同じ引数です。 SendMessage() API 関数によってセンドされたメッセージが、 ウィンドウプロシージャによって処理され終わると、LRESULT が返ります。

以下に、代表的なメッセージとそのパラメータと戻り値を列挙します。

EM_GETSEL        現在選択されている範囲を取得する
 WPARAM           最初の文字の位置を表すポインタ
 LPARAM           最後の文字の次の位置を表すポインタ 
 LRESULT          最初の文字の位置/最後の文字の次の位置
EM_SETSEL        指定範囲を選択状態にする 
 WPARAM           最初の文字の位置
 LPARAM           最後の文字の次の位置
 LRESULT          TRUE/FALSE
EM_LINESCROLL    任意方向にスクロールする
 WPARAM           水平方向のスクロール文字数
 LPARAM           垂直方向のスクロール行数
 LRESULT          TRUE/FALSE
EM_SCROLLCARET   現在のカーソル位置を表示する
 WPARAM/LPARAM    0
 LRESULT          TRUE/FALSE
EM_LINELENGTH    指定した行の文字数を返す
 WPARAM           行数
 LPARAM           0
 LRESULT          指定行の文字数
EM_REPLACESEL    現在選択されている文字列を置換する
 WPARAM           1
 LPARAM           置換文字列
 LRESULT          TRUE/FALSE
WM_SETTEXT       エディットコントロールに文字列を表示する
 WPARAM           0
 LPARAM           表示文字列
 LRESULT          TRUE/FALSE
WM_GETTEXT       エディットコントロールの文字列を取得する
 WPARAM           バッファサイズ
 LPARAM           バッファへのポインタ
 LRESULT          コピーされた文字列長
WM_GETTEXTLENGTH エディットコントロールの文字列長を返す
 WPARAM           0
 LPARAM           0
 LRESULT          エディットコントロールの文字列長

エディットコントロールに関する API 関数

SendMessage() API 関数を使えば大抵の操作が出来ますが、 いくつかの操作は、SendMessage() を使うことなく、直接 API 関数で 処理することが出来ます。

BOOL SetWindowText(HWND, LPCWSTR);

は、第2引数で指定した文字列を第1引数で指定したウィンドウに表示します。

int GetWindowTextLength(HWND);

は、指定したウィンドウの文字列の長さを返します。

BOOL GetWindowText(HWND, LPWSTR, int);

は、第2引数に指定したバッファに、最大第3引数文字だけ、第1引数で指定したウィンドウの文字列をコピーします。

複数行エディットコントロールと改行文字

複数行エディットコントロールでは、Enter キーの入力により改行が行われますが、 ここで入力される改行コードは、Windows の場合、

TEXT("\r\n")

となります。TEXT("\n") だけでは改行されないため、C++ の std::endl などでは、 改行することが出来ません。

キーボードメッセージ

WM_KEYDOWN メッセージと WM_KEYUP メッセージ

エディットコントロールを使わずに、キーボードからの入力を制御するためには、 直接、キーボードからのメッセージを解釈しなくてはなりません。

キーボードのキーが押されたときには、メッセージ WM_KEYDOWN が、離されたときには、 メッセージ WM_KEYUP がポストされます。

WPARAM には、次のような仮想キーコード、または対応するアスキーコードが記録されます。

VK_BACK     [Backspace]
VK_TAB      [Tab]
VK_RETURN   [Enter]
VK_SHIFT    [Shift]
VK_CONTROL  [Ctrl]
VK_MENU     [Alt]
VK_ESCAPE   [Esc]
VK_SPACE    [   ]
VK_PRIOR    [Page Up]
VK_NEXT     [Page Down]
VK_END      [End]
VK_HOME     [Home]
VK_LEFT     [左方向]
VK_UP       [上方向]
VK_RIGHT    [右方向]
VK_DOWN     [下方向]
VK_DELETE   [Delete]
VK_NUMPAD?  [テンキー?]
VK_MULTIPLY [テンキー*]
VK_ADD      [テンキー+]
VK_SUBTRACT [テンキー-]
VK_DECIMAL  [テンキー.]
VK_DIVIDE   [テンキー/]
VK_F?       [F?]

LPARAM には、次のような情報がフラグとして記録されます。

 0-15 : リピート情報
 24   : 拡張キーフラグ     [Ctrl] キーなどが押されているならば 1
 29   : コンテキストモード [Alt] キーが押されているならば 1
 30   : 直前のキー状態     キーが押されていたならば 1
 31   : 変換状態           キーが離されているならば 1 

WM_CHAR メッセージ

WM_KEYDOWN メッセージがポストされた後に、そのキーが文字を表すものであると、 WM_CHAR メッセージがポストされます。

WPARAM が文字コードとなります。

これらのメッセージを、ウィンドウプロシージャ内で処理することでキーボードからの 入力情報を処理します。


文章作成 : yukki-ts (-+-twilight serenade-+- [stage])