Извещение от кнопки
Когда пользователь нажмает на кнопку (или изменяет состояние переключателя), окно-владелец кнопки (идентификатор которого был указан в параметрах функции 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);