如何创建单行编辑控件
本主题演示如何创建一个包含单行编辑控件的对话框。
单行编辑控件具有 ES_PASSWORD 样式。 默认情况下,使用此样式的编辑控件会在用户输入的每个字符上显示一个星号。 但是,本示例使用 EM_SETPASSWORDCHAR 消息将默认字符从星号改为加号 (+)。 下面的屏幕截图显示了用户输入密码后的对话框。
注意
Comctl32.dll 版本 6 不可再发行。 要使用 Comctl32.dll 版本 6,请在清单中指定它。 有关清单的详细信息,请参阅启用视觉样式。
需要了解的事项
技术
先决条件
- C/C++
- Windows 用户界面编程
说明
步骤 1:创建密码对话框实例。
以下代码示例使用 DialogBox 函数创建模式对话框。 对话框模板 IDD_PASSWORD 将作为参数进行传递。 除其他外,它还定义了密码对话框的窗口样式、按钮和尺寸。
DialogBox(hInst, // application instance
MAKEINTRESOURCE(IDD_PASSWORD), // dialog box resource
hWnd, // owner window
PasswordProc // dialog box window procedure
);
步骤 2:初始化对话框并处理用户输入。
以下示例中的窗口程序将初始化密码对话框,并处理通知消息和用户输入。
在初始化过程中,窗口程序会将默认密码字符更改为 + 符号,并将默认按钮设置为 Cancel。
在处理用户输入时,只要用户在编辑控件中输入文本,窗口程序就会将默认按钮从 CANCEL 更改为 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);
}
相关主题