- •Часть 2 (продолжение): Прикладное программирование в Windows
- •Глава 8. Виртуальное окно: работа с текстом
- •8.1. Оконные координаты, цвета, отображение строк
- •Кодировка rgb-значений
- •Размеры системных метрик
- •8.2. Виртуальное окно
- •Способы заполнения прямоугольной области
- •8.3. Изменение шрифтов
- •Макроимена распространенных шрифтов
- •8.4. Создание собственных шрифтов
- •Глава 9. Программирование графики
- •9.1. Логическая система координат
- •Рекомендуемый самый яркий состав цветов
- •9.2. Пиксели, линии, дуги, прямоугольники, эллипсы и секторы
- •9.3. Работа с перьями и кистями
- •Типы линий, создаваемых пером
- •9.4. Технология виртуального окна
- •9.5. Режимы отображения и области вывода
- •Текущий режим отображения (mappind mode)
- •Глава 10. Работа с панелями инструментов
- •10.1. Общие элементы управления
- •Общие элементы управления
- •10.2. Подключение и инициализация общих элементов управления
- •10.3. Работа с панелью инструментов
- •Начальные состояния кнопок панели инструментов
- •Стиль кнопки определяется (значения поля fsStyle)
- •Сообщения к панели инструментов
- •10.4. Создание растрового изображения для панели инструментов
- •10.5. Включение подсказок
- •Глава 11. Спины, ползунки и индикаторы процессов
- •11.1. Работа со спином
- •Стили «up-down control»
- •Сообщения, которые можно посылать спину
- •11.2. Создание спина с «приятельским» окном
- •11.3. Работа с ползунком
- •Значения стилей для ползунка
- •Перечень сообщений, которые можно посылать ползунку
- •Перечень нотификационных сообщения ползунка
- •11.4. Индикатор процесса
- •Управляющие сообщения индикатору
- •Глава 12. Многозадачность: процессы и потоки
- •12.1. Создание нового процесса (отдельной задачи)
- •Разрешенные значения поля dwFlags
- •12.2. Многопотоковые программы
- •12.3. Работа с несколькими потоками
- •12.4. Синхронизация процессов и потоков: семафоры
- •12.5. Обработка событий
- •Глава 13. Приемы программного управления вычислительным процессом
- •13.1. Использование функций Проводника Explorer для работы в файловой системе
- •Управляющая информация Проводника
- •Режимы обработки файлов
- •13.2. Создание собственных динамических библиотек (dll-файлов)
- •13.3. Работа с буфером обмена Clipboard
- •Функции подсистемы Clipboard
- •Свойства выделяемого блока памяти
- •Форматы и типы данных
- •Литература
8.2. Виртуальное окно
Проблема перерисовки. Предыдущая программа демонстрирует работу основных текстовых и системных функций Windows. Однако при ее выполнении снова возникает проблема, которая уже рассматривалась в гл. 3. Вы запускаете эту программу, отображаете текст, затем Ваше окно перекрывается другим окном – и текст теряется. Если же окно перекрывается не полностью, а частично, то пропадает часть текста. Решение проблемы состоит в том, что окно должно перерисовываться каждый раз при получении сообщения WM_PAINT, чего нет в нашем примере. Однако здесь возникает другой вопрос: какой механизм должно использовать это окно для перерисовки рабочей области? Как было сказано выше, имеется три основных метода. Напомним:
1) восстановить содержимое рабочей области, если оно формируется при помощи каких-либо вычислений;
2) можно запомнить последовательность событий и «проиграть» эту последовательность заново;
3) можно держать виртуальное окно и просто копировать его содержимое в рабочую область окна на экране каждый раз при получении сообщения VM_PAINT.
Наиболее общим методом является, конечно, последний, и мы им воспользуемся в данном случае. Как Вы увидите, Windows обеспечивает значительную поддержку этого метода.
Виртуальное окно. В этом разделе описывается алгоритм использования виртуального окна. Прежде всего необходимо создать контекст устройства, совместимый с контекстом реального окна. После этого весь вывод нужно направлять на виртуальное устройство, и каждый раз при получении сообщения WM_PAINT содержимое виртуального устройства должно копироваться на реальное устройство вывода (в реальное окно). Таким образом можно всегда сохранить содержимое окна, так что если окно было перекрыто другим окном, а затем снова стало активным, его содержимое всегда можно восстановить при получении сообщения WM_PAINT.
Дополнительные функции API. Поддержка виртуального окна осуществляется несколькими функциями API. Четыре из них – CreateCompatibleDC(), SelectObject(), GetStockObject() и BitBlt() – уже рассмотрены.
Кроме этих функций нам понадобятся функции
CreateCompatibleBitmap() и PatBlt(), которые описываются ниже.
Функция CreateCompatibleBitmap() создает в памяти растровое изображение, совместимое с заданным контекстом устройства. Это растровое изображение (bitmap) может использоваться при помощи ссылок на совместимый контекст устройства который создается при помощи функции CreateCompatibleDC(). Прототип этой функции таков:
HBITMAP CreateCompatibleBitmap(HDC hdc, int width, int height);
Здесь hdc представляет контекст устройства, с которым должно быть совместимо создаваемое растровое изображение. Размеры растра задаются параметрами width и heightи указываются в пикселях. Функция возвращает дескриптор созданного растра в случае успешного завершения и NULL – в случае возникновения ошибки.
Функция PatBlt() заполняет заданную прямоугольную область, используя цвет и способ заполнения, определяемый текущей кистью. Кисть (brush) – это объект, задающий способ заполнения окна (или области). Заполнение некоторой области при помощи кисти обычно называется рисованием области. Прототип функции PatBlt() выглядит так:
BOOL PatBlt(HDC hdc, int X, int Y, int width,
int height, DWORD dwRaster) ;
Здесь hdc представляет контекст устройства, на котором выполняется заполнение. Параметры Х и Y задают координаты верхнего левого угла прямоугольной области, которая будет заполняться. Размеры этой области задаются параметрами width и height. Параметр dwRaster определяет способ применения кисти и может принимать одно из следующих значений (табл. 8.3.):
Таблица 8.3
