Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Конспект лекций Часть II.doc
Скачиваний:
14
Добавлен:
20.11.2018
Размер:
1.48 Mб
Скачать

2.1.2. Кнопки и сообщения

До обсуждения сообщений, получаемых функцией окна, вспом­ним заголовок этой функции:

LRESULT CALLBACK WndProc( HWND hwnd, UINT msg,

WPARAM wParam, LPARAM IParam)

Пусть функция родительского окна от кнопки получила сообщение WM_COMMAND. Параметр msg принимает код сообщения, т. е. msg= WM_COMMAND. При этом младшее слово параметра wParam (значение LOWORD(wParam)) содержит идентификатор кнопки. В предыдущем примере LOWORD(wParam)=ID_BUTTON. Старшее слово этого параметра равно коду извещения. По нему судят о совершенном над кнопкой действии. Например, при нажатии на кнопку код равен BN_CLICKED, т. е. HIWORD(wParam)=BN_CLICKED. Параметр lParam содержит деск­риптор окна кнопки. В предыдущем примере lParam= (HWND)hButton.

Не все кнопки посылают сообщения. Например, кнопка стиля BS_GROUPBOX не обрабатывает сообщения от мыши или клавиатуры и не посылает сообщения родительскому окну. Ее используют в качестве объединяющей рамки с заголовком, внутри которой рас­полагают другие органы управления.

Пользователь состоянием кнопок управляет с помощью мыши и кла­виатуры. Приложения для изменения координат кнопок вызывают обычные функции перемещения и изменения расположения окон. А для управления состоянием кнопок передают сообщения.

Существует два способа передачи сообщений окнам.

1. Запись сообщения в очередь приложения. С этой целью вызыва­ют функцию PostMessage:

BOOL PostMessage( HWND hwnd, UINT uMsg,

WPARAM wParam, LPARAM IParam);

Она помещает сообщение в очередь сообщений окна hwnd и возвра­щает управление. В случае успешной записи сообщения возвращаемое значение равно TRUE. Иначе - FALSE. Записанное сообщение будет вы­брано в цикле обработки сообщений. Параметр uMsg содержит код, а wParam и IParam содержат параметры передаваемого сообщения.

2. Непосредственная передача сообщения функции окна. Для этого вызывают функцию SendMessage:

LRESULT WINAPI SendMessage(HWND hwnd, UINT uMsg,

WPARAM wParam, LPARAM IParam);

Параметры этой функции используются аналогично параметрам функции PostMessage. Но в отличие от нее функция SendMessage вы­зывает функцию окна и возвращает управление только после обработки сообщения функцией окна. Возвращаемое значение зависит от обра­ботчика сообщения в функции окна.

Особенности сообщений для кнопок

Кнопки обычно находятся в двух состояниях - нажатом или отжатом.

Для изменения состояния кнопки передают сообщение BM_SETSTATE:

BM_SETSTATE с параметрами wParam= TRUE, lParam= 0 переводит кнопку в нажатое состояние:

SendMessage(hButton, BM_SETSTATE, TRUE, OL);

Кнопка стиля BS_PUSHBUTTON или BS_DEFPUSHBUTTON при нажатии автоматически "уходит вглубь", т. е. перерисовывается.

BM_SETSTATE с параметрами wParam= FALSE, lParam= 0 переводит кнопку в отжатое состояние:

SendMessage(hButton, BM_SETSTATE, FALSE, OL);

Чтобы узнать состояние кнопки, ее функции окна посылают сообще­ние BM_GETCHECK (wParam=lParam=0). В следующем фрагменте переменная nState при­мет значение кода состояния кнопки hButton:

WORD nState=(WORD)SendMessage(hButton, BM_SETCHECK, 0, OL);

Возвращаемое значение равно 0 для отжатой кнопки, выключенного пе­реключателя или флажка, 1 - для нажатой кнопки, включенного пере­ключателя или флажка и 2 - для переключателя или флажка в неактив­ном состоянии и отображается серым цветом.

Переключатели и флажки стилей BS_3STATE, BS_CHECKBOX и BS_RADIOBUTTON не перерисовываются при их переключении. Для их перерисовки нужно послать сообщение BM_SETCHECK.

Сообщение BM_SETCHECK (lParam=0) задает новое состояние. В следующей таблице перечислены значения параметра wParam этого сообщения и устанавливаемые состояния переключателей и флажков:

wParam Состояние переключателя или флажка

0 Выключенное (прямоугольник не перечеркнут, в кружке нет точки)

1 Включенное (прямоугольник перечеркнут, в кружке имеется точка)

2 Неактивное. Переключатель или флажок будет изображен серым цветом

Например, следующий оператор переводит переключатель или фла­жок с дескриптором hButton во включенное состояние:

SendMessage( hButton, BM_SETCHECK, 1, OL);

Следующее приложение демонстрирует примеры обработки вышепе­речисленных сообщений.