山本ワールド
Windowsプログラミング
アルゴリズム Vitual C++ 2008/2013によるWin32/Win64 APIレベルのプログラム 基礎 Vitual C++ 2008/2013によるAPIレベルのプログラム(32/64bit) Wix3でインストーラーを作る Visual C++ 2008 Standard Editonによるフォームアプリケーションのプログラム(32/64bit) Vitual C++ 2008 Standard EditonによるAPIレベルのプログラム(32/64bit) Windows 7対応 Visual C++ 2008 ExpressによるAPIレベルのプログラム Visual C++ 2005 ExpressによるAPIレベルのプログラム Visual C++ Versiosn 5 BORLAND C++ Windowsプログラム全般 Excel VBA その他エディットボックス
概要
エディットボックスのサンプルです。
エディットボックスに入力された文字がリアルタイムにラベルに反映されます。
OKボタンをクリックするとメッセージボックスにエディットボックスの内容を表示し、メッセージボックスのOKをクリックするとプログラムが終了します。
キャンセルボタンをクリックするとプログラムが終了します。
ダイアログボックスはリソースファイル(resource.rc)で定義しています。
エディットボックスは、ダイアログボックスの子ウィンドウです。
エディットボックスの属性はリソースファイルで定義しております。
エディットボックスに入力された文字がリアルタイムにラベルに反映されます。
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/64bitVisual C++ 2013 Express 32/64bit
実行環境
Windows 8.1 Enterprise 64bitWindows 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
}
ソースファイルと実行ファイルのダウンロード
Copyright (C) 2012 山本ワールド All Rights Reserved.