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

Родительские окна могут посылать следующие сообщения кнопкам:

  • 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.

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

Радио-переключатели

  • Радио-переключатели (radio buttons, радио-кнопки) похожи на флажки, но их форма не квадратная, а круглая. Жирная точка внутри флажка показывает, что переключатель отмечен.

Радио-кнопка может иметь стиль окна BS_RADIOBUTTON или BS_AUTORADIOBUTTON, но последний используется только в окнах диалога. В окнах диалога группы радио-переключателей, как правило, используются для индикации нескольких взаимоисключающих опций. В отличие от флажков, если повторно щелкнуть на радио-кнопке, то ее состояние не изменится.

При получении сообщения WM_COMMAND с кодом нотификации BN_CLICKED от радио-переключателя с идентификатором ID_button, необходимо отобразить его отметку, отправив сообщение BM_SETCHECK с параметром wParam, равным 1. Для остальных переключателей этой группы можно отключить контрольную метку, послав сообщение BM_SETCHECK с параметром wParam, равным 0:

     case WM_COMMAND:

     {    UINT idCtl=LOWORD(wParam); // идентификатор дочер. окна

               UINT code=HIWORD(wParam); // код уведомления

               HWND hChild=(HWND)lParam; // дескриптор дочер. окна

               if(idCtrl==ID_button&&code==BN_CLICKED)

               {

                          SendMessage(hChild,BM_SETCHECK,1,0l);

                          // для всех остальных радиопереключателей группы - снять метки

                          SendMessage(hWndOtherButton,BM_SETCHECK,0,0l);

                          . . .

               }

     }; return 0;

 


Дата добавления: 2019-09-13; просмотров: 198; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!