単一行編集コントロールを作成する方法
このトピックでは、1 行の編集コントロールを含むダイアログ ボックスを作成する方法について説明します。
1 行の編集コントロールには、ES_PASSWORD スタイルがあります。 既定では、このスタイルの編集コントロールには、ユーザーが入力した各文字のアスタリスクが表示されます。 ただし、この例では、EM_SETPASSWORDCHAR メッセージを使用して、既定の文字をアスタリスクからプラス記号 (+) に変更します。 次のスクリーン ショットは、ユーザーがパスワードを入力した後のダイアログ ボックスを示しています。
Note
Comctl32.dll バージョン 6 は再頒布可能パッケージではありません。 Comctl32.dll バージョン 6 を使用するには、マニフェストで指定します。 マニフェストの詳細については、「ビジュアル スタイルを有効にする」を参照してください。
知っておくべきこと
テクノロジ
前提条件
- C/C++
- Windows ユーザー インターフェイス プログラミング
手順
手順 1: パスワード ダイアログ ボックスのインスタンスを作成します。
次の C++ コード例では、DialogBox 関数を使用してモーダル ダイアログ ボックスを作成します。 ダイアログ ボックス テンプレート IDD_PASSWORD はパラメーターとして渡されます。 特に、パスワード ダイアログ ボックスのウィンドウ スタイル、ボタン、および寸法が定義されます。
DialogBox(hInst, // application instance
MAKEINTRESOURCE(IDD_PASSWORD), // dialog box resource
hWnd, // owner window
PasswordProc // dialog box window procedure
);
手順 2: ダイアログ ボックスを初期化し、ユーザーによる入力を処理します。
次の例のウィンドウ プロシージャは、パスワード ダイアログ ボックスを初期化し、通知メッセージとユーザーによる入力を処理します。
初期化時に、ウィンドウ プロシージャは既定のパスワード文字を + 記号に変更し、既定のプッシュボタンを [キャンセル] に設定します。
ユーザーによる入力の処理中に、ユーザーが編集コントロールにテキストを入力するとすぐに、ウィンドウ プロシージャによって既定のプッシュ ボタンが [キャンセル] から [OK] に変わります。 ユーザーが [OK] ボタンを押すと、ウィンドウ プロシージャは EM_LINELENGTH および EM_GETLINE メッセージを使用して、テキストを取得します。
INT_PTR CALLBACK PasswordProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
TCHAR lpszPassword[16];
WORD cchPassword;
switch (message)
{
case WM_INITDIALOG:
// Set password character to a plus sign (+)
SendDlgItemMessage(hDlg,
IDE_PASSWORDEDIT,
EM_SETPASSWORDCHAR,
(WPARAM) '+',
(LPARAM) 0);
// Set the default push button to "Cancel."
SendMessage(hDlg,
DM_SETDEFID,
(WPARAM) IDCANCEL,
(LPARAM) 0);
return TRUE;
case WM_COMMAND:
// Set the default push button to "OK" when the user enters text.
if(HIWORD (wParam) == EN_CHANGE &&
LOWORD(wParam) == IDE_PASSWORDEDIT)
{
SendMessage(hDlg,
DM_SETDEFID,
(WPARAM) IDOK,
(LPARAM) 0);
}
switch(wParam)
{
case IDOK:
// Get number of characters.
cchPassword = (WORD) SendDlgItemMessage(hDlg,
IDE_PASSWORDEDIT,
EM_LINELENGTH,
(WPARAM) 0,
(LPARAM) 0);
if (cchPassword >= 16)
{
MessageBox(hDlg,
L"Too many characters.",
L"Error",
MB_OK);
EndDialog(hDlg, TRUE);
return FALSE;
}
else if (cchPassword == 0)
{
MessageBox(hDlg,
L"No characters entered.",
L"Error",
MB_OK);
EndDialog(hDlg, TRUE);
return FALSE;
}
// Put the number of characters into first word of buffer.
*((LPWORD)lpszPassword) = cchPassword;
// Get the characters.
SendDlgItemMessage(hDlg,
IDE_PASSWORDEDIT,
EM_GETLINE,
(WPARAM) 0, // line 0
(LPARAM) lpszPassword);
// Null-terminate the string.
lpszPassword[cchPassword] = 0;
MessageBox(hDlg,
lpszPassword,
L"Did it work?",
MB_OK);
// Call a local password-parsing function.
ParsePassword(lpszPassword);
EndDialog(hDlg, TRUE);
return TRUE;
case IDCANCEL:
EndDialog(hDlg, TRUE);
return TRUE;
}
return 0;
}
return FALSE;
UNREFERENCED_PARAMETER(lParam);
}
関連トピック