Дипломированных специалистов «Информатика и вычислительная техника»



Download 12,06 Mb.
Pdf ko'rish
bet217/357
Sana22.02.2022
Hajmi12,06 Mb.
#115195
TuriДиплом
1   ...   213   214   215   216   217   218   219   220   ...   357
Bog'liq
assembler uchebnik dlya vuzov 2-e izd YuRXUW1

Цикл обработки сообщений
Сообщение в Win32 представляет собой объект особой структуры, формируемый
Windows. Формирование и доставка этого объекта в нужное место в системе по-


Каркасное Windows-приложение на ассемблере 395
зволяют управлять работой как самой системы Windows, так и загруженных
Windows-приложений. Инициировать формирование сообщения могут несколь-
ко источников: пользователь, само приложение, система Windows, другие прило-
жения. Именно наличие механизма сообщений позволяет Windows реализовать
многозадачность, которая при работе на одном процессоре является, конечно же,
псевдомультизадачностью. Windows поддерживает очередь сообщений для каж-
дого приложения. Запуск приложения автоматически подразумевает формирова-
ние для него собственной очереди сообщений, даже если это приложение и не бу-
дет ею пользоваться. Последнее маловероятно, так как в этом случае у приложения
не окажется связи с внешним миром и оно превратится в «вещь в себе».
Формат всех сообщений Windows одинаков и описывается структурой, шаб-
лон которой содержится в файле winuser.h:
/*
* Message structure
*/
typedef struct tagMSG {
message;
LPARAM
DWORD
POINT pt;
} MSG, *PMSG, NEAR
FAR
В этой структуре все типы данных вам знакомы, за исключением одного — POINT.
Этот тип данных описан во включаемом файле
.h и представляет собой струк-
туру вида
typedef struct tagPOINT
{ LONG x;
LONG y;} POINT,
NEAR
FAR
На основе этого описания в файл
помещено эквивалентное описа-
ние этой структуры в соответствии с синтаксисом ассемблера:
POINT struc
x
О
у ULONG
ends
MSG struc
0
mes UINT?
wParam UINT?
IParam UINT?
time dd 0
POINT struc {}
ends
Поле meshwnd структуры MSG содержит значение дескриптора окна, которому
предназначено сообщение.
тот самый дескриптор, который возвращается функ-
цией
wExA и, соответственно, однозначно идентифицирует окно в сис-
теме. Не забывайте, что приложение обычно имеет несколько окон, поэтому зна-
чение в поле meshwnd помогает приложению идентифицировать нужное окно.
В поле mes Windows помещает 32-разрядную константу — идентификатор со-
общения, однозначно идентифицирующий тип сообщения. Для удобства все эти
константы имеют символические имена, начинающиеся с префикса
(Window
Message). Посмотрите, каким образом они определены в файле winuser.h. Во


396 Глава
Создание Windows-приложений на ассемблере
файле для программ на ассемблере
(и нашем варианте этого фай-
ла — windowsA.h) тоже содержатся некоторые из этих констант. Если в ходе работы
вам понадобятся отсутствующие константы, возьмите их из включаемых файлов
компилятора C/C++, исправив описание в соответствии с синтаксисом ассембле-
ра. В программе на языке C/C++ эти константы используются в оконной функ-
ции оператором switch для принятия решения о том, какая из его ветвей будет
исполняться. В оконной функции каркасного Windows-приложения на ассем-
блере (строки 163-232) этот оператор моделируется командами условного
и безусловного переходов (строки 168-174), а также командой
в качестве
второго операнда которой и выступает константа, обозначающая определен-
ный тип сообщения.
Поля
и wParam предназначены для того, чтобы система Windows могла
разместить в них дополнительную информацию о сообщении, необходимую для
его правильной обработки. Эти поля, например, используются при обработке со-
общений о выборе пунктов меню или о нажатии клавиш.
В поле time Windows записывает информацию о времени, когда сообщение было
помещено в очередь сообщений.
И наконец, поле POINT содержит координаты указателя мыши в момент поме-
щения сообщения в очередь.
представим, что в системе произошло какое-то событие, например, неко-
торому приложению необходимо перерисовать свое окно, в результате Чего систе-
ма Windows сформировала сообщение WM_PAINT. Данное сообщение попадает
в очередь сообщений приложения, создавшего окно. Для того чтобы приложение
могло обработать это (или любое другое) сообщение, ему необходимо сначала его
обнаружить в очереди сообщений. С этой целью после отображения окна на экра-
не программа «входит» в специальный цикл, называемый циклом обработки со-
общений (строки
Выйти из этого цикла можно только по приходу сооб-
щения WM_QUIT. В этом случае функция GetMessageA возвращает нулевое значение,
и команда условного перехода в строке 146 передает управление на конец цикла
обработки сообщений. В случае прихода других сообщений функция GetMessageA
возвращает ненулевое значение, в результате чего и осуществляется вход непо-
средственно в тело цикла обработки сообщения. Функции GetMessageA передается
несколько параметров (строки 140-143):
message — указатель на экземпляр структуры MSG (строка 42). Во время работы
функция GetMessageA извлекает сообщение из очереди сообщений приложения
и на основе информации в нем инициализирует поля экземпляра структуры
message. Таким образом, приложение получает полный доступ ко всей инфор-
мации в сообщении, сформированном Windows;

— в поле передается дескриптор окна, сообщения для которого должны
будут выбираться функцией GetMessageA. Параметр позволяет создать своеоб-
разный фильтр, заставляющий функцию GetMessageA выбирать из очереди и пе-
редавать в цикл обработки сообщений сообщения лишь для определенного окна
данного приложения. Если hWnd = NULL, то GetMessageA будет выбирать из оче-
реди сообщения для всех окон;


Каркасное Windows-приложение на ассемблере 397
и
— значения данных параметров также позволяют
создавать фильтр для выбираемых функцией GetMessageA сообщений. Они за-
дают диапазон номеров сообщений (поле
структуры MSG), которые будут
выбираться из очереди функцией GetMessageA и передаваться в цикл обработки
сообщений. Параметр
задает минимальное значение параметра mes,
а параметр wMsgFilterMax, соответственно, максимальное значение.
Функция GetMessageA выполняет следующие действия.
Постоянно просматривает очередь сообщений.
2. Выбирает сообщения, удовлетворяющие заданным в функции параметрам.
3. Заносит информацию о сообщении в экземпляр структуры MSG (строка 42).
4. Передает управление в цикл обработки сообщений.
Цикл обработки сообщений (строки 147-155) состоит всего из двух функций:
TranslateMessage и DispatchMessageA. Эти функции имеют единственный параметр —
указатель на экземпляр структуры MSG, предварительно заполненный информа-
цией о сообщении функцией GetMessageA.
Функция TranslateMessage предназначена для обнаружения сообщений от кла-
виатуры для данного приложения. Если приложение самостоятельно не обраба-
тывает ввод с клавиатуры, то эти сообщения передаются для обработки обратно
Windows.
Функция DispatchMessageA предназначена для передачи сообщения оконной
функции. Такая передача производится не напрямую, так как сама DispatchMessageA
ничего не знает о месторасположении оконной
а косвенно — посредством
системы Windows. Это делается следующим образом:
1. Функция DispatchMessageA возвращает сообщение операционной системе.
2. Windows, используя описание класса окна, передает сообщение нужной окон-
ной функции приложения.
3. После обработки сообщения оконной функцией управление возвращается опе-
рационной системе.
4. Windows передает управление функции DispatchMessageA.
5. DispatchMessageA завершает свое выполнение.
Так как вызов функции DispatchMessageA является последним в цикле, то управ-
ление опять передается функции GetMessageA, которая выбирает очередное сооб-
щение из очереди сообщений и, если оно удовлетворяет параметрам, заданным при
вызове функции, выполняет тело цикла. Цикл обработки сообщений выполняется
до тех пор, пока не приходит сообщение WM_QUIT. Получение этого сообщения —
условие, при котором программа может выйти из цикла обработки
сообщений.

Download 12,06 Mb.

Do'stlaringiz bilan baham:
1   ...   213   214   215   216   217   218   219   220   ...   357




Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©hozir.org 2024
ma'muriyatiga murojaat qiling

kiriting | ro'yxatdan o'tish
    Bosh sahifa
юртда тантана
Боғда битган
Бугун юртда
Эшитганлар жилманглар
Эшитмадим деманглар
битган бодомлар
Yangiariq tumani
qitish marakazi
Raqamli texnologiyalar
ilishida muhokamadan
tasdiqqa tavsiya
tavsiya etilgan
iqtisodiyot kafedrasi
steiermarkischen landesregierung
asarlaringizni yuboring
o'zingizning asarlaringizni
Iltimos faqat
faqat o'zingizning
steierm rkischen
landesregierung fachabteilung
rkischen landesregierung
hamshira loyihasi
loyihasi mavsum
faolyatining oqibatlari
asosiy adabiyotlar
fakulteti ahborot
ahborot havfsizligi
havfsizligi kafedrasi
fanidan bo’yicha
fakulteti iqtisodiyot
boshqaruv fakulteti
chiqarishda boshqaruv
ishlab chiqarishda
iqtisodiyot fakultet
multiservis tarmoqlari
fanidan asosiy
Uzbek fanidan
mavzulari potok
asosidagi multiservis
'aliyyil a'ziym
billahil 'aliyyil
illaa billahil
quvvata illaa
falah' deganida
Kompyuter savodxonligi
bo’yicha mustaqil
'alal falah'
Hayya 'alal
'alas soloh
Hayya 'alas
mavsum boyicha


yuklab olish