Главная » Win32 API » РАБОТА С ЭЛЕМЕНТАМИ УПРАВЛЕНИЯ ФОРМ

0

Для улучшения функциональности приложений и удобства интер­фейса на форме обычно размещаются кнопки, списки строк, комбини­рованные списки, радиокнопки, строки для редактирования информа­ции и т.п. Все эти элементы описываются в Windows как окна предо­пределенных классов, причем они являются дочерними окнами (стиль WSCHILD). Каждый элемент управления, как правило, в программе обозначается идентификатором и имеет свой список обрабатываемых сообщений. Идентификатор необходим для различения элементов управления в родительской форме, а точнее, в ее оконной функции.

Элементы форм создаются с помощью стандартной функции CreateWindowEx. Параметры функции:

dwExStyle расширенный стиль элемента , например может быть WSEXNODRAG элемент невозможно двигать с помощью мыши, WSEXNOACTIVATE элемент не может быть активным, WSEXTOPMOST элемент всегда отображается поверх остальных;

IpClassName указатель на строку , содержащую название класса элемента , например "EDIT", "BUTTON", "LISTBOX". Именно этот параметр и задаёт тип элемента управления;

IpWindowName указатель на строку , которая будет надписью; dwStyle стиль окна, может быть равен или быть комбинацией сле­дующих констант :

WSBORDER    элемент с бордюром,

WS_CHILD(mni WS_CHILDWINDOW)     элемент   является дочерним,

WSHSCROLL элемент имеет полосу вертикальной про­крутки,

WSVSCROLL элемент имеет полосу горизонтальной про­крутки ,

WSVTSIBLE     элемент изначально видим,

WSDISABLED элемент изначально недоступен,

ESMULTILINE (для EditBox) элемент является многостроч­ным,

ESAUTOVSCROLL (для EditBox) вертикальная автопро­крутка элемента,

ESAUTOHSCROLL (для EditBox) горизонтальная автопро­крутка элемента,

CSDBLCLKS элемент будет воспринимать двойные щелчки мыши.

х, у координаты верхнего левого угла элемента формы;

Width, Height ширина и высота элемента управления;

hWndParent указатель на родительское окно, на которое будет помещён элемент управления;

hMenu идентификатор дочернего окна, который будет ассоцииро­ваться с элементом;

hlnstance дескриптор экземпляра приложения;

IpParam указатель на значение, которое будет содержаться в поле IParam для сообщения WM_CREATE, генерируемом после создания элемента.

Функция CreateWindowEx возвращает указатель на созданный элемент или NULL в случае невозможности создать элемент формы. Как правило, элементы формы создаются при обработке сообщения WM_CREATE родительской формы.

Взаимодействие с созданным элементом формы осуществляется отправкой и получением сообщений. Для отправки сообщений элемен­ту используется функция SendMessage. Функции передаются 4 пара­метра, первый указывает на элемент формы, второй код сообщения, третий и четвертый зависят от сообщения. Например, для смены тек­ста на строку в newText используется вызов вида:

invoke SendMessage,hElement,’WM_SETTEXT,0,ADDR newText

Сообщения , которые подходят для всех элементов (в том числе и форм), имеют префикс WM_ (Windows Messages). Однако, для каждо­го элемента формы существуют специальные сообщения, пригодные только для него, например сообщение LBGETCOUNT связано со счетчиком строк в ListBox, и для кнопки не имеет смысла. Специаль­ные сообщения для кнопок имеют префикс ВМ_ (Buttons Messages), для списка строк LB_ (ListBoxes ).

3.1 Кнопки

В простейшем случае кнопка представляет собой прямоугольник, на котором имеется надпись или изображение. Щелчок мышью по кнопке приводит к ее перерисовке с применением тени, чтобы отра­зить нажатие. Отпускание мыши приводит к восстановлению первона­чального вида кнопки. Для того чтобы такая перерисовка стала воз­можной, от кнопки в родительскую форму посылается сообщение WMCOMMAND. При этом через младшее слово wParam передается идентификатор кнопки, а через старшее код действий с кнопкой, на­пример, при нажатии код равен BNCLICKED.

Для кнопок существуют специализированные стили, названия ко­торых начинаются с префикса BS_. Стиль определяет не только внеш­ний вид кнопки, но и возможность обработки сообщений от клавиату­ры и мыши.

Стиль BSPUSHBUTTON позволяет создать кнопку, которая от­правляет сообщение WMCOMMAND родительскому окну, когда пользователь выбирает эту кнопку. Стиль BSDEFPUSHBUTTON описывает кнопку, которая ведет себя подобно кнопке стиля BSPUSHBUTTON и имеет жирную черную рамку. Если такая кнопка находится в диалоговом окне, то пользователь может выбрать кнопку, нажав клавишу ENTER, даже тогда, когда кнопка не имеет фокуса ввода. Этот стиль полезен для предоставления пользователю возмож­ности быстро выбрать наиболее подходящую (заданную по умолча­нию) опцию.

Стиль BSGROUPBOX служит для создания прямоугольника, в ко­тором могут быть сгруппированы другие элементы управления. Любой текст, связанный с этим стилем отображается в верхнем левом угле прямоугольника. Кнопка стиля BSGROUPBOX не предусматривает посылку сообщений родительскому окну и обработку клавиатурных и «мышиных» событий.

Флажок (Check Box) со стилем BSCHECKBOX представляет со­бой квадратное окно, работает как переключатель, имеющий 2 состоя­ния «включено» (в окне рисуется галочка) и «выключено» (в окне ничего не отображено).

Радиокнопка или переключатель со стилем кнопки BSRADIOBUTTON представляет собой круглое окно, включение ко­торого отражается точкой в окне.

Рассмотрим пример создания кнопки с использованием макроса invoke :

.data

szText  btnClass,"BUTTON"

szText  text,"MY BUTTON!!!"

hMybtn   dd 0

invoke CreateWindowEx,

0,ADDR btnClass,ADDR text,

WS_CHILD or WS_VISIBIiE or CS_DBLCLKS,

100,100,100,20,hWindow,111,

hins tance,NULL mov hMybtn,eax

Кнопки получают сообщения с помощью функции SendMessage.

Для изменения состояния кнопки (нажатое или отжатое) ей переда­ется сообщение BMSETSTATE. При этом wParam равен TRUE для перевода кнопки в нажатое состояние, и FALSE для перевода в отжа­тое. IParam в обоих случаях равен нулю. Кнопки стиля BS_PUSHBUTTON и BS_DEFPUSHBUTTON при нажатии перерисо­вываются автоматически. Например:

invoke SendMes sage,hMyBtn,BM_SETSTATE,TRUE,0

Чтобы узнать состояние кнопки, ей передают сообщение BMGETCHECK с нулевыми параметрами. Возвращаемое значение равно 0 для отжатой кнопки, выключенного переключателя или флаж­ка, 1 для нажатой кнопки, включенного переключателя или флажка, 2 для неактивного состояния этих элементов.

Флажки и переключатели имеют стили В S3 STATE, BSCHECKBOX или BSRADIOBUTTON, и не перерисовываются автоматически, а для их перерисовки надо послать сообщение BMSETCHECK. Параметр wParam указывает, что нужно сделать с переключателем или флажком: 0 выключить (снять выбор в Check-Box, убрать точку в RadioButton), 1 включить, 2 сделать неактив­ным. Параметр IParam равен нулю. Например, включить

invoke SendMes sage,hMyBtn,BM_SETCHECK,1,0

Сообщение BMSETSTYLE устанавливает стиль кнопки, через wParam передается новый стиль (В S3 STATE, BSCHECKBOX, BS_AUTOCHECKBOX, BS_AUT03STATE, BS_RADIOBUTTON, BSICON, BSFLAT т.д.), IParam равен TRUE, если элемент перери­совывается или FALSE, если не перерисовывается. Например :

invoke SendMes sage,hMyBtn,BM_SETSTYLE,BS_3 STATE,TRUE

Слово AUTO в названии стиля означает автоматическую перери­совку объекта при изменении его состояния.

Сообщение BMSETIMAGE служит для добавления картинки к кнопке, wParam указывает тип изображения (IMAGEICON или IMAGEBITMAP), IParam содержит дескриптор изображения. Напри­мер:

invoke SendMes sage,hMyBtn,BM_SETIMAGE,IMAGE_BITMAP,hBmp

Возвращаемое значение указатель на старое изображение на кнопке или NULL , если не было изображения.

Для работы с кнопками можно использовать API-функции для окон, рассмотренные в разделе 1.

Источник: Сучкова, Л.И. Win32 API: основы программирования: учебное пособие/ Л.И. Сучкова; АлтГТУ им. ИИ. Ползунова. -Барнаул, АлтГТУ, 2010. 138 с, ил.

По теме:

  • Комментарии