VC++の使い方

VC++の使い方 > リファレンス > GUIリファレンス > エディットコントロール
このページの内容
エディットコントロールとは
作成方法
ウインドウスタイル
使い方
ありがたいスポンサー様
All About ソフトウエアエンジニア
ネットで8%割引!自動車保険はアメリカンホーム・ダイレクト
人生の「チャンス」と「ピンチ」にモビット!
保険料が一生上がらない、保険料最大50%割引の一生涯の医療保険!

エディットコントロールとは

エディットコントロールは、次のような用途に使います。


具体例として下の図を見てください。これはファイルのプロパティーを見たときに出てくるダイアログですが、編集可能な文字列は上側のものです。白抜きで表示されており、ユーザーが文字列を編集することができます。下側のものは、編集はできませんが選択可能であり、コピーも可能です。スタティックコントロールとは、選択できない点が異なります。

エディットコントロールの使用例
エディットコントロールの使用例

作成方法

CreateWindow で作成する方法

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コントロールはこれ
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 ;
        }
    }

フォントや色を部分的に変更したい

エディットコントロールでは、そのようなことはできません。リッチエディットコントロールでは可能です。