Программирование для IBM OS2
4cab9ef0

Извещение от кнопки


Когда пользователь нажмает на кнопку (или изменяет состояние переключателя), окно-владелец кнопки (идентификатор которого был указан в параметрах функции WinCreateWindow ) получает извещающее сообщение.

Код этого сообщения зависит от стиля кнопки. Если не указаны стили BS_SYSCOMMAND или BS_HELP, извещение посылается в виде сообщения WM_COMMAND . Если же указаны перечисленные выше стили, вместо сообщения WM_COMMAND посылаются, соответственно, сообщения WM_SYSCOMMAND или WM_HELP .

Что же касается переключателей, то они посылают извещение в форме сообщения WM_CONTROL , которое мы рассмотрим в разделе "Переключатели".

Через параметр mp1 сообщения WM_COMMAND передается идентификатор органа управления. Однако вспомним, что сообщение WM_COMMAND посылает также меню приложения. Для того чтобы различить источник извещающего сообщения WM_COMMAND, необходимо проанализировать параметр mp2.

Младшее слово параметра mp2 содержит искомый идентификатор источника сообщения и может принимать одно из перечисленных ниже значений:



Значение Описание
CMDSRC_PUSHBUTTON Извещающее сообщение WM_COMMAND посылается кнопкой, идентификатор которой передается через параметр mp1
CMDSRC_MENU Источником сообщения является меню, идентификатор которого передается через параметр mp1
CMDSRC_ACCELERATOR Сообщение пришло от акселератора с командным значением mp1
CMDSRC_FONTDLG Источником сообщения является диалоговая панель для выбора шрифта. Через параметр mp1 передается идентификатор этой диалоговой панели
CMDSRC_FILEDLG Источником сообщения является диалоговая панель для выбора файла. Через параметр mp1 передается идентификатор этой диалоговой панели
CMDSRC_OTHER Прочий источник сообщения

Старшее слово параметра mp2 сообщения WM_COMMAND может содержать значение TRUE или FALSE. В первом случае извещение появилось в результате работы с органом управления при помощи мыши, во втором - при помощи клавиатуры.

Для того чтобы было удобнее разбирать параметры сообщения WM_COMMAND , в файле pmwin.h определена структура CMDMSG, указатель на нее PCMDMSG и макрокоманда COMMANDMSG:


typedef struct _COMMANDMSG { USHORT cmd; // идентификатор органа управления USHORT unused; // не используется USHORT source; // источник извещающего сообщения USHORT fMouse; // признак использования мыши } CMDMSG; typedef CMDMSG *PCMDMSG;

#define COMMANDMSG(pmsg) \ ((PCMDMSG)((PBYTE)pmsg + sizeof(MPARAM)))

Обработчик сообщения WM_COMMAND обычно имеет такой вид:

case WM_COMMAND : { switch (COMMANDMSG(&msg) -> cmd) { case BTN1_ID: { // Обработка извещения от кнопки BTN1_ID . . . break; } case BTN2_ID: { // Обработка извещения от кнопки BTN2_ID . . . break; } default: break; } return 0; }

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

if(COMMANDMSG (&msg) -> source == CMDSRC_PUSHBUTTON) { // Сообщение от кнопки . . . } else if(COMMANDMSG(&msg) -> source == CMDSRC_MENU) { // Сообщение от меню . . . }

Для извлечения параметров кнопки вы можете также использовать макрокоманды SHORT1FROMMP и SHORT2FROMMP :

cmd = SHORT1FROMMP (mp1); source = SHORT1FROMMP (mp2); fMouse = SHORT1FROMMP (mp2);


Содержание раздела