Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
02_Кнопки_текстовые поля.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
257 Кб
Скачать
☆

Кнопки различных стилей (класс 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.

  • Серый цвет показывает пользователю, что его выбор неопределен или не имеет отношения к делу. В этом случае флажок не может быть включен – т.е. он запрещает какой-либо выбор в данный момент. Однако флажок продолжает посылать сообщения родительскому окну, если щелкать на нем мышью.