このページの内容 |
---|
エディットコントロールとは |
作成方法 |
ウインドウスタイル |
使い方 |
ありがたいスポンサー様 |
---|
エディットコントロールは、次のような用途に使います。
具体例として下の図を見てください。これはファイルのプロパティーを見たときに出てくるダイアログですが、編集可能な文字列は上側のものです。白抜きで表示されており、ユーザーが文字列を編集することができます。下側のものは、編集はできませんが選択可能であり、コピーも可能です。スタティックコントロールとは、選択できない点が異なります。
エディットコントロールの使用例
CreateWindow( "edit", // スタティックコントロールのクラス名 "text is here.", // 表示する文字列 ES_LEFT | WS_CHILD | WS_VISIBLE | WS_BORDER, // ウインドウスタイル x, y, // 左上の座標 iWidth, iHeight, // 幅と高さ hParent, // 親ウインドウのウインドウハンドル NULL, // メニューハンドル。NULLでよい。 hInstance, // アプリケーションのインスタンスハンドル。 NULL // ウインドウ作成データ。NULLでよい ) ;
HDC hdc ;
TEXTMETRIC tm ;
int iHeight ;
hdc = GetDC( hwnd) ;
SelectObject( hdc, GetStockObject( SYSTEM_FIXED_FONT)) ;
GetTextMetrics( hdc, &tm) ;
iHeight = ( tm.tmHeight + tm.tmExternalLeading) * 7 / 4 ;
リソースエディタで作成する場合には、丸をつけている 『エディットボックス』 で作成できます。
editコントロールはこれ
コントロールバーが表示されていない場合は、VC++ のメニューの上で右クリックして、『コントロール』 をチェックすれば出てきます。
ウインドウハンドルを取得するには、hwnd = GetDlgItem( hDlg, IDC_EDIT) ;といった感じでコントロールIDをしていすればOKです。
スタイル | 意味 |
ES_LEFTES_CENTERES_RIGHT | テキストを表示する位置を設定する。リソースエディタでは、スタイルタブの 『テキストの配置』。 |
ES_NOHIDESEL | フォーカスが別のウインドウに移ったときも、選択範囲を表示し続ける。ソースエディタでは、スタイルタブの 『常に選択を表示』。 |
ES_MULTILINE | 複数行になる。リソースエディタでは、スタイルタブの 『複数行』。ダイアログで使用した場合は、Enterキーを押したときのデフォルトの動作はデフォルトボタンを押すこととなる。もし、Enterを押したときに改行した ければ、ES_WANTRETURN スタイルを有効にするとよい。複数行の場合、縦方向オートスクロールを ES_AUTOVSCROLL で設定できる。 |
ES_LOWERCASE,ES_UPPERCASE | すべてのアルファベットを大文字または小文字に変換して表示する。リソースエディタでは、スタイルタブの 『大文字変換』、『小文字変換』。 |
ES_PASSWORD | パスワード表示になる。入力した文字列が 『*』 で表示される。この文字列は EM_SETPASSWORDCHAR で変更できる。リソースエディタでは、スタイルタブの 『パスワード』。 |
ES_READONLY | 編集できなくなる。この場合は、境界線を表示しない方がよいかもしれない。リソースエディタでは、スタイルタブの 『読みとり専用』。 |
ES_AUTOHSCROLL,ES_AUTOVSCROLL | 横方向、縦方向にオートスクロールする。H が Horizontal, V が Vertical の略。リソースエディタでは、スタイルタブの 『水平オートスクロール』、『垂直オートスクロール』。 |
WS_HSCROLL,WS_VSCROLL | 横方向、縦方向にスクロールバーを表示する。H が Horizontal, V が Vertical の略。リソースエディタでは、スタイルタブの 『水平スクロールバー』、『垂直スクロールバー』。 |
詳細は、『MSDNのプラットフォームSDK → Platform SDK → User Interface Services → Controls → Edit Controls → Edit Control Reference → Edit Control Styles』 にあります。
.NET版 MSDNでは、『ユーザーインターフェースデザインおよび開発 → User Interface Design and Development → Windows User Interface → SDK Documentation → Windows User Interface → Controls → Edit Controls → Edit Control Reference → Edit Control Styles』 です。
見つからない場合は、検索で 『ES_MULTILINE』 などをキーワードに調べてみてください。
改行するには、lpString に "The 1st line.\r\nThe 2nd line." のように \r\n を指定すればよい。
// 戻り値は成功したかどうか。 BOOL SetWindowText( HWND hwnd, LPCSTR lpString) ; // コントロールがダイアログ内にあって、いちいち // ウインドウハンドルを取得するのが面倒な場合は、次の関数が便利 // nIDDlgItem には コントロールID を指定。 BOOL SetDlgItemText( HWND hDlg, int nIDDlgItem, LPCTSTR lpString) ;
// ウインドウハンドルが分かっていないと、文字列の長さは取得できない。 // 戻り値が長さを表わす。 int GetWindowTextLength( HWND hwnd) ;
// nMaxCount でバッファに格納できる最大文字数を指定 BOOL GetWindowText( HWND hwnd, LPSTR lpString, int nMaxCount) ; // コントロールがダイアログ内にあって、いちいち // ウインドウハンドルを取得するのが面倒な場合は、次の関数が便利 // nIDDlgItem には コントロールID を指定。 BOOL GetDlgItemText( HWND hDlg, int nIDDlgItem, LPCTSTR lpString, int nMaxCount) ;
EM_SETSEL をエディットコントロールに送って下さい。wParam, lParam には、カーソルを移動したい場所を数値で指定すればOKです。1文字目が 0 です。wParam と lParam には同じ値を入れるところがポイントです。
EM_SETSEL をエディットコントロールに送って下さい。wParam に始点の場所、 lParam には終点の場所を指定して下さい。1文字目が 0 です。全て選択するには、wParam に 0 、lParam に -1 を指定します。
EM_GETSEL をエディットコントロールに送って下さい。wParam に DWORD へのポインタ、lParam に DWORD へのポインタを指定します。
DWORD dwStart, dwEnd ; SendMessage( hwndEdit, EM_GETSEL, (WPARAM)&dwStart, (LPARAM)&dwEnd) ;
// 指定行の文字数を取得 // int iLine で行番号を指定。1行目が 1 int iLineLength = SendMessage( hwndEdit, EM_LINELENGTH, (WPARAM)iLine, 0) ; // 指定行の最初の文字が何文字目かを取得 // int iLine で行番号を指定。1行目が 0 int iLineIndex = SendMessage( hwndEdit, EM_LINEINDEX, (WPARAM)iLine, 0) ; // 指定行の最初の文字列を取得 // int iLine で行数を指定 // LPSTR pszBuf で文字列を格納するバッファを指定。 // pszBuf の先頭2バイトにバッファサイズを入れておく。ややこし。 SendMessage( hwndEdit, EM_GETLINE, (WPARAM)iLine, (LPARAM)pszBuf) ; // 行数を取得 int iLineCount = SendMessage( hwndEdit, EM_GETLINECOUNT, 0, 0) ;
WM_COMMAND メッセージで親ウインドウに通知がきます。WM_COMMAND の wParam, lParam の値は、次の通りである。
パラメータ | 説明 |
HIWORD(wParam) | 通知コード |
LOWORD(wParam) | コントロールID |
lParam | 子ウインドウのハンドル |
通知コードには以下のようなものがある。
通知コード | 説明 |
EN_SETFOCUS | 入力フォーカスを得た |
EN_KILLFOCUS | 入力フォーカスを失った |
EN_CHANGE | 内容が変わる直前 |
EN_UPDATE | 内容が変わった直後 |
EN_ERRSPACE | エディットコントロールのスペースを使い切った |
EN_MAXTEXT | 挿入時にスペースを使い切った。 |
EN_HSCROLL | エディットコントロールの水平スクロールバーがクリックされた |
EN_VSCROLL | エディットコントロールの垂直スクロールバーがクリックされた |
次のようにして使うとよいでしょう。
case WM_COMMAND: if( LOWORD( wParam) == IDC_EDIT) { switch( HIWORD( wParam)) { case EN_CHANGE: // 内容が変わる直前の処理 break ; case EN_MAXTEXT: // ... break ; } }
エディットコントロールでは、そのようなことはできません。リッチエディットコントロールでは可能です。