Ассемблер под Windows №13

Common Controls - теория


Доброго времени суток, уважаемые подписчики.


Во-первых, в связи с кучей писем о рассылке по программированию под DOS, хочу ещё раз заметить, что к ней я не имею никакого отношения, все вопросы, жалобы и пожелания прошу отправлять на admin@RusFAQ.ru. А архив рассылки по программированию под Windows временно находится на LearnAsm.narod.ru ...


Наша сегодняшняя тема Common controls. Давайте рассмотрим, что это вообще такое и зачем оно нужно. Вы наверняка заметили, что приложения в Windows очень часто используют одинаковые элементы, например кнопки, edit box и т.д. Без них работа в Windows практически невозможна. Причём если приложение будет вынуждено само рисовать и обслуживать каждую кнопку, то лишь процедуры обработки, прорисовки и т.д. займут в несколько раз больше места, чем сама программа. Поэтому в целях облегчения работы программиста существуют так называемые Common Controls, в которые входят кнопки, панели scroll, toolbar панели и т.д. Этим Windows берет на себя обработку всех событий объекта, а нам лишь посылает сообщения. В принципе мы уже использовали Common Controls в примере диалога, однако в диалоге, являющемся объектом ресурсов, все параметры заданы сразу и нет возможности их изменять, что лишает программу гибкости. Большинство Common Controls создаются функцией CreateWindowEx с определенным именем класса:

Common ControlИмя класса
Header ControlWC_HEADER
Progress BarPROGRESS_CLASS
Rich EditRichEdit
List BoxListBox
ButtonButton
...

Сегодня мы разберём объект "Button", а в следующем уроке закрепим эти знания на практике. Итак, Button, как и большинство Common control, создаваемых функцией CreateWindowEx, обычно создаются с двумя флагами стиля, WS_BORDER и WS_CHILD. Первый показывает, что объект будет иметь видимые границы, второй - что он будет находиться внутри главного окна. Также при создании Common Control - а надо дать ему уникальный, в пределах программы, индекс (Тоже самое мы делали в диалоге, каждая кнопка имела собственный индекс). При каком либо событии мы получаем его вместе с WM_COMMAND. Объект BUTTON имеет следующие сообщения-уведомления (Notification message, сообщения, которые посылаются окну родителю, уведомляя его о чём-либо):

СообщениеКодУсловие
BN_CLICKED0Кнопка была нажата.
BN_PAINT1Кнопку нужно перерисовать.
BN_PUSHED2Кнопка была нажата (но не была отпущена).
BN_UNPUSHED3Кнопка была отпущена (после нажатия).
BN_DISABLE4Копка была отключена.
BN_DBLCLK5Кнопка была нажата дважды (double click).
BN_SETFOCUS6Кнопка была выделена.
BN_KILLFOCUS7Кнопка перестала быть выделеной.

При выполнении любого из вышеописанных условий окно-родитель получает следующее сообщение:

uMsg = WM_COMMAND
wParam старшее слово (биты 31-16) = сообщение
wParam младшее слово (биты 15-0) = индекс кнопки
lParam = Handle кнопки

А для контроля кнопке, помимо основных сообщений, обрабатываемых всеми окнами, ей могут быть посланы следующие сообщения:
СообщениеКодДействие
BM_SETSTYLE0F4hИзменяет стиль кнопки.
BM_CLICK0F5hНажимает кнопку.
BM_GETIMAGE0F6hЕсли кнопка использует картинку, то это сообщение вернёт handle картинки.
BM_SETIMAGE0F7hАссоциирует картинку с кнопкой, возвращает handle предыдущей картинки.

Вот в принципе и всё, что нужно о ней знать.


На сегодня это всё. Если есть какие вопросы, пишите, обязательно отвечу. В следующем уроке рассмотрим использование кнопок на практике .Пишите, Dark_Lord@RusFAQ.ru, Dark_Lord@land.ru.

Сайт управляется системой uCoz