int nIDDlgltem, //идентификатор дочернего окна. LPTSTR IpString. //адрес буфера для получения текста, int nMaxCount //длина буфера. ): Эта функция использует сообщение WM_GETTEXT для получения связанного с дочерним окном текста. Для кнопки связанным текстом будет ее название, для окон класса stati с и edi t это будет показанная в окне строка текста. Предположим, что, как и в предыдущем примере, пароль состоит из 6 символов. Мы не можем организовать получение пароля по коду извещения ENMAXTEXT, так как этот код посылается при вводе лишнего, седьмого символа, причем сам избыточный символ родительскому окну не будет передан. Поэтому следует подсчитывать в переменной сС количество введенных символов, используя извещение EN_CHANGE, а после ввода шестого символа обработать пароль. Чтобы прервать ожидание ввода седьмого символа, нужно послать элементу edit после обработки пароля еще один символ и, получив извещение EN_MAXTEXT, уничтожить дочернее окно. Этот процесс иллюстрируется кодом, приведенным в листинге 6.15.
Листинг 6.15
void OnChldCHWND hWnd.UINT message.WPARAM wParam.LPARAM IParam) {
static int cOO; int г - HIWORD(wParam): if(r-EN_CHANGE && (++cC>=6)) {
//Введен последний символ пароля
GetDlgItemTextChWnd.NumC.Password.7); //Получаем текст строки if(strcmp(PassWord."Пароль"))
MessageBox(hWnd."Haflo вспомнить правильный пароль"."Скажи\"Пароль\"".0); else MessageBox(hWnd. " Пароль принят"."".0); //Имитируем ввод седьмой буквы.
PostMessage(GetDlgItem(hWnd.L0W0RD(wParam)).WM_CHAR.65.0); }
if (г-EN_MAXTEXT) {
DestroyWindow(GetDlgltem(hWnd.LOWORD(wParam))); return; }
if(r-EN_KILLF0CUS) { cC - 0;return;} }
Запуск проекта позволяет убедиться в том, что после ввода шестого символа немедленно (не ожидая нажатия Enter) выводится сообщение о результате обработки пароля. Чтобы пользователь не узнал длины пароля, строку следует обрабатывать по нажатии клавиши Enter. Но элемент управления класса edit не посылает при нажатии этой клавиши никакого извещения и не помещает ее код в строку