Программирование для 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 будет записано состояние кнопки:
Изменение состояния переключателяСостояние автоматического переключателя, определенного со стилями 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; |