- •Int cbClsExtra;
- •Int cbWndExtra;
- •Создание и отображение окна
- •Int nWidth,
- •Int nHeight,
- •Оконная процедура
- •Int winapi MessageBox(
- •6) Дочернее окно может по своему дескриптору Chld получить дескриптор родительского окна при помощи функции:
- •8) При уничтожении родительского окна сообщение wm_destroy также рассылается всем дочерним окнам.
- •Параметры:
- •10) При уничтожении дочернего окна функцией DestroyWindow() родительскому окну тоже передается сообщение wm_destroy.
- •4) После того, как дочернее окно было создано, оно может посылать сообщение wm_command, уведомляющие pодительское окно об изменении своего состояния.
- •7) В программе функция InitStr() объявлена следующим образом:
- •Void InitStr(hwnd hWnd, char *s, int Max, char Sy);
- •Void InitStr(hwnd hWnd,char *s,int Max,char Sy)
- •11) Код функции обработки пароля приведён в листинге:
- •If(IsIconic(hwnd)) ShowWindow(hwnd,sw_restore);
- •If (!RegClass(WndProc,szMainClass,color_desktop))
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;