- •Содержание
- •Глава 1 README.TXT
- •Вызов, брошенный программистам
- •Основные правила
- •Краткая история Windows
- •Краткая история этой книги
- •Начнем
- •Глава 2 Hello, Windows 95
- •Отличительная особенность Windows
- •Графический интерфейс пользователя
- •Концепции и обоснование GUI
- •Содержимое интерфейса пользователя
- •Преимущество многозадачности
- •Управление памятью
- •Независимость графического интерфейса от оборудования
- •Соглашения операционной системы Windows
- •Вызовы функций
- •Объектно-ориентированное программирование
- •Архитектура, управляемая событиями
- •Оконная процедура
- •Ваша первая программа для Windows
- •Что в этой программе неправильно?
- •Файлы HELLOWIN
- •Make-файл
- •Вызовы функций Windows
- •Идентификаторы, написанные прописными буквами
- •Новые типы данных
- •Описатели
- •Венгерская нотация
- •Точка входа программы
- •Регистрация класса окна
- •Создание окна
- •Отображение окна
- •Цикл обработки сообщений
- •Оконная процедура
- •Обработка сообщений
- •Воспроизведение звукового файла
- •Сообщение WM_PAINT
- •Сообщение WM_DESTROY
- •Сложности программирования для Windows
- •Не вызывай меня, я вызову тебя
- •Синхронные и асинхронные сообщения
- •Думайте о ближнем
- •Кривая обучения
- •Глава 3 Рисование текста
- •Рисование и обновление
- •Сообщение WM_PAINT
- •Действительные и недействительные прямоугольники
- •Введение в графический интерфейс устройства (GDI)
- •Контекст устройства
- •Структура информации о рисовании
- •Получение описателя контекста устройства. Второй метод
- •Функция TextOut. Подробности
- •Системный шрифт
- •Размер символа
- •Метрические параметры текста. Подробности
- •Форматирование текста
- •Соединим все вместе
- •Не хватает места!
- •Размер рабочей области
- •Полосы прокрутки
- •Диапазон и положение полос прокрутки
- •Сообщения полос прокрутки
- •Прокрутка в программе SYSMETS
- •Структурирование вашей программы для рисования
- •Создание улучшенной прокрутки
- •Мне не нравится пользоваться мышью
- •Глава 4 Главное о графике
- •Концепция GDI
- •Структура GDI
- •Типы функций
- •Примитивы GDI
- •Другие аспекты
- •Контекст устройства
- •Получение описателя контекста устройства
- •Программа DEVCAPS1
- •Размер устройства
- •О цветах
- •Атрибуты контекста устройства
- •Сохранение контекста устройства
- •Рисование отрезков
- •Ограничивающий прямоугольник
- •Сплайны Безье
- •Использование стандартных перьев
- •Создание, выбор и удаление перьев
- •Закрашивание пустот
- •Режимы рисования
- •Рисование закрашенных областей
- •Функция Polygon и режим закрашивания многоугольника
- •Закрашивание внутренней области
- •Режим отображения
- •Координаты устройства (физические координаты) и логические координаты
- •Системы координат устройства
- •Область вывода и окно
- •Работа в режиме MM_TEXT
- •Метрические режимы отображения
- •Ваши собственные режимы отображения
- •Программа WHATSIZE
- •Прямоугольники, регионы и отсечение
- •Работа с прямоугольниками
- •Случайные прямоугольники
- •Создание и рисование регионов
- •Отсечения: прямоугольники и регионы
- •Программа CLOVER
- •Пути
- •Создание и воспроизведение путей
- •Расширенные перья
- •Bits and Blts
- •Цвета и битовые образы
- •Файл DIB
- •Упакованный формат хранения DIB
- •Отображение DIB
- •Преобразование DIB в объекты "битовые образы"
- •Битовый образ — объект GDI
- •Создание битовых образов в программе
- •Формат монохромного битового образа
- •Формат цветного битового образа
- •Контекст памяти
- •Мощная функция BitBlt
- •Перенос битов с помощью функции BitBlt
- •Функция DrawBitmap
- •Использование других ROP кодов
- •Дополнительные сведения о контексте памяти
- •Растяжение битовых образов с помощью функции StretchBlt
- •Кисти и битовые образы
- •Метафайлы
- •Простое использование метафайлов памяти
- •Сохранение метафайлов на диске
- •Расширенные метафайлы
- •Делаем это лучше
- •Базовая процедура
- •Заглянем внутрь
- •Вывод точных изображений
- •Текст и шрифты
- •Вывод простого текста
- •Атрибуты контекста устройства и текст
- •Использование стандартных шрифтов
- •Типы шрифтов
- •Шрифты TrueType
- •Система EZFONT
- •Внутренняя работа
- •Форматирование простого текста
- •Работа с абзацами
- •Глава 5 Клавиатура
- •Клавиатура. Основные понятия
- •Игнорирование клавиатуры
- •Фокус ввода
- •Аппаратные и символьные сообщения
- •Аппаратные сообщения
- •Системные и несистемные аппаратные сообщения клавиатуры
- •Переменная lParam
- •Виртуальные коды клавиш
- •Использование сообщений клавиатуры
- •Модернизация SYSMETS: добавление интерфейса клавиатуры
- •Логика обработки сообщений WM_KEYDOWN
- •Посылка асинхронных сообщений
- •Символьные сообщения
- •Сообщения WM_CHAR
- •Сообщения немых символов
- •Каретка (не курсор)
- •Функции работы с кареткой
- •Программа TYPER
- •Наборы символов Windows
- •Набор символов OEM
- •Набор символов ANSI
- •Наборы символов OEM, ANSI и шрифты
- •Международные интересы
- •Работа с набором символов
- •Связь с MS-DOS
- •Использование цифровой клавиатуры
- •Решение проблемы с использованием системы UNICODE в Windows NT
- •Глава 6 Мышь
- •Базовые знания о мыши
- •Несколько кратких определений
- •Сообщения мыши, связанные с рабочей областью окна
- •Простой пример обработки сообщений мыши
- •Обработка клавиш <Shift>
- •Сообщения мыши нерабочей области
- •Сообщение теста попадания
- •Сообщения порождают сообщения
- •Тестирование попадания в ваших программах
- •Гипотетический пример
- •Пример программы
- •Эмуляция мыши с помощью клавиатуры
- •Добавление интерфейса клавиатуры к программе CHECKER
- •Использование дочерних окон для тестирования попадания
- •Дочерние окна в программе CHECKER
- •Захват мыши
- •Рисование прямоугольника
- •Решение проблемы — захват
- •Программа BLOKOUT2
- •Глава 7 Таймер
- •Основы использования таймера
- •Система и таймер
- •Таймерные сообщения не являются асинхронными
- •Использование таймера: три способа
- •Первый способ
- •Второй способ
- •Третий способ
- •Использование таймера для часов
- •Позиционирование и изменение размеров всплывающего окна
- •Получение даты и времени
- •Обеспечение международной поддержки
- •Создание аналоговых часов
- •Стандартное время Windows
- •Анимация
- •Класс кнопок
- •Создание дочерних окон
- •Сообщения дочерних окон родительскому окну
- •Сообщения родительского окна дочерним окнам
- •Нажимаемые кнопки
- •Флажки
- •Переключатели
- •Окна группы
- •Изменение текста кнопки
- •Видимые и доступные кнопки
- •Кнопки и фокус ввода
- •Дочерние окна управления и цвета
- •Системные цвета
- •Цвета кнопок
- •Сообщение WM_CTLCOLORBTN
- •Кнопки, определяемые пользователем
- •Класс статических дочерних окон
- •Класс полос прокрутки
- •Программа COLORS1
- •Интерфейс клавиатуры, поддерживаемый автоматически
- •Введение новой оконной процедуры
- •Закрашивание фона
- •Окрашивание полос прокрутки и статического текста
- •Класс редактирования
- •Стили класса редактирования
- •Коды уведомления управляющих окон редактирования
- •Использование управляющих окон редактирования
- •Сообщения управляющему окну редактирования
- •Класс окна списка
- •Стили окна списка
- •Добавление строк в окно списка
- •Выбор и извлечение элементов списка
- •Получение сообщений от окон списка
- •Простое приложение, использующее окно списка
- •Список файлов
- •Утилита Head для Windows
- •Компиляция ресурсов
- •Значки и курсоры
- •Редактор изображений
- •Получение описателя значков
- •Использование значков в вашей программе
- •Использование альтернативных курсоров
- •Битовые образы: картинки в пикселях
- •Использование битовых образов и кистей
- •Символьные строки
- •Использование ресурсов-символьных строк
- •Меню
- •Структура меню
- •Шаблон меню
- •Ссылки на меню в вашей программе
- •Меню и сообщения
- •Образец программы
- •Этикет при организации меню
- •Сложный способ определения меню
- •Третий подход к определению меню
- •Независимые всплывающие меню
- •Использование системного меню
- •Изменение меню
- •Другие команды меню
- •Использование в меню битовых образов
- •Два способа создания битовых образов для меню
- •Контекст памяти
- •Создание битового образа, содержащего текст
- •Масштабирование битовых образов
- •Соберем все вместе
- •Добавление интерфейса клавиатуры
- •Быстрые клавиши
- •Зачем нужны быстрые клавиши?
- •Некоторые правила назначения быстрых клавиш
- •Таблица быстрых клавиш
- •Преобразование нажатий клавиш клавиатуры
- •Получение сообщений быстрых клавиш
- •Программа POPPAD, имеющая меню и быстрые клавиши
- •Разрешение пунктов меню
- •Обработка опций меню
- •Глава 11 Окна диалога
- •Модальные окна диалога
- •Создание окна диалога About
- •Шаблон окна диалога
- •Диалоговая процедура
- •Вызов окна диалога
- •Дополнительная информация о стиле окна диалога
- •Дополнительная информация об определении дочерних окон элементов управления
- •Более сложное окно диалога
- •Работа с дочерними элементами управления окна диалога
- •Кнопки OK и Cancel
- •Позиции табуляции и группы
- •Рисование в окне диалога
- •Использование с окном диалога других функций
- •Определение собственных окон управления
- •Окна сообщений
- •Информация во всплывающих окнах
- •Немодальные окна диалога
- •Различия между модальными и немодальными окнами диалога
- •Новая программа COLORS
- •Программа HEXCALC: обычное окно или окно диалога?
- •Творческое использование идентификаторов дочерних окон элементов управления
- •Диалоговые окна общего пользования
- •Модернизированная программа POPPAD
- •Изменение шрифта
- •Поиск и замена
- •Программа для Windows, содержащая всего один вызов функции
- •Основы элементов управления общего пользования
- •Инициализация библиотеки
- •Создание элементов управления общего пользования
- •Стили элементов управления общего пользования
- •Уведомляющие сообщения от элементов управления общего пользования
- •Элементы управления главного окна
- •Панели инструментов
- •Создание панели инструментов
- •Строка состояния
- •Программа GADGETS
- •Наборы страниц свойств
- •Создание набора страниц свойств
- •Процедуры диалогового окна страницы свойств
- •Программа PROPERTY
412
Категория |
Элемент |
Описание |
|
управления |
|
List view (список просмотра)
Другие элементы управления
Animation (анимационное изображение)
Drag list (список,
поддерживающий операции типа drag/drop)
Header (заголовок списка просмотра)
Hot-Key (горячая клавиша)
Image list (список изображений)
Progress bar (индикатор процесса)
Rich edit (усовершенствованный редактор)
Tab (набор закладок для выбора)
Trackbar (окно с движком для выбора значения из диапазона) Up-Down (полоса прокрутки, связанная с окном редактирования для увеличения или уменьшения на 1 целочисленного значения)
Отображает список элементов, идентифицируемых битовым образом и текстовыми данными (правая панель окна программы Windows Explorer).
Проигрывает анимационную последовательность для индикации длительной операции.
Окно списка, поддерживающее
простые операции drag/drop по отношению к себе
идругим окнам типа Drag list. (Не drag/drop OLE-контейнер).
Отображает горизонтальные заголовки для столбцов (используется совместно со списком просмотра).
Отображает результат операции определения клавиш активизации (горячих клавиш). Элемент управления для хранения набора растровых изображений (битовых образов, курсоров, значков), не являющийся окном. Отображает динамику длительной операции как процент от выполненной задачи.
Редактор, поддерживающий множество шрифтов
ибазовые возможности OLE-контейнера. Отображает список закладок для выбора. Tabs используются в окне набора страниц свойств для выбора страницы свойств. Панель задач (task bar) Windows 95 — есть элемент управления Tab, использующий кнопки вместо закладок.
Тип полосы прокрутки для выбора значения в заданном диапазоне.
Тип полосы прокрутки, состоящий из двух стрелок (но собственно без полосы) для увеличения или уменьшения на 1 величины,
находящейся в связанном поле редактирования.
Рис. 12.1 Элементы управления, поддерживаемые библиотекой COMCTL32.DLL
В этой главе мы рассмотрим основы работы со всеми этими элементами управления и остановимся на первых двух категориях — элементах управления главного окна и составных элементах управления — представляющих собой набор, который будет использоваться в каждом приложении для Windows. Две другие категории — элементы управления Windows Explorer и другие элементы управления — более детально рассматриваются в книге Nancy Cluts "Programming the Windows 95 User Interface" (Microsoft Press, 1995).
Основы элементов управления общего пользования
Каждый элемент управления общего пользования, за исключением списка изображений, реализован как класс окна. С этой точки зрения, элементы управления общего пользования похожи на предопределенные элементы управления диалоговых окон, появившиеся в первой версии системы Windows. Оба типа элементов управления строятся с помощью функции CreateWindow, настраиваются с использованием конкретных флагов стиля класса, управляются специфичными для данного класса сообщениями и приводятся к нужному состоянию с применением обычных API — вызовов, манипулирующих с окнами. Оба типа элементов управления также посылают уведомляющие сообщения родительскому окну, информируя обо всех происходящих событиях.
Разница между элементами управления общего пользования и предопределенными элементами управления состоит в том, какие сообщения они посылают для уведомления. Предопределенные элементы управления посылают уведомляющие сообщения WM_COMMAND, в то время как элементы управления общего пользования (за некоторыми исключениями) посылают сообщения WM_NOTIFY. Хотя при поверхностном взгляде механизмы передачи отличаются, идея, лежащая в основе этих уведомляющих сообщений, одна и та же: родительское окно может иметь возможность реагировать на все интересующие его события.
413
Наиболее важно при работе с элементами управления обоих типов помнить, что элемент управления — это окно, и все, что вы уже знаете о манипулировании окнами, применимо при манипулировании элементами управления. Также запомните, что все, что вы уже знаете о работе с предопределенными диалоговыми элементами управления относится и к работе с элементами управления общего пользования. Фактически, только один элемент управления
— усовершенствованный редактор — является расширенным окном редактирования, поддерживающим такой же базовый набор стилей управления, сообщений и уведомлений как и оригинал (плюс некоторые новые возможности). Все что вы уже знаете о работе с обычным окном редактирования, поможет вам в дальнейшем при работе с усовершенствованным редактором.
Так же как и при работе с предопределенными элементами управления, преимущества от использования элементов управления общего пользования состоят в том, что, считая каждый из этих элементов "черным ящиком", вы получаете множество возможностей с минимумом затрат с вашей стороны. Ключевым моментом для работы с элементами управления общего пользования является понимание управления и конфигурирование набора конкретных средств таким образом, чтобы при минимальных затратах добиться нужного поведения и внешнего вида элемента управления. Узнав о возможностях, остается только добиться того, чтобы сделать элемент управления работающим на вас.
Инициализация библиотеки
Все элементы управления общего пользования, за исключением усовершенствованного редактора, находятся в файле COMCTL32.DLL, который впервые появился в Microsoft Windows NT 3.51 и Windows 95. (По имени этой
DLL можно было бы предположить, что где-то существует 16-разрядная версия этой библиотеки. Microsoft сообщала, что не планирует выпуск 16-битной версии библиотеки элементов управления общего пользования. Microsoft сделала доступными некоторые элементы похожей библиотеки элементов управления общего пользования, поставляемой с Microsoft Windows for Workgroups 3.11, но эта библиотека никогда не поддерживалась официально, и не входит в существующие версии операционных систем Microsoft.)
Для использования какого-либо элемента управления общего пользования программа сначала вызывает функцию InitCommonControls, которая регистрирует классы окон элементов управления, используя функцию RegisterClass. Функция InitCommonControls не имеет параметров и не возвращает никакого значения:
InitCommonControls();
Описание этой функции вместе с другими описаниями, необходимыми для использования библиотеки элементов управления общего пользования, находится в файле COMMCTRL.H. Этот файл не является частью основной группы файлов, на которые имеет ссылки файл WINDOWS.H. Поэтому, любой исходный файл, ссылающийся на функции элементов управления общего пользования, типы данных, символические константы, должен обязательно содержать следующую строку:
#include <commcrtl.h>
Для того чтобы помочь компоновщику в поиске функций элементов управления общего пользования, некоторые ссылки должны быть сделаны на статическую библиотеку элементов управления общего пользования COMCTL32.LIB. Ваша среда разработки могла уже включить такую ссылку. Если ее нет, то компоновщик выведет сообщение такого вида:
error: unresolved external symbol __imp__InitCommonControls@0
Для решения этой проблемы добавьте файл COMCTL32.LIB в список компонуемых библиотек.
Ввиду размера и сложности усовершенствованного редактора, он располагается в его собственной динамически подключаемой библиотеке RICHED32.DLL. (Microsoft не собирается выпускать библиотеку RICHED16.DLL.) Усовершенствованный редактор регистрирует самого себя при загрузке этой библиотеки, которую вы вызываете посредством функции LoadLibrary:
LoadLibrary( "RICHED32.DLL");
Описания усовершенствованного редактора находятся в файле RICHEDIT.H, а связанные с OLE описания для него находятся в файле RICHOLE.H.
Создание элементов управления общего пользования
Наиболее общий путь создания окна элемента управления общего пользования состоит в вызове функции
CreateWindow или CreateWindowEx. (Функция CreateWindowEx идентична функции CreateWindow, с тем исключением, что она использует дополнительные стили. Эти стили окна рассматриваются в следующем разделе.) Например, приведенный вызов строит панель инструментов:
414
HWND hwndToolBar = CreateWindow( TOOLBARCLASSNAME, NULL,
CCS_TOP | WS_CHILD | WS_VISIBLE | WS_BORDER | WS_CLIPSIBLINGS, 0, 0, 0, 0,
hwndParent, (HMENU) 1, hInst,
0
);
Рассмотрение некоторых параметров мы пока отложим. Имя класса окна не задается в кавычках, поскольку это символическая константа, определение которой зависит от набора символов, выбранного при построении программы. Для набора символов ANSI символическая константа TOOLBARCLASSNAME заменяется строкой "ToolbarWindow32"; для набора символов UNICODE символ "L" ставится перед этим именем (L"ToolbarWindow32") для создания UNICODE-строки. Все классы элементов управления общего пользования определяются этим способом.
Чаще всего элементы управления общего пользования создаются как дочерние окна, что определяется заданием флага WS_CHILD и установкой описателя родительского окна hwndParent. Как показано в примере, дочерние окна часто создаются с начальным местоположением (x, y) и размерами (cx, cy) равными нулю, а затем изменяют свой размер при изменении размеров родительского окна (т. е. когда родительское окно получает сообщение WM_SIZE).
Альтернативой вызову функции CreateWindow является вызов специализированной функции создания элемента управления, которая обычно выполняет некоторую стандартную инициализацию. Примером специализированной функции создания элемента управления является функция CreateToolbarEx, строящая панель инструментов, и добавляющая в нее кнопки. В других случаях, таких как набор страниц свойств и страница свойств, имя класса недоступно, поэтому требуется вызов специализированной функции: PropertySheet строит набор страниц свойств, а CreatePropertySheetPage строит индивидуальные страницы свойств. Список изображений строится вызовом функции ImageList_Create — специализированной функции, поскольку список изображений не является окном. На рис. 12.2 приведены все имена классов элементов управления общего пользования и функции их создания.
Категория/Элемент управления |
Класс элемента управления |
Функция создания |
Элементы управления главного окна |
CreateToolbarEx |
|
Панель инструментов |
TOOLBARCLASSNAME |
|
Окно подсказки |
TOOLTIPS_CLASS |
Нет |
Строка состояния |
STATUSCLASSNAME |
CreateStatusWindow |
Анимационное изображение |
ANIMATE_CLASS |
Нет |
Индикатор процесса |
PROGRESS_CLASS |
Нет |
Составные диалоговые элементы управления |
CreatePropertySheetPage |
|
Страница свойств |
Нет |
|
Набор страниц свойств |
Нет |
PropertySheet |
Элементы управления Windows Explorer |
|
|
Дерево просмотра |
WC_TREEVIEW |
Нет |
Список просмотра |
WC_LISTVIEW |
Нет |
Список изображений |
Нет |
ImageList_Create |
|
Другие элементы управления |
MakeDragList |
Список, поддерживающий операции |
"listbox" (ANSI) или L"listbox" |
|
типа drag/drop |
(UNICODE) |
|
Заголовок списка просмотра |
WC_HEADER |
Нет |
Горячая клавиша |
HOTKEY_CLASS |
Нет |
Усовершенствованный редактор |
"RichEdit" (ANSI) или |
Нет |
|
L"RichEdit" (UNICODE) |
|
Набор закладок для выбора |
WC_TABCONTROL |
Нет |
Окно с движком для выбора значения |
TRACKBAR_CLASS |
Нет |
из диапазона |
|
CreateUpDownControl |
Полоса прокрутки, связанная с окном |
UPDOWN_CLASS |
|
редактирования для изменения |
|
|
значения |
|
|
Рис. 12.2 Имена классов и функции создания элементов управления общего пользования
Стили элементов управления общего пользования
Необходимо приложить немало усилий при создании любого типа окна — вашего собственного окна, предопределенного элемента управления или элемента управления общего пользования. Эта работа состоит в выборе правильных флагов стиля окна. (Вспомните, флаги стиля объединяются побитовой операцией OR языка C и передаются вместе как один из двух параметров в функцию CreateWindowEx : или как первый параметр
415
dwExStyle, или как четвертый — dwStyle.) Эта работа достаточна трудна, поскольку флаги стиля влияют на широкий диапазон возможностей, включающих визуальное представление окна (или отсутствие отображения, если флаг WS_VISIBLE пропущен по невнимательности), поведение окна и конкретные типы взаимодействия между окнами.
При создании элементов управления общего пользования существует четыре набора флагов стиля: флаги основного стиля окна (WS_), флаги основного стиля элемента управления общего пользования (CCS_), флаги стиля, специфичные для конкретного элемента управления и флаги расширенного стиля (WS_EX_). Флаги первого из перечисленных типов передаются в функцию CreateWindowEx в качестве четвертого параметра; флаги последнего типа передаются в функцию CreateWindowEx в качестве первого параметра.
Основные стили окна
Основные стили окна имеют имена, начинающиеся с префикса WS_ и могут влиять на окна любого класса. Из примерно двадцати этих стилей окна семь применяются к элементам управления общего пользования: WS_CHILD, WS_VISIBLE, WS_DISABLED, WS_BORDER, WS_TABSTOP, WS_CLIPCHILDREN и WS_CLIPSIBLINGS.
Любое окно элемента управления общего пользования будет использовать бит стиля WS_CHILD, что делает элемент управления дочерним по отношению к какому-то родительскому окну, на поверхности которого будет расположен элемент управления. Когда элемент управления посылает уведомляющие сообщения, он посылает их родительскому окну. Дочерние окна автоматически удаляются при удалении их родительского окна.
Флаг стиля WS_VISIBLE позволяет окну быть отображенным (тем не менее наличие этого флага не гарантирует того, что окно не сможет быть перекрыто другим окном). Частой программной ошибкой является отсутствие флага стиля WS_VISIBLE, что заставляет программиста повсюду (в книгах, журналах, службах поддержки online) искать причину того, что окно не отображается ("потерялось"). Изменяйте, если необходимо, видимость окна после его создания с помощью функций ShowWindow или SetWindowPos.
Флаг WS_DISABLED делает окно запрещенным, т. е. такое окно не получает сообщений от мыши и клавиатуры. Наиболее общее использование этого флага состоит в запрещении элемента управления в диалоговом окне; будучи запрещенными, большинство элементов управления изменяют свой вид, чтобы дать пользователю понять, что они в данный момент недоступны. Например, кнопка OK в диалоговом окне File Open запрещена до тех пор, пока в поле редактирования имени файла — пусто. Кнопка становится разрешенной (доступной), когда какой-либо текст введен в окно задания имени файла. Окно создается один раз с использованием функции CreateWindow, а вызовы функций EnableWindow позволяют делать это окно запрещенным или разрешенным.
Флаг WS_BORDER вызывает появление рамки вокруг окна элемента управления.
Если элемент управления находится в диалоговом окне, то использование флага WS_TABSTOP включает его в список переходов по клавише <Tab>.
Флаги WS_CLIPCHILDREN и WS_CLIPSIBLINGS защищают поверхность дочерних окон от внешнего разрушения. Термин "отсечение" (clipping) относится к прорисовке границ между окнами. В то время, как отсечение всегда разрешено для перекрывающихся и всплывающих окон, оно запрещено для дочерних окон. Флаг WS_CLIPCHILDREN разрешает отсечение, когда рисуется родительское окно дочерних окон, тем самым предотвращая рисование в родительском окне на дочерних окнах. Флаг WS_CLIPSIBLINGS разрешает отсечение между дочерними окнами, имеющими общее родительское окно, для предотвращения соперничества между ними — борьбы между двумя дочерними окнами, имеющими общего родителя, за пиксели в перекрывающихся участках. При работе с дочерними окнами эти два стиля помогают решить проблемы непонятного визуального представления этих окон.
Флаги расширенного стиля окна
Флаги расширенного стиля окна имеют имена, начинающиеся с префикса WS_EX_, и передаются в функцию CreateWindowEx в качестве первого параметра. Из 27 расширенных стилей 3 относятся к созданию дочерних окон: WS_EX_CLIENTEDGE, WS_EX_STATICEDGE и WS_EX_NOPARENTNOTIFY.
Флаги стиля WS_EX_CLIENTEDGE и WS_EX_STATICEDGE поддерживают трехмерность изображения. Надлежащее их использование позволяет приложению хорошо выглядеть по отношению к другим приложениям Windows 95. Обратите внимание, что эти флаги стиля поддерживаются только в Windows 95 и версиях Windows NT, имеющих интерфейс системы Windows 95. (Эти флаги не имеют никакого эффекта в более ранних версиях операционной системы.)
Флаг стиля WS_EX_CLIENTEDGE строит "углубленную" область основной рабочей зоны приложения. Например, окно текста программы текстового процессора. Так как большинство элементов управления, таких как панель инструментов и строка состояния, создаются вне этой области, избегайте этих флагов стиля для родительских окон панели инструментов и строки статуса. Кроме того, избегайте использования флага стиля
416
WS_EX_OVERLAPPEDWINDOW, который включает как часть своего определения флаг стиля
WS_EX_CLIENTEDGE.
Флаг стиля WS_EX_STATICEDGE создает углубленное представление только для окон, в которые осуществляется вывод. Например, уведомляющее окно на панели задач Windows 95 — маленькое окно у правого края панели задач, содержащее значки строки состояния и часы — использует этот стиль. Этот флаг используется с такими элементами управления как индикатор процесса и окно анимационного изображения. Кроме того, элементы управления, предназначенные только для вывода, входящие в состав строки состояния или панели инструментов, будут, вероятно, использовать этот флаг стиля, так как его уникальное представление легко понимается опытным пользователем Windows 95.
Флаг стиля WS_EX_NOPARENTNOTIFY отменяет посылку уведомляющих сообщений WM_PARENTNOTIFY дочерним окном родительскому. Без установки этого бита дочернее окно посылает уведомляющие сообщения своему родительскому окну, когда дочернее окно создается, уничтожается или получает сообщение о нажатии клавиш мыши. Элементы управления диалогового окна всегда строятся с использованием этого флага для снижения трафика сообщений.
Флаги основного стиля элемента управления общего пользования
Библиотека элементов управления общего пользования поддерживает набор значений стиля с префиксом CCS_ для использования с панелями инструментов, окнами состояния и заголовками списка просмотра. Это флаги
CCS_ADJUSTABLE, CCS_BOTTOM, CCS_NODIVIDER, CCS_NOMOVEY, CCS_NOPARENTALIGN, CCS_NORESIZE и CCS_TOP. Поскольку смысл этих флагов стиля зависит от конкретного элемента управления, при дальнейшем рассмотрении мы будем обращать ваше внимание на детали.
Флаги стиля, специфичные для конкретного элемента управления |
|
|
|
|
|
|||||
Элементы |
управления |
общего |
пользования |
Windows |
95 |
так |
же |
как |
и |
пред- |
определенные |
элементы |
управления |
диалогового |
окна имеют |
специфичные |
флаги |
стиля, |
такие |
как |
BS_PUSHBUTTON, ES_MULTILINE, LBS_SORT. Так же как и предопределенные элементы управления, каждый стиль элемента управления общего пользования имеет уникальный префикс. Все эти префиксы приведены в таблице на рис. 12.3. Более простые элементы управления общего пользования не имеют специфичных флагов стиля.
Детальное рассмотрение индивидуальных флагов стилей будет приведено позднее в этой главе при подробном описании конкретных элементов управления общего пользования.
Категория/Элемент управления |
Префикс флага стиля |
Пример |
Элементы управления главного окна |
|
|
Панель инструментов |
TBSTYLE_ |
TBSTYLE_ALTDRAG |
Окно подсказки |
Нет |
|
Строка состояния |
SBARS_ |
SBARS_SIZEGRIP |
Анимационное изображение |
ACS_ |
ACS_AUTOPLAY |
Индикатор процесса |
Нет |
|
Составные диалоговые элементы управления |
||
Страница свойств |
Нет |
|
Набор страниц свойств |
Нет |
|
Элементы управления Windows Explorer |
|
|
Дерево просмотра |
TVS_ |
TVS_HASBUTTONS |
Список просмотра |
LVS_ |
LVS_ALIGNLEFT |
Список изображений |
Нет |
|
Другие элементы управления |
|
|
Список, поддерживающий |
Нет |
|
операции типа drag/drop |
|
|
Заголовок списка просмотра |
HDS_ |
HDS_BUTTONS |
Горячая клавиша |
Нет |
|
Усовершенствованный редактор |
ES_ |
ES_DISABLENOSCROLL |
Набор закладок для выбора |
TCS_ |
TCS_BUTTONS |
Окно с движком для выбора значения |
TBS_ |
TBS_AUTOTICKS |
из диапазона |
|
|
Полоса прокрутки, связанная с окном |
UDS_ |
UDS_ALIGNLEFT |
редактирования для |
|
|
изменения значения |
|
|
Рис. 12.3 Префиксы флагов стилей элементов управления общего пользования
417
Посылка сообщений элементам управления общего пользования
После создания окна элемента управления общего пользования для управления его действиями ему посылаются сообщения. Как можно предположить, для этого требуется вызов функции SendMessage с ее традиционными четырьмя параметрами: описатель окна, идентификатор сообщения, значение wParam, значение lParam. Так же как существуют специфические флаги стилей элементов управления общего пользования, так и существуют специфические сообщения.
Альтернативой вызовам функции SendMessage является использование набора макросов языка C, определенных в файле COMMCTRL.H, которые получают специфичный для сообщения набор параметров, осуществляют необходимые преобразования (например, упаковка двух величин типа shorts в одну величину типа lParam), а затем вызывают функцию SendMessage. Возвращаемое значение с целью минимизации числа сообщений компилятора также преобразуется к нужному типу, поскольку значение типа LRESULT, возвращаемое функцией SendMessage, не совпадает с ожидаемым типом возвращаемого значения.
В качестве примера того, как удобны эти макросы, посылающие сообщения элементам управления, рассмотрим сообщение TVM_INSERTITEM для добавления элемента в дерево просмотра. Это сообщение добавляет простой элемент в дерево просмотра. Ниже приведено выражение, использующее вызов функции SendMessage:
hItem =(HTREEITEM)SendMessage( hwndTV, TVM_INSERTITEM, 0,(LPARAM)(LPTV_INSERTSTRUCT)&tvis );
Ниже показано, как послать то же самое сообщение, используя макрос TreeView_InsertItem:
hItem = TreeView_InsertItem(hwndTV, &tvis);
Макрос проще для чтения (имя макроса содержит имя класса окна и имя сообщения), он требует только половину параметров, а дает тот же результат, поскольку он расширяется в вызов функции SendMessage с соответствующим преобразованием параметров. Перейдя однажды на работу с макросами, обратно вернуться будет уже трудно.
(Если вам интересно использование набора аналогичных макросов для предопределенных элементов управления, то вы можете найти их определения в файле WINDOWSX.H. Макросы не документированы ни в одном файле помощи. Они достаточно хорошо сами себя объясняют и просты в использовании. Так же как и применение макросов для элементов управления общего пользования, так и использование макросов из файла WINDOWSX.H может сделать программу проще для написания и чтения.)
Несмотря на то что такие макросы очень полезны, файлы Win32, к сожалению, включают определения лишь для половины элементов управления общего пользования. Файл COMMCTRL.H содержит лишь макроопределения для следующих классов: анимационное изображение, заголовок списка просмотра, список просмотра, набор страниц свойств (в файле PRSHT.H), дерево просмотра и набор закладок для выбора.
Поскольку эти макросы так удобны, на прилагаемом к книге компакт-диске вы найдете набор макросов для других элементов управления общего пользования. Там находятся макросы для следующих классов: горячая клавиша, индикатор процесса, усовершенствованный редактор, строка состояния, панель инструментов, окно подсказки, окно с движком для выбора значения из диапазона и полоса прокрутки, связанная с окном редактирования для изменения значения. Эти макросы находятся в файле \PETZOLD\CHAP12\COMCTHLP.H.
Рис. 12.4 Программа CTLMACRO обеспечивает быстрый доступ к макросам сообщений элементов управления общего пользования
На прилагаемом компакт-диске находится также программа CTLMACRO, которая каталогизирует все макросы элементов управления общего пользования. Как показано на рис. 12.4, программа CTLMACRO элементизирует все макросы элементов управления общего пользования иерархически, и они доступны посредством простого дерева просмотра. Когда вы найдете сообщение, которое вам необходимо, нажмите кнопку Copy для копирования