Win32 в машинных кодах


Сообщения Windows - часть 6


Дальше следует безусловный переход на начало цикла. Однако, мы добавили 11 новых байтов, поэтому смещение будет теперь не -19, а -30 (или E2h). Поэтому конец файла должен выглядеть так:

; возврат на "цикл" (-30 байтов) db eb e2

m 0 l 200 100 w q

Файлы header.txt и make.bat не изменились. Строим очередную версию wnd.exe.

Вот это другое дело! Теперь окно выглядит так, как оно должно было выглядеть - это одна большая кнопка! Причем реагирует на щелчки мышью! А само окно можно перемещать, изменять его размеры, сворачивать, разворачивать и даже закрывать! Правда, в последнем случае не спешите радоваться - окно-то вы закрыли, но приложение осталось работать (оно все еще крутится в цикле обработки сообщений). Убедиться в этом несложно, заглянув в менеджер задач (нажав Ctrl-Alt-Del) - вы увидите выполняющуюся задачу 'wnd' (если файл не был переименован). Ее снова придется "прибивать" отсюда. Это происходит потому, что класс окна "BUTTON", как уже говорилось, не предназначен для создания самостоятельных окон. При закрытии главного окна приложения в цикл сообщений посылается соответствующее уведомление о завершении приложения; в нашем случае этого не происходит. К тому же наш цикл вообще не предусматривает возможности выхода из него - в дальнейшем мы реализуем и такую возможность.

Чтобы рассмотреть еще одну функцию, использующуюся в цикле сообщений, изменим класс нашего окна на "EDIT". Для этого в файле 'data.txt' просто поменяем строку "BUTTON" на "EDIT". И все! Снова строим wnd.exe, запустив make.bat.

И какая разительная перемена! Поэкспериментируйте с этим приложением сами. В качестве подсказки: воспользуйтесь контекстным меню, щелкнув в окне правой клавишей мыши; а для копирования текста в буфер можно воспользоваться Блокнотом.

Я думаю, вы уже заметили особенность нового окна: хотя можно пользоваться командами редактирования текста из всплывающего меню и двигать текстовый курсор с помощью стрелок, набрать текст на клавиатуре не удается. Это происходит потому, что окно получает лишь сообщения о нажатиях клавиш, но они не преобразуются в сообщения о поступлении соответствующих символов. Как раз для решения этой задачи и служит последняя функция - TranslateMessage, тоже из модуля User32.dll. Эта функция принимает один параметр - конечно же, опять все тот же адрес структуры MSG, и помещается в цикл обработки сообщений как раз перед вызовом функции DispatchMessageA.




Начало  Назад  Вперед



Книжный магазин