Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Programming_Windows_95_Part_I.pdf
Скачиваний:
96
Добавлен:
05.06.2014
Размер:
4.61 Mб
Скачать

390

инструкции CLASS. Когда в предыдущих шаблонах окон диалога эта инструкция не использовалась, Windows регистрировала класс окна диалога и использовала собственную оконную процедуру для обработки сообщений окна диалога. Включение в шаблон диалога инструкции CLASS сообщает Windows о необходимости отправлять сообщения куда-то в другое место, а точнее в оконную процедуру, заданную в классе окна "HexCalc".

Класс окна "HexCalc" регистрируется в функции WinMain программы HEXCALC точно также, как регистрируется класс обычного окна. Однако, обратите внимание на следующее очень важное отличие: поле cbWndExtra структуры WNDCLASS устанавливается в значение DLGWINDOWEXTRA. Это существенно для тех процедур диалога, которые регистрируются в приложении.

После регистрации класса окна, WinMain вызывает функцию CreateDialog:

hwnd = CreateDialog(hInstance, szAppName, 0, NULL);

Второй параметр (строка "HexCalc") является именем шаблона окна диалога. Третий параметр, который обычно является описателем родительского окна, устанавливается в 0, поскольку в нашем случае родительское окно отсутствует. Последний параметр, который обячно является адресом процедуры диалога, в нашем случае не требуется, поскольку Windows не обрабатывает сообщений и, следовательно, не может отправить их в процедуру диалога.

Вызов такой функции CreateDialog вместе с шаблоном окна диалога преобразуются операционной системой Windows именно в вызов функции CreateWindow, которая выглядит следующим образом:

hwnd = CreateWindow("HexCalc", "Hex Calculator",

WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX, CW_USEDEFAULT, CW_USEDEFAULT,

102 * 4 / cxChar, 122 * 8 / cyChar, NULL, NULL, hInstance, NULL);

Переменные cxChar и cyChar являются высотой и шириной символа системного шрифта.

Мы извлекли колоссальную выгоду, позволив Windows создать такой вызов функции CreateWindow: Windows не ограничится созданием одного всплывающего окна, она также будет вызывать функцию CreateWindow для создания всех 29 дочерних окон управления, которыми являются кнопки, определенные в шаблоне окна диалога. Все эти окна управления посылают оконной процедуре родительского окна, которая является ничем иным как функцией WndProc, сообщения WM_COMMAND. Это превосходный способ создания такого окна, в котором должно содержаться множество дочерних окон.

Творческое использование идентификаторов дочерних окон элементов управления

В программе HEXCALC нет заголовочного файла с идентификаторами всех дочерних окон управления, определенных в шаблоне окна диалога. Обойтись без этого файла можно, поскольку идентификационным номером каждой из кнопок установлен код ASCII того текста, который появляется на кнопке при ее выводе на экран. Это означает, что WndProc может обращаться с сообщениями WM_COMMAND и WM_CHAR почти одинаково. В каждом случае параметр wParam является кодом ASCII текста кнопки.

Конечно, небольшая модификация сообщений от клавиатуры все же необходима. WndProc обрабатывает сообщения WM_KEYDOWN таким образом, чтобы преобразовать клавишу "стрелка влево" в клавишу <Backspace>. При обработке сообщений WM_CHAR WndProc преобразует код символов к верхнему регистру, а

клавишу <Enter> к ASCII-коду клавиши <Equals>.

Правильность сообщений WM_CHAR контролируется с помощью вызова функции GetDlgItem. Если возвращаемым значением функции является 0, то значит символ клавиатуры не является одним из идентификаторов, определенных в шаблоне окна диалога. Однако, если символ один из этих идентификаторов, то соответствующей кнопке посылается пара сообщений BM_SETSTATE, так, что она в момент нажатия "залипает":

hButton =(GetDlgItem(hwnd, wParam); if(hButton != NULL)

{

SendMessage(hButton, BM_SETSTATE, 1, 0); SendMessage(hButton, BM_SETSTATE, 0, 0);

}

Это с минимальными усилиями делает более привлекательным процесс нажатия клавиш в интерфейсе программы

HEXCALC.

Когда WndProc обрабатывает сообщения WM_COMMAND, она всегда помещает фокус ввода в родительское окно:

case WM_COMMAND:

Соседние файлы в предмете Операционные системы