- •Тема: Работа с элементами управления в Windows-программах
- •Кнопки различных стилей (класс button)
- •Радио-переключатели
- •Статические поля (класс static)
- •Текстовые редакторы (класс edit)
- •Cписки разных стилей (класс listbox)
- •Выпадающие списки (класс combobox)
- •Полосы прокрутки (класс scrollbar)
- •Тема: Работа с таймерами в Windows
- •Создание элементов управления визуально
- •Задания
- •1. Создать оконное приложение, которое спрашивает имя и выводит текст: «Введенное_имя? Не, не знаю такого»
Кнопки различных стилей (класс button)
Родительское окно будет получать от кнопки сообщение WM_COMMAND с кодом уведомления BN_CLICKED. Этим сообщением кнопка информирует родительское окно о том, что с ней что-то сделали. Для обработки сообщения оконная функция родительского окна может содержать код следующего вида:
case WM_COMMAND:
{ UINT idCtl=LOWORD(wParam); // идентификатор дочер. окна
UINT code=HIWORD(wParam); // код уведомления
HWND hChild=(HWND)lParam; // дескриптор дочер. окна
if(idCtrl==ID_button&&code==BN_CLICKED)
{
// сообщение о том, что нажата кнопка
// с идентификатором ID_button
. . .
}
}; return 0;
Стиль кнопки |
Внешний вид |
Описание |
BS_3STATE |
|
Переключатель, который может находится в одном из трех состояний: включенном (квадратик перечеркнут), выключенном (квадратик не перечеркнут), неактивном (квадратик отображается серым цветом) |
BS_AUTO3STATE |
|
Аналогично стилю BS_3STATE, но внешний вид кнопки изменяется автоматически при ее переключении |
BS_AUTOCHECKBOX |
|
Переключатель, который может находиться в одном из двух состояний: включенном или выключенном. Внешний вид кнопки изменяется автоматически при ее переключении |
BS_AUTORADIOBUTTON |
|
Переключатель, который может находиться в одном из двух состояний: включенном (внутри окружности имеется жирная черная точка) или выключенном (окружность не закрашена). Внешний вид кнопки изменяется автоматически при ее переключении |
BS_CHECKBOX |
|
Переключатель, который может находиться в одном из двух состояний: включенном или выключенном. |
BS_DEFPUSHBUTTON |
|
Стандартная кнопка с толстой рамкой вокруг |
BS_GROUPBOX |
|
Прямоугольная область, внутри которой могут находиться другие кнопки. Обычно используется в диалоговых панелях. Этот орган управления не воспринимает сообщения от мыши или клавиатуры |
BS_LEFTTEXT |
|
Этот стиль указывается вместе с другими и означает, что текст, расположенный около кнопки, должен находиться слева, а не справа от кнопки |
BS_OWNERDRAW |
Внешний вид определяется родительским окном |
Внешний вид кнопки определяется родительским окном, которое само рисует кнопку во включенном, выключенном или неактивном состоянии |
BS_PUSHBUTTON |
|
Стандартная кнопка без рамки |
BS_RADIOBUTTON |
|
Переключатель, который может находиться в одном из двух состояний: включенном или выключенном. |
BS_USERBUTTON |
Внешний вид определяется родительским окном |
Устаревший стиль, аналогичный по назначению стилю BS_OWNERDRAW. Не рекомендуется к использованию. Этот стиль не описан в документации SDK для Windows версии 3.1, но определен в файле windows.h |
Родительские окна могут посылать следующие сообщения кнопкам:
BM_GETCHECK и BM_SETCHECK - для установки и снятия меток типа “включено/выключено” флажков-переключателей и радио-переключателей;
BM_GETSTATE и BM_SETSTATE - для установки состояния “нажата/отпущена” всех типов кнопок;
BM_SETSTYLE - для изменения стиля любой кнопки после ее создания.
Следует заметить, что
Только нажимаемые кнопки и кнопки, определяемые пользователем, посылают своему родительскому окну сообщение WM_CTLCOLORBTN.
Кроме того, только кнопки, определяемые пользователем, реагируют на обработку сообщения родительским окном, используя кисть для закрашивания фона.
А это совершенно бесполезно, поскольку за рисование кнопок, определяемых пользователем, и так отвечает родительское окно.
Нажимаемые кнопки
Нажимаемые кнопки (push buttons) представляют собой прямоугольник, внутри которого находится текст, заданный в параметре текста окна функции CreateWindow.
Нажимаемые кнопки управления используются в основном для запуска немедленного действия без сохранения какой-либо индикации кнопки типа “включено/выключено”. Эти два типа нажимаемых кнопок управления имеют стили, которые называются BS_PUSHBUTTON и BS_DEFPUSHBUTTON (символы “DEF” означают “по умолчанию – default”).
Функционирование кнопок этих двух стилей при использовании их в диалоговых окнах отличается друг от друга.
Если же их использовать в обычных перекрывающихся окнах, то эти два типа нажимаемых кнопок действуют одинаково, хотя кнопка BS_DEFPUSHBUTTON имеет более жирную рамку.
Когда курсор мыши находится на нажимаемой кнопке и левая клавиша мыши нажата, то кнопка перерисовывается так, чтобы выглядеть нажатой. 0
Отпускание клавиши мыши, когда курсор мыши находится на нажимаемой кнопке, приводит к восстановлению облика кнопки и посылке родительскому окну сообщения WM_COMMAND с кодом нотификации BN_CLICKED.
Приложение может имитировать нажатие кнопки, посылая окну сообщение BM_SETSTATE. Следующий оператор приводит к “нажатию” кнопки:
SendMessage(hWndButton,BM_SETSTATE,1,0l); // wParam=1 – нажата
Следующий вызов заставляет кнопку вернуться к своему нормальному состоянию:
SendMessage(hWndButton,BM_SETSTATE,0,0l); // wParam=0 – отпущена
Также можно послать нажимаемой кнопке сообщение BM_GETSTATE. Дочерняя кнопка управления возвращает текущее состояние – TRUE, если кнопка нажата и FALSE (или 0), если она в обычном состоянии:
int press= SendMessage(hWndButton,BM_GETSTATE,0,0l);
if(press) { /* кнопка нажата */ }
else { /* кнопка в нормальном состоянии */ }
Замечание. Поскольку нажимаемая кнопка не сохраняет информацию о своем положении типа “включено/выключено”, сообщения BM_GETCHECK и BM_SETCHECK не используются.
Флажки-переключатели
Флажки (check boxes) представляют собой маленькие квадратные окна с размещенным обычно справа от окна текстом (если при создании кнопки используется стиль BS_LEFTTEXT, то текст окажется слева).
Флажки, как правило, действуют как двухпозиционные переключатели: один щелчок вызывает появление контрольной метки (состояние “включено”); другой щелчок приводит к исчезновению этой метки (состояние “выключено”).
В приложениях флажки обычно объединяются, что дает пользователю возможность установить опции. Двумя наиболее используемыми стилями для флажков являются BS_CHECKBOX и BS_AUTOCHECKBOX.
При использовании стиля BS_CHECKBOX приложение само должно устанавливать контрольную метку, посылая сообщение BM_SETCHECK. В этом случае обработка родительским окном сообщения WM_COMMAND с кодом нотификации BN_CLICKED от флажка с идентификатором ID_button могла бы быть следующей:
case WM_COMMAND:
{ UINT idCtl=LOWORD(wParam); // идентификатор дочер. окна
UINT code=HIWORD(wParam); // код уведомления
HWND hChild=(HWND)lParam; // дескриптор дочер. окна
if(idCtrl==ID_button&&code==BN_CLICKED)
{
int cur_label= SendMessage(hWndButton,BM_GETCHECK,0,0l);
SendMessage(hChild,BM_SETCHECK,(WPARAM)(!cur_label),0l);
}
}; return 0;
При стиле BS_AUTOCHECKBOX флажок самостоятельно включает и выключает контрольную метку, и оконная процедура родительского окна может игнорировать сообщения WM_COMMAND.
Если приложению необходимо инициализировать флажок меткой (установить состояние “включено”), то ему следует послать сообщение BM_SETCHECK c параметром wParam, равным 1 (значение 0 снимает с флажка метку):
SendMessage(hWndButton,BM_SETCHECK,1,0l);
Если необходимо узнать текущее состояние флажка, то для этого можно послать сообщение BM_GETCHECK:
int iCheck=SendMessage(hWndButton,BM_GETCHECK,0,0l);
Полученное значение равно TRUE (не равно 0), если флажок отмечен (“включен”) или FALSE (или 0), если не отмечен.
Двумя другими стилями флажков являются BS_3STATE и BS_AUTO3STATE. Как показывают их имена, эти стили могут отображать третье состояние – серый цвет внутри окна флажка – которое имеет место, когда такому флажку посылается сообщение BM_SETCHECK с параметром, равным 2.
Серый цвет показывает пользователю, что его выбор неопределен или не имеет отношения к делу. В этом случае флажок не может быть включен – т.е. он запрещает какой-либо выбор в данный момент. Однако флажок продолжает посылать сообщения родительскому окну, если щелкать на нем мышью.
