概要

エディットボックスのサンプルです。
エディットボックスに入力された文字がリアルタイムにラベルに反映されます。
OKボタンをクリックするとメッセージボックスにエディットボックスの内容を表示し、メッセージボックスのOKをクリックするとプログラムが終了します。
キャンセルボタンをクリックするとプログラムが終了します。
ダイアログボックスはリソースファイル(resource.rc)で定義しています。
エディットボックスは、ダイアログボックスの子ウィンドウです。

エディットボックスの属性はリソースファイルで定義しております。
        EDITTEXT        IDC_EDIT1, 7, 13, 104, 14, ES_AUTOHSCROLL
上記の他に以下の属性が使用可能です。複数の属性を適用するにはOR演算子 | を使用します。
ES_LEFT 左詰
ES_RIGHT 右詰
ES_CENTER センタリンク 
ES_MULTILINE 複数行入力を可能
ES_AUTOVSCROLL 自動縦スクロール 
ES_AUTOHSCROLL 自動横スクロール 
ES_READONLY 読み取り専用 
ES_NUMBER 数字以外入力不可 
ES_UPPERCASE 入力文字を大文字にする 
ES_LOWERCASE 入力文字を小文字にする 

テスト環境

コンパイラ

Visual C++ 2008 Standard 32/64bit
Visual C++ 2013 Express 32/64bit

実行環境

Windows 8.1 Enterprise 64bit
Windows 7 EnterPrise Service Pack 1 64bit
Windows Vista Ultimate Service Pack 2 32bit
Windows XP Professional Service Pack 3 32bit

プログラムソースの概要

editbox.cpp

_tWinMain

DialogBox APIを呼び出してモーダルダイアログボックスを表示します。

DlgProc1(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam)

ダイアログボックスプロシージャーです。
必要な時にWindowsから呼び出されます。
第2引数にメッセージの種類が格納されていますので、switchステートメントによりメッセージごとの処理を振り分けます。
コントロールダイアログボックスに張り付けられているエディットボックスやプッシュボタン等 コントロールと呼ぶ)を操作するには、コントロールのハンドルが必要です。 ダイアログボックスのコントロール(子ウィンドウ)のハンドルを取得するには、 GetDlgItem APIを呼び出し、ダイアログボックスのハンドルとコントロールのID番号よりハンドルを取得します。
自分で処理しないメッセージは、ダイアログボックスプロシージャー終了時にFALSEを渡せば、Windowsが標準的な処理を行ってくれます。
case WM_INITDIALOG:
ダイアログボックスの初期化時に発生するメッセージです。
ここでは、エディットボックスの初期時に表示される文字列を設定します。
SetWindowText APIを呼び出し、エディットボックスに文字列を設定します。
case WM_COMMAND:
ダイアログボックスの子ウィンドウ(ダイアログボックスに張り付けられているエディットボックスやプッシュボタン等)から発生したメッセージが届きます。
ダイアログボックスプロシージャーの第3引数であるWPARAMの下位16bitがコントロールのID番号、その上位16bitには通知内容が格納されています。
LOWORDマクロによりWPARAMの下位16bitを取り出し、switchステートメントによりコントロールごとに処理を振り分けます。
case IDC_EDIT1:
エディットボックスのID番号がIDC_EDIT1です。
エディットボックスからのメッセージが届きます。
ここではエディットボックスの入力内容に変化が生じたときに発生するEN_UPDATEメッセージを処理します。
他に以下のようなメッセージがあります。
EN_SETFOCUS フォーカスを取得
EN_KILLFOCUS フォーカスを失った時 
EN_UPDATE 内部のテキストが変更
EN_CHANGE 内部のテキストが変更
EN_HSCROLL 横スクロールバーをクリック
EN_VSCROLL 縦スクロールバーをクリック
EN_MAXTEXT 入力文字制限数に達した時 
HIWORDマクロによりWPARAMの31~16bitの値を取り出し、ifステートメントによりEN_UPDATEの時 GetDlgItemText APIを呼び出し、エディットボックスの文字列を取得します。
SetWindowText APIによりラベルに文字列を設定します。 入力文字数制限のメッセージを受け取るためには、エディットボックスに対して、EM_SETLIMITTEXTメッセージを送付する必要があります。
SendMessage(エディットボックスのハンドル, EM_SETLIMITTEXT, (WPARAM)文字数, 0);
case IDOK:
OKプッシュボタンのID番号がIDOKです。
OKプッシュボタンをクリックするとこのメッセージが発生します。
GetDlgItemText APIを呼び出し、エディットボックスの文字列を取得します。
MessageBox APIを呼び出し、取得した文字列を表示します。
EndDialog APIを呼び出し、ダイアログボックスを終了させます。 このAPIの第2引数は、ダイアログボックスが終了し、DialogBox APIが返す値となります。
case IDCANCEL:
キャンセルプッシュボタンのID番号がIDCANCELKです。
キャンセルプッシュボタンをクリックするとこのメッセージが発生します。
EndDialog APIを呼び出し、ダイアログボックスを終了させます。 このAPIの第2引数は、ダイアログボックスが終了し、DialogBox APIが返す値となります。

resource.h

ダイアログボックスで使用する各コントロールのID値をマクロで定義しています。

resource.rc

ダイアログボックスやコントロールの定義をしています。

プログラムソース

editbox.cpp

//       エディットボックスサンプル
//      Visual C++ 2013 32/64bit
#include <windows.h>
#include <commctrl.h> 
#include <tchar.h>
#include "resource.h"

//      ダイアログボックスプロシージャー
LRESULT CALLBACK DlgProc1(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam);


int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE hPreInst,
                   TCHAR* lpszCmdLine, int nCmdShow){
        DialogBox(hInstance, TEXT("DLG1"), 0, (DLGPROC)DlgProc1);

    return (int)0;
}

//      ダイアログボックスプロシージャー

LRESULT CALLBACK DlgProc1(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam){
        TCHAR buf[32];
    switch (msg) {
        case WM_INITDIALOG:
                        SetWindowText(GetDlgItem(hDlg, IDC_EDIT1), _TEXT("初期値"));
           return TRUE;
        case WM_COMMAND:
            switch (LOWORD(wParam)) {
                                case IDC_EDIT1:
                                        if (HIWORD(wParam) == EN_UPDATE){       //      エディットボックスが変更された場合
                                                GetDlgItemText(hDlg, IDC_EDIT1, (TCHAR*)buf, sizeof(buf) / sizeof(TCHAR));
                                                SetWindowText(GetDlgItem(hDlg, IDC_LABEL1), buf);
                                        }
                                        break;
                                case IDOK:
                                        GetDlgItemText(hDlg,IDC_EDIT1,(TCHAR*)buf, sizeof(buf)/sizeof(TCHAR));
                                        MessageBox(hDlg, buf, _TEXT("エディットボックスの値"),MB_OK);
                                        EndDialog(hDlg, TRUE);
                                        return TRUE;
                                case IDCANCEL:
                                        EndDialog(hDlg,FALSE);
                                        return FALSE;
                                default:
                                        return FALSE;
                        }
                        default:
                                return FALSE;
        }
        return TRUE;
}

resource.h

#define IDC_EDIT1        100
#define IDC_LABEL1      110

resource.rc

#include <windows.h>
#include "resource.h"

DLG1 DIALOG DISCARDABLE  0, 0, 121, 76
STYLE DS_MODALFRAME | WS_POPUP
CAPTION "エディットボックス"
FONT 9, "MS Shell Dlg"
{
        EDITTEXT        IDC_EDIT1, 7, 13, 104, 14, ES_AUTOHSCROLL
        LTEXT                   "" , IDC_LABEL1 ,7,35,140,14
        DEFPUSHBUTTON   "OK", IDOK, 7, 55, 50, 14
        PUSHBUTTON      "キャンセル", IDCANCEL, 64, 55, 50, 14
}

ソースファイルと実行ファイルのダウンロード

ダウンロード editbox.zip(36.8kByte)

ZIPファイルに含まれるファイル
editbox.cpp
editbox.exe
resource.h
resource.rc