- •Глава 8 Дочерние окна управления
- •Класс кнопок
- •Создание дочерних окон
- •Сообщения дочерних окон родительскому окну
- •Сообщения родительского окна дочерним окнам
- •Нажимаемые кнопки
- •Видимые и доступные кнопки
- •Переключатели
- •Окна группы
- •Изменение текста кнопки
- •Кнопки и фокус ввода
- •Дочерние окна управления и цвета
- •Системные цвета
- •Цвета кнопок
- •Сообщение wm_ctlcolorbtn
- •Кнопки, определяемые пользователем
- •Класс статических дочерних окон
- •Класс полос прокрутки
- •Программа colors1
- •Интерфейс клавиатуры, поддерживаемый автоматически
- •Введение новой оконной процедуры
- •Закрашивание фона
- •Окрашивание полос прокрутки и статического текста
- •Класс редактирования
- •Стили класса редактирования
- •Коды уведомления управляющих окон редактирования
- •Использование управляющих окон редактирования
- •Сообщения управляющему окну редактирования
- •Класс окна списка
- •Стили окна списка
- •Добавление строк в окно списка
- •Выбор и извлечение элементов списка
- •Получение сообщений от окон списка
- •Простое приложение, использующее окно списка
- •Список файлов
- •Использование атрибутов файлов
- •Упорядочивание списков файлов
- •Утилита Head для Windows
Сообщения дочерних окон родительскому окну
Когда вы запускаете программу BTNLOOK, вы видите различные типы кнопок, выводимые на экран в левой части рабочей области. Как уже говорилось, когда вы щелкаете мышью на кнопке, дочернее окно управления посылает сообщение WM_COMMAND своему родительскому окну. Программа BTNLOOK обрабатывает сообщение WM_COMMAND и выводит на экране значения параметров wParam и lParam. Здесь приведен их смысл:
LOWORD (wParam) |
Идентификатор дочернего окна |
HIWORD (wParam) |
Код уведомления |
lParam |
Описатель дочернего окна |
Если вы модифицируете программы, написанные для 16-разрядных версий Windows, то знайте, что эти три параметра сообщения были изменены с учетом того, что описатели стали 32-разрядными.
Идентификатор дочернего окна — это значение, передаваемое функции CreateWindow, когда создается дочернее окно. В программе BTNLOOK этими идентификаторами являются значения от 0 до 9 для 10 выводимых в рабочую область кнопок. Описатель дочернего окна — это значение, которое Windows возвращает при вызове функции CreateWindow.
Код уведомления — это дополнительный код, который дочернее окно использует для того, чтобы сообщить родительскому окну более точные сведения о сообщении. Возможные значения кодов уведомления для кнопок определены в заголовочных файлах Windows:
Идентификатор кода уведомления кнопки |
Значение |
BN_CLICKED |
0 |
BN_PAINT |
1 |
BN_HILITE |
2 |
BN_UNHILITE |
3 |
BN_DISABLE |
4 |
BN_DOUBLECLICKED |
5 |
Коды уведомления от 1 до 5 — это коды для кнопок устаревшего стиля BS_USERBUTTON, поэтому вы столкнетесь только с кодами BN_CLICKED.
Обратите внимание, что при щелчке мышью текст кнопки обводится пунктирной линией. Это говорит о том, что кнопка имеет фокус ввода. Теперь весь ввод клавиатуры направлен на дочернее окно кнопки, а не на главное окно. Однако, если кнопка имеет фокус ввода, она игнорирует любые нажатия клавиш за исключением <Spacebar>, которая теперь оказывает то же действие, что и щелчок мыши.
Сообщения родительского окна дочерним окнам
Оконная процедура также может посылать сообщения дочернему окну управления, хотя в программе BTNLOOK и не отражен этот факт. Пять специальных сообщений для кнопок определены в заголовочных файлах Windows; каждое из которых начинается с префикса "BM", что означает "button message" (сообщение кнопки). Вот эти сообщения:
BM_GETCHECK
BM_SETCHECK
BM_GETSTATE
BM_SETSTATE
BM_SETSTYLE
Сообщения BM_GETCHECK и BM_SETCHECK посылаются родительским окном дочернему окну управления для установки и снятия контрольных меток флажков (check boxes) и переключателей (radio buttons). Сообщения BM_GETSTATE и BM_SETSTATE касаются обычного или "нажатого" состояния окна при щелчке мышью или нажатии клавиши <Spacebar>. (Мы рассмотрим как работают эти сообщения при изучении кнопки каждого типа.) Сообщение BM_SETSTYLE позволяет вам изменять стиль кнопки после ее создания.
Каждое дочернее окно имеет описатель окна и его идентификатор, который является уникальным среди других. Знание одного из этих элементов позволяет вам получить другой. Если вы знаете описатель дочернего окна, то можете получить его идентификатор:
id = GetWindowLong (hwndChild, GWL_ID);
Программа CHECKER3 в главе 6 показала, что окно может хранить данные в специальной области, зарезервированной при регистрации класса окна. Область, в которой хранится идентификатор дочернего окна резервируется операционной системой Windows при его создании. Вы можете также использовать функцию:
id = GetDlgCtrlID (hwndChild);
Хотя часть имени функции "Dlg" относится к окну диалога, на самом деле эта функция общего назначения.
Зная идентификатор, вы можете получить описатель дочернего окна:
hwndChild = GetDlgItem (hwndParent, id);
