Посылать окну, естественно, можно только те сообщения, для которых в нем предусмотрена обработка.
Для класса Edit в файле Winuser.h определены следующие константы:
#define EM_GETSEL ОхООВО #define EMJETSEL OxOOBl #define EM_GETLINE 0x00C4 #define EM_LIMITTEXT 0x00C5 #define EMJETPASSWORDCHAR OxOOCC
Наличие константы EM_SETPASSWORDCHAR еще раз подтверждает, что разработчик операционной системы кроме обычного ввода строки с эхо-отображением предусмотрел также решение рассмотренной выше задачи ввода пароля. Можно даже сказать, что наличие стандартного средства позволит решить задачу ввода пароля, написав всего несколько операторов и затратив пятнадцать минут времени. Для проверки этого оптимистичного утверждения нужно перенести файлы проекта ChildWindow в папку Password2 и внести необходимые изменения. Код модуля ReadStr.cpp приведен в листинге 6.14.
Листинг 6.14
#include <windows.h> #include <stdio.h> #include "Main.h" #include "Resource.h" HWND Chld:
static char *Str - NULL: static int sMax; static char *Sym; static int i-0:
void InitStr(HWND hWnd.char *s.int Max.char Sy-'*') {
i f(Chld) DestroyWindow(Chld):
//При создании окна класса edit нужно при помощи флага ES_PASSWORD указать.
//что оно предназначено для ввода пароля.
Chld - CreateWindowExC WS_EX_DLGMODALFRAME."edit".NULL.
WS_BORDERIWS_CHILD|WS_VISIBLE|ES_LEFT|ES_PASSWORD.10.60.100.22.
hWnd. (HMENU)NumC.GetModuleHandle(NULL).NULL): SetFocus(Chld):
//Созданному окну передается символ-заполнитель Sy SendMessage(Chid.EMJETPASSWORDCHAR.(WPARAM)Sy.0); SendMessage(Chld.EM_LIMITTEXT.(WPARAM)Max.O); //длина пароля в символах
Элемент управления Edit
//После ввода Мах символов элемент управления перешлет родительскому окну
//код извещения EN_MAXTEXT.
}
В модуле WndProc.cpp оконную процедуру InputWndProcO можно оставить без изменения, а обработку пароля OnChld() можно реализовать, используя для получения введенного пароля следующую функцию:
UINT GetDlgltemTextC
HWND hDlg. //дескриптор родительского окна,