Using Single-Line Edit Controls

The example in this section demonstrates how to use a window procedure to produce a dialog box that prompts the user to enter a password.

The single-line edit control in the Password dialog box has the ES_PASSWORD style. By default, edit controls with this style display an asterisk for each character the user types. This example, however, uses the EM_SETPASSWORDCHAR message to change the default character from an asterisk to a plus sign (+).

This window procedure changes the default push button from Cancel to OK as soon as the user enters text in the edit control. If the user presses the OK button, the window procedure uses the EM_LINELENGTH and EM_GETLINE messages to retrieve the text.

LRESULT CALLBACK PassProc(hDlg, message, wParam, lParam)

HWND hDlg; /* window handle of the dialog box */

UINT message; /* type of message */

UINT wParam; /* message-specific information */

LONG lParam;

{

CHAR 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,

"Too many characters.",

"Error",

MB_OK);

EndDialog(hDlg, TRUE);

return FALSE;

}

else if (cchPassword == 0) {

MessageBox(hDlg,

"No characters entered.",

"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,

"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);

}