Операционная система Windows 95 для программиста



    d8ef8794     

Обработка 32-разрядных сообщений


В приложениях Win16 параметр lParam часто использовался для передачи сразу двух значений, соответственно, через младшее и старшее слово. Для удобства выделения этих значений предназначались специальные макрокоманды LOWORD и HIWORD .

Например, для сообщения WM_COMMAND в младшем слове параметра lParam передавался 16-разрядный идентификатор дочернего окна hWnd (органа управления, пославшего это сообщение), в старшем - 16-разрядный код извещения wCmd. Через параметр wParam передавался 16-разрядный идентификатор органа управления wId (рис. 1.14).

Рис. 1.14. Формат параметров wParam и lParam для сообщения WM_COMMAND в приложениях Win16

В приложениях Win32 идентификатор окна hWnd стал 32-разрядным, поэтому его никак нельзя разместить в старшем слове параметра lParam. Теперь приходится отводить для идентификатора окна все разряды параметра lParam.

А что делать с кодом извещения wCmd, который оказался "выселен" из хорошо обжитого им параметра lParam?

Его пришлось перенести в старшее слово параметра wParam, удвоившего свою разрядность (рис. 1.15).

Рис. 1.15. Формат параметров wParam и lParam для сообщения WM_COMMAND в приложениях Win32

Таким образом, идентификатор окна остался на месте, а код извещения "переехал" в старшее слово параметра wParam. Аналогичным образом изменился формат и других сообщений.

Приведем два фрагмента обработчика сообщения WM_COMMAND, первый из которых используется в приложениях Win16, а второй - в приложениях Win32.

Итак, первый фрагмент.

case WM_COMMAND: { wId = wParam; hWnd = LOWORD(lParam); nCmd = HIWORD(lParam); ... }

Приложения Win32 должны разбирать сообщение WM_COMMAND на составные части по-другому:

case WM_COMMAND: { wId = LOWORD(wParam); hWnd = (HWND)(UINT)lParam; nCmd = HIWORD(wParam); ... }

В файле windowsx.h определены макрокоманды разборки сообщений (message crackers), которые позволяют "извлечь" из сообщений отдельные параметры.

Приведем для примера определения макрокоманд разборки сообщения WM_COMMAND из файла windowsx.h:




Содержание  Назад  Вперед