Поделиться через


Сообщения кнопки

Кнопка может отправлять сообщения в родительское окно, а родительское окно может отправлять сообщения на кнопку.

В этом разделе рассматриваются следующие разделы.

Отправка сообщений в кнопки

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

Приложение может использовать сообщение BM_GETCHECK для получения состояния проверка поля проверка или переключателя. Приложение также может использовать сообщение BM_GETSTATE для получения текущих состояний кнопки (состояние проверка, состояние push-уведомлений и состояние фокуса). Чтобы получить сведения о определенном состоянии, используйте битовую маску для возвращаемого значения состояния.

Сообщение BM_SETCHECK задает состояние проверка поля проверка или переключателя; сообщение возвращает ноль. Сообщение BM_SETSTATE задает состояние нажатия кнопки. Это сообщение также возвращает ноль. Сообщение BM_SETSTYLE изменяет стиль кнопки. Он предназначен для изменения стилей кнопки в типе (например, изменение поля проверка на автоматическое проверка поле). Он не предназначен для изменения между типами (например, изменение поля проверка на переключатель). Приложение не должно изменять кнопку с одного типа на другой.

Кнопка стиля BS_BITMAP или BS_ICON отображает растровое изображение или значок вместо текста. Сообщение BM_SETIMAGE связывает дескриптор с растровым изображением или значком с кнопкой. Сообщение BM_GETIMAGE извлекает дескриптор на растровое изображение или значок, связанный с кнопкой.

Приложение также может использовать сообщение DM_GETDEFID для получения идентификатора элемента управления кнопки по умолчанию в диалоговом окне. Приложение может использовать сообщение DM_SETDEFID для задания кнопки нажатия по умолчанию для диалогового окна.

Вызов функции CheckDlgButton или CheckRadioButton эквивалентен отправке сообщения BM_SETCHECK. Вызов функции IsDlgButtonChecked эквивалентен отправке сообщения BM_GETCHECK.

Обработка сообщений из кнопки

Уведомления с кнопки отправляются как WM_COMMAND или WM_NOTIFY сообщения. Сведения о том, какое сообщение используется, можно найти на справочной странице для каждого уведомления.

Дополнительные сведения об обработке сообщений см. в разделе "Управление сообщениями". См. также сообщения кнопок.

Уведомления из кнопок

Когда пользователь нажимает кнопку, его состояние изменяется, а кнопка отправляет коды уведомлений в виде сообщений WM_COMMAND в родительское окно. Например, элемент управления кнопкой push отправляет код уведомления BN_CLICKED всякий раз, когда пользователь выбирает кнопку. Во всех случаях (за исключением BCN_HOTITEMCHANGE), слово с низким порядком параметра wParam содержит идентификатор элемента управления, слово с высоким порядком wParam содержит код уведомления, а параметр lParam содержит дескриптор окна управления.

Ответ сообщения и родительского окна зависят от типа, стиля и текущего состояния кнопки. Ниже приведены коды уведомлений кнопок, которые приложение должно отслеживать и обрабатывать.

Код уведомления Description
BCN_HOTITEMCHANGE Мышь вошла или покинула клиентская область кнопки.
BN_CLICKED Пользователь щелкнул кнопку.
BN_DBLCLK или BN_DOUBLECLICKED Пользователь дважды щелкнул кнопку.
BN_DISABLE Кнопка отключена.
BN_PUSHED или BN_HILITE Пользователь нажал кнопку.
BN_KILLFOCUS Кнопка потеряла фокус клавиатуры.
BN_PAINT Кнопка должна быть окрашена.
BN_SETFOCUS Кнопка получила фокус клавиатуры.
BN_UNPUSHED или BN_UNHILITE Кнопка больше не нажимается.

 

Кнопка отправляет коды уведомлений BN_DISABLE, BN_PUSHED, BN_KILLFOCUS, BN_PAINT, BN_SETFOCUS и BN_UNPUSHED только в том случае, если он имеет стиль BS_NOTIFY. BN_DBLCLK коды уведомлений отправляются автоматически для кнопок BS_USERBUTTON, BS_RADIOBUTTON и BS_OWNERDRAW. Другие типы кнопок отправляют BN_DBLCLK только в том случае, если они имеют стиль BS_NOTIFY . Все кнопки отправляют код уведомлений BN_CLICKED независимо от их стилей кнопки.

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

Когда пользователь выбирает кнопку нарисованного владельца, кнопка отправляет родительское окно WM_DRAWITEM сообщение, содержащее идентификатор элемента управления, который будет вырисовываться, и сведения о его измерениях и состоянии.

Цветные сообщения кнопки

Система предоставляет значения цветов по умолчанию для кнопок. Приложение может получить значения по умолчанию для этих цветов, вызвав функцию GetSysColor или установив значения, вызвав функцию SetSysColors. В следующей таблице показаны значения цвета кнопки по умолчанию.

Значение Цвет элемента
COLOR_BTNFACE Лица кнопки.
COLOR_BTNHIGHLIGHT Выделите область (верхние и левые края) кнопки.
COLOR_BTNSHADOW Теневая область (нижние и правые края) кнопки.
COLOR_BTNTEXT Обычный (негрейный) текст в кнопках.
COLOR_GRAYTEXT Отключенный (серый) текст в кнопках. Этот цвет имеет значение 0, если текущий драйвер дисплея не поддерживает сплошной серый цвет.
COLOR_WINDOW Фоны окон.
COLOR_WINDOWFRAME Кадры окон.
COLOR_WINDOWTEXT Текст в окнах.

 

Однако вызов SetSysColors влияет на все приложения, поэтому не следует вызывать эту функцию для настройки кнопок для приложения.

Система отправляет WM_CTLCOLORBTN сообщение в родительское окно кнопки перед рисованием кнопки. Это сообщение содержит дескриптор контекста устройства кнопки и дескриптор дочернего окна. Родительское окно может использовать эти дескрипторы для изменения текста и фона кнопки. Однако только нарисованные владельцем кнопки реагируют на родительское окно, обрабатывая сообщение.

Обработка сообщений по умолчанию кнопки

Процедура окна для предопределенного класса окна управления кнопкой выполняет обработку по умолчанию для всех сообщений, которые процедура управления кнопкой не обрабатывает. Когда процедура управления кнопкой возвращает значение FALSE для любого сообщения, предопределенная процедура окна проверка сообщения и выполняет действия по умолчанию, перечисленные в следующей таблице.

Message Действие по умолчанию
BM_CLICK Отправляет кнопку WM_LBUTTONDOWN и сообщение WM_LBUTTONUP и отправляет родительское окно код уведомления BN_CLICKED.
BM_GETCHECK Возвращает проверка состояние кнопки.
BM_GETIMAGE Возвращает дескриптор растрового изображения или значка, связанного с кнопкой или ЗНАЧЕНИЕ NULL , если кнопка не имеет растрового изображения или значка.
BM_GETSTATE Возвращает текущее состояние проверка, состояние принудительной отправки и фокус кнопки.
BM_SETCHECK Задает состояние проверка для всех стилей переключателей и полей проверка. Если параметр wParam больше нуля для переключателей, кнопка получает стиль WS_TABSTOP.
BM_SETIMAGE Связывает указанный точечный рисунок или дескриптор значка с кнопкой и возвращает дескриптор предыдущей растровой карты или значка.
BM_SETSTATE Задает состояние нажатия кнопки. Для кнопок, нарисованных владельцем, сообщение WM_DRAWITEM отправляется в родительское окно, если состояние кнопки изменилось.
BM_SETSTYLE Задает стиль кнопки. Если слово с низким порядком параметра lParam имеет значение TRUE, кнопка перезавернута.
WM_CHAR Проверяет поле проверка или автоматическое проверка, когда пользователь нажимает клавиши plus (+) или равно (=). Очищает поле проверка или автоматическое проверка, когда пользователь нажимает клавишу минус (–).
WM_ENABLE Рисует кнопку.
WM_ERASEBKGND Удаляет фон для кнопок, нарисованных владельцем. Фоны других кнопок удаляются в рамках WM_PAINT и обработки WM_ENABLE.
WM_GETDLGCODE Возвращает значения, указывающие тип входных данных, обработанных процедурой кнопки по умолчанию, как показано в следующей таблице.
Стиль кнопки Возвраты
BS_AUTOCHECКБ OX DLGC_WANTCHARS | DLGC_BUTTON
BS_AUTORADIOBUTTON DLGC_RADIOBUTTON | DLGC_BUTTON
BS_CHECКБ OX DLGC_WANTCHARS | DLGC_BUTTON
BS_DEFPUSHBUTTON DLGC_DEFPUSHBUTTON | DLGC_BUTTON
BS_GROUPBOX DLGC_STATIC
BS_PUSHBUTTON DLGC_UNDEFPUSHBUTTON | DLGC_BUTTON
BS_RADIOBUTTON DLGC_RADIOBUTTON | DLGC_BUTTON

 

WM_GETFONT Возвращает дескриптор текущего шрифта.
WM_KEYDOWN Нажимает кнопку, если пользователь нажимает ПРОБЕЛ.
WM_KEYUP Освобождает запись мыши для всех случаев, кроме клавиши TAB.
WM_KILLFOCUS Удаляет прямоугольник фокуса из кнопки. Для кнопок push-уведомлений и кнопок нажатия по умолчанию прямоугольник фокуса недействителен. Если кнопка содержит запись мыши, запись освобождается, кнопка не щелкается и удаляется любое состояние принудительной передачи.
WM_LBUTTONDBLCLK Отправляет код уведомления BN_DBLCLK в родительское окно для переключателей и кнопок, нарисованных владельцем. Для других кнопок дважды щелчок обрабатывается как сообщение WM_LBUTTONDOWN.
WM_LBUTTONDOWN Выделяет кнопку, если позиция курсора мыши находится в прямоугольнике клиента кнопки.
WM_LBUTTONUP Освобождает запись мыши, если кнопка имела запись мыши.
WM_MOUSEMOVE Выполняет то же действие, что и WM_LBUTTONDOWN, если кнопка содержит запись мыши. В противном случае действие не выполняется.
WM_NCCREATE Преобразует любую кнопку BS_OWNERDRAW в кнопку BS_PUSHBUTTON.
WM_NCHITTEST Возвращает HTTRANSPARENT, если элемент управления кнопкой является полем группы.
WM_PAINT Рисует кнопку в соответствии со своим стилем и текущим состоянием.
WM_SETFOCUS Рисует прямоугольник фокуса на кнопке, получая фокус. Для переключателей и автоматических переключателей родительский окно отправляется BN_CLICKED код уведомления.
WM_SETFONT Задает новый шрифт и при необходимости обновляет окно.
WM_SETTEXT Задает текст кнопки. В случае с полем группы сообщение закрашивает перед переопределениям поля группы новым текстом.
WM_SYSKEYUP Освобождает запись мыши для всех случаев, кроме клавиши TAB.

 

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

Управление сообщениями