エディットコントロール
エディットコントロールはユーザーからの文字の入力を受け付けるコントロールです。
コントロールの作成の基本的なことはボタンコントロールの項を参照してください。
エディットコントロールの作成
エディットコントロールは「EDIT」クラスで作成します。
#define IDC_EDIT 100
CreateWindow(
L"EDIT", L"デフォルトの文字列",
WS_CHILD | WS_VISIBLE | WS_BORDER,
10, 10, 250, 24,
hWnd, (HMENU)IDC_EDIT, hInst, NULL);
標準では枠線は表示されず、どこにエディットコントロールがあるのかの見分けが付きづらいので、ウィンドウスタイルにWS_BORDER
を追加して枠線を表示しています。
エディットコントロール作成時にテキストを設定すると(CreateWindow関数の第二引数)、最初からその文字列が設定された状態になります。
不要ならば空文字やNULLを指定します。
この状態ですでにキーボードからの入力が可能です。
コピー&ペーストや右クリックメニューなどの基本的な機能を備えています。
もし文字入力ができない場合はメッセージループにTranslateMessage
関数の処理を追加してください。
(→文字の判別)
エディットコントロールのスタイル
エディットコントロールは以下のスタイルが適用できます。
定数 | 説明 |
---|---|
ES_LEFT | テキストの左揃え (デフォルト) |
ES_CENTER | テキストの中央揃え |
ES_RIGHT | テキストの右揃え |
ES_MULTILINE | 複数行のエディットコントロール |
ES_UPPERCASE | 入力文字を大文字に変換する |
ES_LOWERCASE | 入力文字を小文字に変換する |
ES_NUMBER | キー入力を数値のみに限定する ただし数値以外の文字を貼り付けることは可能 |
ES_PASSWORD | 入力文字の表示をアスタリスク(*)に置き換える (パスワードなど、文字を画面に表示したくない場合に使用) 単一行エディットコントロールでのみ有効 |
ES_AUTOVSCROLL | 最下行でEnterキーを入力すると自動で上にスクロールする |
ES_AUTOHSCROLL | 行末でキー入力すると自動で右にスクロールする |
ES_NOHIDESEL | エディットコントロールがフォーカスを失ったとき、テキストの選択状態の表示を解除しない |
ES_READONLY | エディットコントロールを読み取り専用にする |
ES_WANTRETURN | Enterキーの押下で改行する ダイアログボックス上に作成される複数行エディットコントロール用 |
ES_OEMCONVERT | Unicodeに対応しない古い環境用 (現在は使用しない) |
既定ではエディットコントロールの幅以上の文字を入力することはできません。
ES_AUTOHSCROLL
スタイルを指定すると、キー入力に合わせて内容がスクロールするようになります。
また、既定では単一行のエディットコントロールが作成されます。
複数行を入力可能にするにはES_MULTILINE
スタイルを指定します。
さらに、エディットコントロールの高さ以上の入力を行う場合はES_AUTOVSCROLL
スタイルを指定します。
なお、複数行のエディットコントロールにプログラムから文字列を指定する時、改行コードは「\n
」ではなくWindowsで使用される「\r\n
」を使用します。
その他のウィンドウスタイル
エディットコントロールはよく以下のウィンドウスタイルと組み合わせて使用されます。
定数 | 説明 |
---|---|
WS_VSCROLL | 垂直スクロールバーを表示する |
WS_HSCROLL | 水平スクロールバーを表示する |
WS_EX_CLIENTEDGE | 窪んだ枠線を表示 (拡張ウィンドウスタイル) |
WS_VSCROLL
/WS_HSCROLL
スタイルはスクロールバーを表示します。
ES_AUTOVSCROLL
/ES_AUTOHSCROLL
スタイルのみでスクロール自体は可能ですが、キャレットの位置に応じたスクロールしかできません。
特に複数行のエディットコントロールなど、ある程度の長文を読み書きする場合はスクロールバーを表示しておくと良いでしょう。
ただしES_MULTILINE
スタイルと同時に適用しないとスクロールバーは動作しません。
WS_EX_CLIENTEDGE
スタイルは枠線を立体的に表示します。
多くのウィンドウアプリケーションでは文字入力欄にはこの枠線が利用されています。
これは拡張ウィンドウスタイルなので、CreateWindowEx関数で作成します。
#define IDC_EDIT1 100
#define IDC_EDIT2 101
CreateWindowEx(
WS_EX_CLIENTEDGE,
L"EDIT", L"WS_EX_CLIENTEDGE",
WS_CHILD | WS_VISIBLE,
10, 10, 250, 24,
hWnd, (HMENU)IDC_EDIT1, hInst, NULL);
CreateWindowEx(
WS_EX_CLIENTEDGE,
L"EDIT", L"スクロールバースクロールバースクロールバー\r\n"
L"スクロールバースクロールバースクロールバー\r\n"
L"スクロールバースクロールバースクロールバー\r\n"
L"スクロールバースクロールバースクロールバー\r\n",
WS_CHILD | WS_VISIBLE | ES_MULTILINE |
WS_HSCROLL | WS_VSCROLL,
10, 50, 250, 80,
hWnd, (HMENU)IDC_EDIT2, hInst, NULL);
上段はWS_EX_CLIENTEDGE
スタイルを適用しています。
下段はスクロールバーを使用可能にしています。