Электронная библиотека книг Александра Фролова и Григория Фролова.
Shop2You.ru Создайте свой интернет-магазин
Библиотека
Братьев
Фроловых

Программирование для IBM OS/2

© Александр Фролов, Григорий Фролов
Том 25, М.: Диалог-МИФИ, 1993, 286 стр.

[Назад] [Содеожание] [Дальше]

8.3. Переключатели

Переключатели , как и кнопки, создаются при помощи функции WinCreateWindow на базе предопределенного класса окна WC_BUTTON . Однако в отличие от кнопок, для переключателей необходимо указывать стили BS_CHECKBOX , BS_AUTOCHECKBOX , BS_RADIOBUTTON или BS_AUTORADIOBUTTON :

hWndCheckBox = WinCreateWindow (hWnd, WC_BUTTON ,
  "Text", WS_VISIBLE  | BS_AUTOCHECKBOX,
  0, 0, 0, 0, hWnd, HWND_TOP , CHCKBOX_ID, NULL, NULL);

Когда пользователь делает щелчок по переключателю, последний посылает в родительское окно сообщение WM_CONTROL . Обработчик этого сообщения может определить и сохранить текущее состояние переключателя, либо изменить внешний вид переключателя.

На рис. 8.2 для примера показана диалоговая панель с переключателями круглой и прямоугольной формы.

Рис. 8.2. Диалоговая панель с переключателями

Сообщение WM_CONTROL

Рассмотрим параметры сообщения WM_CONTROL , поступающее в функцию родительского окна от переключателей.

Через младшее слово параметра mp1 этого сообщения передается идентификатор переключателя:

id = SHORT1FROMMP (mp1);

Если в окне создано несколько переключателей, следует проанализировать значение id для определения переключателя, который послал сообщение WM_CONTROL .

Старшее слово параметра mp1 содержит код извещения, который для переключателя может иметь значение BN_CLICKED или BN_DBLCLICKED . В первом случае пользователь сделал одиночный щелчок мышью по переключателю, во втором - двойной. Вот пример извлечения кода извещения:

nNotifCode = SHORT2FROMMP (mp1);

Если переключатель был создан с использованием стиля BS_USERBUTTON , в старшем слове параметра mp1 может передаваться код извещения BN_PAINT . В этом случае переключатель должен нарисовать себя в одном из трех состояний: заблокированном, выбранном или обычном. Подробнее об этом мы расскажем в одной из следующих наших книг, посвященных программированию для IBM OS/2.

И, наконец, для обычных переключателей через параметр mp2 сообщения WM_CONTROL передается идентификатор окна переключателя. Для переключателей со стилем BS_USERBUTTON через этот параметр передается указатель на структуру USERBUTTON , определенную следующим образом:

typedef struct _USERBUTTON 
{
  HWND  hwnd; // идентификатор окна
  HPS   hps;  // идентификатор пространства отображения
  ULONG fsState;    // новое состояние переключателя
  ULONG fsStateOld; // старое состояние переключателя
} USERBUTTON;
typedef USERBUTTON *PUSERBUTTON;

Определение состояния переключателя

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

Например, приложение может разместить в окне три переключателя для изменения цвета окна. Цвет может изменяться сразу после изменения состояния переключателей либо после того, как пользователь установит все переключатели в нужное положение и нажмет кнопку с надписью OK.

Для определения текущего состояния переключателя в окно переключателя необходимо послать сообщение BM_QUERYCHECK (оба параметра этого сообщения не используются и должны быть равны нулю):

USHORT usState;
usState = (USHORT)WinSendMsg (hWndCheckBox,
  BM_QUERYCHECK, MPFROMSHORT(0), NULL);

После того как в приведенном выше примере функция WinSendMsg возвратит управление, в переменную usState будет записано состояние кнопки:

Значение Состояние переключателя
0 Выключен и изображается без галочки
1 Включен и отмечен галочкой
2 Находится в неопределенном состоянии

Изменение состояния переключателя

Состояние автоматического переключателя, определенного со стилями BS_AUTOCHECKBOX или BS_AUTORADIOBUTTON, изменяется, когда пользователь делает щелчок мышью в его окне. Если же переключатель имеет стиль BS_CHECKBOX или BS_RADIOBUTTON, приложение должно само изменять его состояние.

Для изменения состояния переключателя (обычного или автоматического) ему необходимо послать сообщение BM_SETCHECK . В параметре mp1 этого сообщения следует указать новое состояние (0, 1 или 2). Параметр mp2 не используется и должен содержать нулевое значение.

В следующем фрагменте кода приложение проверяет текущее состояние перключателя, записанное в переменной fButton3Checked. Если переключатель выключен, он включается, а если включен - выключается. После этого содержимое переменной fButton3Checked изменяется на противоположеное:

if(fButton3Checked)
  // Выключение переключателя
  WinSendMsg (hWndButton3, BM_SETCHECK,
    MPFROMSHORT(0), NULL);
else
  // Включение переключателя
  WinSendMsg (hWndButton3, BM_SETCHECK,
    MPFROMSHORT(1), NULL);
fButton3Checked = ~fButton3Checked;
[Назад] [Содеожание] [Дальше]