Окна в Windows.
Пользовательская программа может создавать окна (windows) для комуникации с пользователем, получения сообщений от системы или от другой программы.
Окна имеют древовидную структуру т.е каждое окно может содержать "дочерние" (child) окна.
Свойства окна зависят от многих параметров: Класса, стиля и т.д.
Для просмотра дерева созданых окон, можно использовать программу Windows Explorer
Для создания окна обычно используется функция CreateWindowExA, имеющая следующие параметры:
#
Описание
1
Дополнительный стиль (константы WS_EX_)
2
Имя или номер класса (см.ниже)
3
Текст окна
4
Стиль (константы WS_)
5
X - позиция
6
Y - позиция
7
Размер по X
8
Размер по Y
9
Хэндл "parent'а"
10
Хэндл меню, или ID
11
Хэндл модуля, создающего окно
12
Параметр, передаваемый сообщению WM_CREATE
Координаты X и Y отсчитываютя от левого верхнего угла parent'а.
Хэндл окна действителен во всех запущенных процессах.
-------------------------------
Класс (Class)
Класс обычно создается функцией RegisterClassExA. Единственный параметр - указатель на структуру WNDCLASSEX. При создании окна нужно указать класс, к которому оно будет принадлежать. От класса зависит большая часть свойств окна.
Структура WNDCLASSEX определена следующим образом:
name
offset
Описание
cbSize
0
размер структуры (в байтах) - 30h
style
4
Стиль класса (константы CS_)
lpfnWndProc
8
Адрес процедуры обработки сообщений
cbClsExtra
0Сh
Количество дополнительной памяти, выделяемое классу
cbWndExtra
10h
Количество дополнительной памяти, выделяемое каждому окну класса
hInstance
14h
Хэндл модуля, создающего класс
hIcon
18h
Хэндл иконки класса
hCursor
1Ch
Хэндл курсора класса
hbrBackground
20h
Хэндл кисти фона класса (может быть константы COLOR_)
lpszMenuName
24h
Имя/номер меню класса
lpszClassName
28h
Имя/номер класса
hIconSm
2Ch
Хэндл маленькой иконки класса
-------------------------------
Сообщения (Message)
Каждому потоку (thread - у нас пока один - основной) программы, Windows посылает сообщения. Большая часть из них посылается когда пользователь совершает какие-либо действия над окнами потока. Некоторые сообщения посылаютя при событиях системы (например, завершение Windows).
Основная часть сообщений обозначается константами WM_
Сообщения выстраиваются в очередь (message queue). Для реагирования на сообщения программа должна организовать цикл - (Message Loop) - считывающий сообщение из очереди, и передающий его процедурам обработки сообщений окон.
Стандартный цикл обработки сообщений выглядит следующим образом:
Процедура обработки сообщений окна (WindowProc)
Процедура обработки сообщений дает возможность реагировать на сообщения, посылаемые окну.
Указывается при регистрации класса.
Так выглядит "пустая" процедура :
WindowProc proc hwnd:dword,uMsg:dword,wParam:dword,lParam:dword
cmp [uMsg],WM_DESTROY
jnz NotWmDestroy
call PostQuitMessage,0
xor eax,eax
ret
NotWmDestroy:
call DefWindowProcA,[hwnd],[uMsg],[wParam],[lParam]
ret
WindowProc endp
Данная процедура обрабатывает сообщение WM_DESTROY, возвращая 0
Все остальные сообщения передаются стандартному обработчику, возвращая значение, которое он установит.
WindowProc - процедура соглашения stdcall, имеет 4 входных параметра:
hwnd - хэндл окна, которому адресовано сообщение
uMsg - Код сообщения
wParam и lParam - дополнительная информация о сообщении (специфична для каждого кода)
Значение (зависит от кода сообщения) возвращает через регистр eax.
-------------------------------
Пример
Ниже приведен пример программы, создающей окно. В процедуру обработки сообщений добавлена обработка WM_CLOSE в качестве примера.
Внимание! Файл windows.inc в пакете с компилятором нужно использовать осторожно, т.к он для Win16.
Константы, используемые в данном примере включены в исходный код.
Для дальнейшего написания программ под Windows, вам понадобится файл c описанием консатнт под Win32, его легко можно найти в сети.
Содержание дальнейших выпусков зависит от вас. Будут разъясняться те темы, которые непонятны большинству читателей. Сайт рассылки: asm32.nm.ru. Присылайте свои вопросы и предложения по адресу: asm32@nm.ru . -------------------------------
Автор рассылки Владимир Пронин. Любое коммерческое использование материалов рассылки без ведома и прямого согласия автора запрещено.
Письма присланные автору рассылки могут быть опубликованы целиком или частично без предварительного уведомления. Если вы не хотите, чтобы ваше письмо было опубликовано укажите это в начале письма.
Перепечатка материалов разрешена только с непосредственной ссылкой на asm32.nm.ru