Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Lektsia_3_slaydy_2012.doc
Скачиваний:
5
Добавлен:
18.08.2019
Размер:
376.32 Кб
Скачать

7) В программе функция InitStr() объявлена следующим образом:

Void InitStr(hwnd hWnd, char *s, int Max, char Sy);

Эта функция записывает в статические переменные char* S и int Max адрес и размер буфера Password, полученные в качестве параметров.

8) После этого функция создает дочернее окно и переводит на него фокус ввода:

Void InitStr(hwnd hWnd,char *s,int Max,char Sy)

{

Str=s; //Записываются адрес и длина строки

sMax=Max;

for (int k=0; k<21;k++) Sym[k]=Sy; //Запись в Sym символов-заполнителей

Sym[k]=0;

//В строку записан только 21 символ. Будем считать, что если

//пользователь пытается вводить такой длинный пароль, окно

//следует уничтожить и прекратить ввод, не дожидаясь нажатия

// клавиши Enter.

CreateChild(hWnd.);

//Создаётся дочернее окно и на него переводится фокус ввода.

9) После этого ввод с клавиатуры поступает не в основное, а в дочернее окно. Оконная функция дочернего окна ChldWndProc() при помощи сообщений WM_CHAR получает вводимые символы и выполняет их обработку. Функция записывает символы в буфер Password при помощи указателя Str.

При окончании ввода пароля, активизируется кнопка Enter. Таким образом, при получении символьного кода виртуальной клавиши Enter или при вводе пароля, который состоит более чем из 21-го символа в оконной процедуре дочернего окна ChldWndProc() вызывается функция PostMessage(), которая пересылает в родительское окно сообщение WM_COMMAND, извещающее о завершении ввода.

Общее количество введенных символов подсчитывается в переменной i. Если оно равно длине пароля, то в поле HIWORD(wParam) сообщения WM_CОMMAND записывается ноль, в противном случае в HIWORD(wParam) формируется ненулевой код извещения.

Функция PostMessage помещает сообщение в очередь сообщений, связанную с потоком, который создал заданное окно и возвращает значение без ожидания потока, который обрабатывает сообщение.

BOOL PostMessage(

HWND hWnd,

UINT Msg,

WPARAM wParam,

LPARAM lParam

);

Если вводимый символ не является символьным кодом виртуальной клавиши Enter и количество введённых символов меньше 21, то оконная функция ChldWndProc дочернего окна записывает символы в буфер Password при помощи указателя Str.

После этого выполняется функция InvalidateRect() для порождения сообщения WM_PAINT, которое придет в дочернее окно и обновит отображаемую в нем строку.

10) Основное окно получает сообщение WM_CОMMAND и по значению идентификатора в LОWОRD(wParam) определяет, что оно пришло не от меню, а от дочернего окна, и вызывает функцию обработки пароля OnChild(), передавая ей в качестве второго параметра код извещения. Соответствующий фрагмент кода приведен в листинге:

case WM_COMMAND:

wmId = LOWORD(wParam);

wmEvent = HIWORD(wParam);

// Parse the menu selections:

switch (wmId)

{

case IDM_EXIT:

DestroyWindow(hWnd);

break;

case NumC:

OnChld(hWnd,message,HIWORD(wParam),lParam); // Обработка пароля

break;

default:

return DefWindowProc(hWnd, message, wParam, lParam);

}

break;

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]