Создание элемента управления "Изменение одной строки"
В этом разделе показано, как создать диалоговое окно, содержащее элемент управления редактирования с одной строкой.
Элемент управления редактирования в одной строке имеет стиль ES_PASSWORD . По умолчанию элементы управления редактирования с помощью этого стиля отображают звездочку для каждого символа, введенного пользователем. В этом примере используется сообщение EM_SETPASSWORDCHAR для изменения символа по умолчанию со звездочки на знак плюса (+). На следующем снимке экрана показано диалоговое окно после ввода пароля пользователем.
Примечание.
Comctl32.dll версии 6 не распространяется. Чтобы использовать Comctl32.dll версии 6, укажите его в манифесте. Дополнительные сведения о манифестах см. в разделе "Включение визуальных стилей".
Это важно знать
Технологии
Необходимые компоненты
- C/C++
- Программирование пользовательского интерфейса Windows
Instructions
Шаг 1. Создание экземпляра диалогового окна пароля.
В следующем примере кода C++ функция DialogBox используется для создания модального диалогового окна. Шаблон диалогового окна IDD_PASSWORD передается в качестве параметра. Он определяет, помимо прочего, стили окон, кнопки и измерения диалогового окна паролей.
DialogBox(hInst, // application instance
MAKEINTRESOURCE(IDD_PASSWORD), // dialog box resource
hWnd, // owner window
PasswordProc // dialog box window procedure
);
Шаг 2. Инициализация диалогового окна и обработка ввода пользователем.
Процедура окна в следующем примере инициализирует диалоговое окно пароля и обрабатывает сообщения уведомления и входные данные пользователя.
Во время инициализации процедура окна изменяет символ пароля по умолчанию на + знак и задает для pushbutton по умолчанию значение Cancel.
Во время обработки ввода пользователем процедура окна изменяет кнопку нажатия по умолчанию с отмены на ОК , как только пользователь вводит текст в элементе управления редактирования. Если пользователь нажимает кнопку "ОК", процедура окна использует 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);
}
См. также