Como criar um controle de edição de linha única
Este tópico demonstra como criar uma caixa de diálogo que contém um controle de edição de linha única.
O controle de edição de linha única tem o estilo ES_PASSWORD. Por padrão, os controles de edição com esse estilo exibem um asterisco para cada caractere digitado pelo usuário. Este exemplo, no entanto, usa a mensagem EM_SETPASSWORDCHAR para alterar o caractere padrão de um asterisco para um sinal de adição (+). A captura de tela a seguir mostra a caixa de diálogo depois que o usuário digitou uma senha.
Observação
Comctl32.dll versão 6 não é redistribuível. Para usar Comctl32.dll versão 6, especifique-a em um manifesto. Para obter mais informações sobre manifestos, consulte Habilitando estilos visuais.
O que você precisa saber
Tecnologias
Pré-requisitos
- C/C++
- Programação da interface do usuário do Windows
Instruções
Etapa 1: Criar uma instância da caixa de diálogo de senha.
O exemplo de código C++ a seguir usa a função DialogBox para criar uma caixa de diálogo modal. O modelo de caixa de diálogo IDD_PASSWORD é passado como um parâmetro. Ele define, entre outras coisas, os estilos de janela, botões e dimensões da caixa de diálogo de senha.
DialogBox(hInst, // application instance
MAKEINTRESOURCE(IDD_PASSWORD), // dialog box resource
hWnd, // owner window
PasswordProc // dialog box window procedure
);
Etapa 2: inicializar a caixa de diálogo e processar a entrada do usuário.
O procedimento de janela no exemplo a seguir inicializa a caixa de diálogo de senha e processa mensagens de notificação e entrada do usuário.
Durante a inicialização, o procedimento de janela altera o caractere de senha padrão para um + sinal e define o botão padrão como Cancelar.
Durante o processamento de entrada do usuário, o procedimento de janela altera o botão padrão de CANCEL para OK assim que o usuário insere texto no controle de edição. Se o usuário pressionar o botão OK, o procedimento de janela usará as mensagens EM_LINELENGTH e EM_GETLINE para recuperar o texto.
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);
}
Tópicos relacionados