Книга посвящена графическому программированию для Windows
с использованием Win32 GDI API. Кроме того в ней приведены
начальные сведения о DirectDraw и краткое введение в непосредственный режим Direct3D.
Рассматриваются стандартные возможности, поддерживаемые на всех платформах Win32,
32-разрядные возможности, реализованные только в Windows NT/2000,
и новейшие расширения GDI, появившиеся только в Windows 2000 и Windows 98.
В книге приведено множество фрагментов кода, подходящих для практического применения.
Помимо простейших тестовых и демонстрационных программ, вы найдёте в ней множество функций,
классов С++, драйверов, утилит и нетривиальных программ, вполне подходящих для использования
в коммерческих проектах.
На компакт-диске находятся полные исходные тексты, файлы рабочих областей
Microsoft Visual C++, заранее откомпилированные двоичные файлы (в отладочных и
окончательных версиях) и файлы в формате JPEG для глав, посвящённых графическим алгоритмам.
Оглавление
Введение
О чем эта книга Как организована эта книга Как читать эту книгу Что находится на компакт-диске Что дальше? От издательства
Глава 1. Основные принципы и понятия
Основы программирования для Windows на C/C++ Hello World, версия 1: запуск браузера Hello World, версия 2: вывод текста на рабочем столе Hello, World, версия 3: создание полноэкранного окна Hello, World, версия 4: вывод средствами DirectDraw Ассемблер Среда программирования Разработка и тестирование Компиляторы Microsoft Platform SDK Microsoft Driver Development Kit Microsoft Developer Network Формат исполняемых файлов Win32 Каталог импорта Каталог экспорта Архитектура операционной системы Microsoft Windows HAL Микроядро Драйверы устройств Управление окнами и графическая система Исполнительная часть Системные функции Системные процессы Службы Платформенные подсистемы Итоги Примеры программ
Глава 2. Архитектура графической системы Windows
Компоненты графической системы Windows Мультимедиа Video for Windows Still Image OpenGL Windows Media Компоненты режима ядра Драйверы режима ядра Архитектура GDI Функции, экспортируемые из GDI32.DLL Группы функций GDI Вызовы системных функций GDI От Win32 GDI API к системным функциям механизма GDI Архитектура DirectX Компоненты DirectX Архитектура DirectDraw Архитектура системы печати Клиент спулера Win32 Служба спулера Маршрутизатор спулера Провайдер печати Процессор печати Языковой монитор и монитор порта Процесс спулера изнутри Графический механизм Системные функции графического механизма Механизм графической визуализации Структуры данных графического механизма Преобразование в примитивы Шрифтовые драйверы Драйверы экрана Драйвер видеопорта и мини-драйвер видеопорта Назначение драйвера экрана Инициализация драйвера экрана Вывод на поверхность, перехват и возврат Дополнительные возможности драйвера Поддержка DirectDraw/Direct3D на уровне драйвера экрана Драйверы принтеров Управляющие драйверы принтеров от Microsoft Графическая библиотека DLL драйвера принтера Драйвер принтера для вывода документа HTML Итоги Примеры программ
Глава 3. Внутренние структуры данных GDI/DirectDraw
Манипуляторы и объектно-ориентированное программирование Класс и объект Инкапсуляция и маскировка реализации Указатели и манипуляторы Тождественное отображение Табличное отображение Когда манипулятора недостаточно Расшифровка манипуляторов объектов GDI Манипуляторы стандартных объектов - константы HGDIOBJ не является указателем Максимальное количество манипуляторов GDI на уровне процесса - 12 000 Максимальное количество манипуляторов GDI на уровне системы - 16 384 Часть HGDIOBJ содержит индекс Часть HGDIOBJ содержит тип объекта GDI Поиск таблицы объектов GDI Расшифровка таблицы объектов GDI Указатель pKernel ссылается на выгружаемый пул Поле nCount иногда используется как счетчик выбора объектов Поле nProcess связывает манипулятор GDI с конкретным процессом nUpper: дополнительная проверка nType: внутренний тип объекта pUser: указатель на структуру данных пользовательского режима Структуры данных пользовательского режима Структура данных пользовательского режима для кистей: оптимизация создания однородных кистей Структура данных пользовательского режима для регионов: оптимизация прямоугольных регионов Структура данных пользовательского режима для шрифтов: таблица значений ширины Структура данных пользовательского режима для контекста устройства: атрибуты Обращение к адресному пространству режима ядра WinDbg и расширение отладчика GDI Структуры данных режима ядра Таблица объектов GDI в механизме GDI Типы объектов GDI в механизме GDI Контекст устройства в механизме GDI Структура PDEV в механизме GDI Поверхности в механизме GDI Аппаратно-зависимые растры в механизме GDI DIB-секции в механизме GDI Кисти в механизме GDI Перья в механизме GDI Палитры в механизме GDI Регионы в механизме GDI Траектории в механизме GDI Шрифты в механизме GDI Другие объекты GDI в механизме GDI Структуры данных DirectDraw Итоги Примеры программ
4. Мониторинг графической системы Windows
Отслеживание вызовов функций Win32 API Построение программы мониторинга Внедрение DLL-разведчика Подключение к цепочке вызовов функций API Сбор информации Вывод данных Управляющая программа Отслеживание вызовов Win32 GDI Файл определения GDI API Декодер данных GDI Полный мониторинг API Отслеживание COM-интерфейсов DirectDraw Таблица виртуальных функций Определение DirectDraw API Модификация таблицы виртуальных функций Отслеживание системных вызовов GDI Отслеживание интерфейса DDI Итоги Примеры программ
Глава 5. Абстракция графического устройства
Современные видеоадаптеры Кадровый буфер Формат пикселов Двойная буферизация, z-буфер и текстуры Аппаратное ускорение Экранное устройство и перечисление режимов Контекст устройства Создание контекста устройства Получение информации о возможностях устройства Атрибуты в контексте устройства Связь контекста устройства с окном Графический вывод в многооконной среде Получение контекста устройства, связанного с окном Общий контекст устройства Классовый контекст устройства Закрытый контекст устройства Родительский контекст устройства Прочие контексты устройств Информационный контекст устройства Совместимый контекст устройства Метафайловый контекст устройства Формальное представление контекста устройства Пример: родовой класс рамочного окна Класс панели инструментов Класс строки состояния Класс холста Класс рамочного окна Тестовая программа Пример программы: графический вывод в контексте устройства Обновляемый регион окна Сообщение WM_PAINT Наглядное представление сообщений перерисовки окна Итоги Примеры программ
Глава 6. Системы координат и преобразования
Физическая система координат Система координат устройства Страничная система координат и режимы отображения Режим отображения MM_TEXT Режимы отображения MM_LOENGLISH и MM_HIENGLISH Режимы отображения MM_LOMETRIC и MM_HIMETRIC Режим отображения MM_TWIPS Режим отображения MM_ISOTROPIC Режим отображения MM_ANISOTROPIC Базовые точки окна и области просмотра Другие функции окна и области просмотра Мировая система координат Аффинные преобразования Функции мировых преобразований в Win32 API Использование мировых преобразований Использование систем координат Реализация преобразований в GDI Пример программы: прокрутка и масштабирование Игра го в классе KScrollCanvas Итоги Примеры программ
Глава 7. Пикселы
Объекты GDI, манипуляторы и таблица объектов Хранение объектов GDI Таблица объектов GDI Манипулятор объекта GDI API объектов GDI Обнаружение утечки объектов GDI Отсечение Конвейер отсечения Простые регионы Регион отсечения Метарегион Пять регионов контекста устройства Наглядное представление регионов в контексте устройства Цвет Цветовое пространство RGB Цветовое пространство HLS Индексируемые цвета и палитры Нетривиальные возможности Вывод пикселов Пример: множество Мандельброта Итоги Примеры программ
Глава 8. Линии и кривые
Бинарные растровые операции Режим заполнения фона и цвет фона Перья Объект логического пера Стандартные перья Простые перья Расширенные перья Получение информации о логических перьях Класс для работы с объектами перьев GDI Линии Кривые Безье PolyDraw Альтернативное определение кривых Безье Дуги Определение дуги в градусах: функция AngleArc Рисование дуг пером со стилем PS_INSIDEFRAME Преобразование дуг в кривые Безье Траектории Построение траектории Получение информации о траектории Преобразование объекта траектории Графические операции с использованием траекторий Преобразование пути в регион Пример: рисование нестандартных стилевых линий Итоги Пример программы
Глава 9. Замкнутые области
Кисти Объект логической кисти Стандартные кисти Пользовательские кисти Кисти системных цветов Структура LOGBRUSH Прямоугольники Прямоугольник как структура данных Рисование прямоугольников Прорисовка границ и элементов управления Эллипсы, секторы, сегменты и закругленные прямоугольники Многоугольники Режим заполнения многоугольников Замкнутые траектории Регионы Создание объекта региона Операции с объектами регионов Прорисовка регионов Градиентные заливки Градиентная заливка прямоугольников Применение градиентных заливок для создания объемных кнопок Практическое использование заливок Полупрозрачная заливка Реализация градиентных заливок в цветовом пространстве HLS Радиальные градиентные заливки Текстурные и растровые заливки Узорные заливки Итоги Пример программы
Глава 10. Основные сведения о растрах
Аппаратно-независимые растры Файловый формат BMP Упакованный аппаратно-независимый растр Разделенный аппаратно-независимый растр Класс для работы с DIB Отображение DIB в контексте устройства StretchDIBits Исходный прямоугольник Приемный прямоугольник и режимы масштабирования Преобразование цветового формата Растровая операция Пример использования функции StretchDIBits SetDIBitsToDevice Совместимые контексты устройств Аппаратно-зависимые растры CreateBitmap CreateBitmapIndirect GetObject и DDB CreateCompatibleBitmap и CreateDiscardableBitmap CreateDIBitmap LoadBitmap Копирование растров между форматами DIB и DDB Прямой доступ к массиву пикселов DDB Использование DDB-растров Отображение DDB-растров Использование растров в меню Использование растра в качестве фона окна CreateDIBSection Класс для работы с DIB-секциями Функции GetObjectType и GetObject для DIB-секций GetDIBColorTable и SetDIBColorTable Применение DIB-секций: аппаратно-независимый вывод Применение DIB-секций: вывод в высоком разрешении Итоги Примеры программ
Глава 11. Нетривиальное использование растров
Тернарные растровые операции Коды растровых операций Диаграмма тернарных растровых операций Часто используемые растровые операции Прозрачные растры Функция PlgBlt Кватернарные растровые операции: MaskBlt Цветовые ключи: TransparentBlt Прозрачность без маски Прозрачный вывод с использованием геометрических фигур Прозрачный вывод с использованием отсечения Предварительная подготовка изображений Альфа-наложение Пример альфа-наложения с постоянным коэффициентом Постепенное проявление и исчезновение растров Прозрачные окна Альфа-канал: класс AirBrush Имитация альфа-наложения Итоги Примеры программ
Глава 12. Графические алгоритмы и растры Windows
Прямой доступ к пикселам Аффинные преобразования растров Быстрые специализированные преобразования растров Преобразования цветов Преобразование растров в оттенки серого Гамма-коррекция Преобразование пикселов в растрах Родовой класс преобразований пикселов Родовой класс цветоделения Пример выделения каналов Гистограмма Пространственные фильтры Фильтры сглаживания и резкости Выделение границ и рельеф Морфологические фильтры Итоги Примеры программ
Глава 13. Палитры
Системная палитра Параметры экрана Получение системной палитры Статические цвета Логическая палитра Палитра по умолчанию Полутоновая палитра Создание специализированной палитры Сообщения палитры WM_QUERYNEWPALETTE WM_PALETTEISCHANGING WM_PALETTECHANGED Тестовая программа Палитра и растры Аппаратно-зависимые растры и палитры Аппаратно-независимые растры и палитры Индекс палитры в цветовой таблице DIB DIB-секции и палитра Квантование цветов Сокращение цветовой глубины растра Итоги Пример программы
Глава 14. Шрифты
Что такое шрифт? Наборы символов и кодировки Глифы Шрифт Семейство шрифтов и начертание Растровые шрифты Векторные шрифты Шрифты TrueType Формат файлов шрифтов TrueType Заголовок шрифта Максимальный профиль Отображение символов в индексы глифов Индексная таблица Данные глифов Инструкции глифа Горизонтальные метрики Кернинг Метрики OS/2 и Windows Другие таблицы Коллекции TrueType Установка и внедрение шрифтов Ресурсные файлы шрифтов Установка открытых шрифтов Установка закрытых шрифтов и шрифтов Multiple Master OpenType Установка шрифтов из образа в памяти Внедрение шрифтов Системная таблица шрифтов Итоги Примеры программ
Глава 15. Текст
Логические шрифты Метрики шрифтов в Windows Стандартные шрифты Создание логических шрифтов Подстановка шрифта Система подстановки шрифтов PANOSE Получение информации о логическом шрифте Метрики растровых и векторных шрифтов Метрики шрифтов TrueType/OpenType Структура LOGFONT и метрики шрифта Точность шрифтовых метрик Простой вывод текста Выравнивание текста Вывод текста справа налево Дополнительные интервалы Ширина символа Нетривиальный вывод текста Преобразование символов в глифы Кернинг Расположение символов Функция ExtTextOut Uniscribe Доступ к данным глифов Форматирование текста Вывод текста с табуляцией Простое абзацное форматирование Аппаратно-независимое форматирование текста Эффекты при выводе текста Цвет текста Начертания Геометрические эффекты Работа с текстом в растровом формате Текст как совокупность кривых Текст как регион Итоги Пример программы
Глава 16. Метафайлы
Общие сведения о метафайлах Создание расширенного метафайла Воспроизведение расширенного метафайла Получение информации о расширенном метафайле Передача расширенных метафайлов Строение расширенных метафайлов Записи EMF Классификация типов записей EMF Расшифровка записей EMF Простые объекты GDI в EMF Растры в EMF Регионы в EMF Траектории в EMF Палитры в EMF Системы координат в EMF Команды вывода в EMF Аппаратная независимость EMF Перечисление записей EMF Класс C++ для перечисления записей EMF Замедленное воспроизведение EMF Трассировка воспроизведения EMF Динамическое изменение EMF Построение производных метафайлов EMF как средство программирования Декомпилятор EMF Сохранение EMF-файла спулера Итоги Дополнительная информация Примеры программ
Глава 17. Печать
Знакомство со спулером Процесс печати Язык управления принтером Прямой вывод в порт Печать с использованием спулера Процессор печати EMF Перечисление принтеров Получение информации о принтере Настройка драйвера принтера Базовая печать средствами GDI Стандартные диалоговые окна печати Создание контекста устройства принтера Получение информации о контексте устройства принтера Последовательность формирования заданий печати Поддержка печати в программах Единая логическая система координат Имитация внешнего вида страницы Одновременный вывод страниц Печать нескольких страниц на одном листе Родовой класс печати Вывод в контексте устройства принтера Единицы измерения Текст Растры Печать графики в формате JPEG Итоги Дополнительная информация Примеры программ
Глава 18. DirectDraw и непосредственный режим Direct3D
Технология COM COM-интерфейсы COM-классы Создание COM-объекта HRESULT DirectX и COM Общие сведения о DirectDraw Интерфейс IDirectDraw7 Интерфейс IDirectDrawSurface7 Вывод на поверхности DirectDraw Подбор цветов Интерфейс IDirectDrawClipper Простое окно DirectDraw Построение графической библиотеки DirectDraw Вывод пикселов Вывод линий Заливка замкнутых областей Отсечение Внеэкранные поверхности Поддержка прозрачности посредством цветовых ключей Шрифт и текст Спрайты Непосредственный режим Direct3D Подготовка среды непосредственного режима Direct3D Изменение размеров окна Двухэтапный вывод Использование Direct3D в окне Текстурные поверхности Пример использования непосредственного режима Direct3D Итоги Примеры программ Алфавитный указатель
Комментарии
Андрей Мартынов
Это книга, которую не почитаешь по дороге на работу.
Для её перемещения нужна маленькая тележка. То, что называется фолиант...
Фень Юань (http://www.fengyuan.com), сотрудник исследовательской
лаборатории Hewlett-Packard в Ванкувере, подошёл к своей работе очень серьёзно.
Думаю он прекрасно понимал, что если и можно писать в наши дни книгу на такую тему,
то это должна быть этапная книга, книга подводящая черту, книга аккумулирующая
весь многолетний опыт использования GDI, и в тоже время книга,
отражающая самые последние новации GDI.
Надо сказать, что эта задача во многом выполнена. Более того,
наряду с очень подробным освящением основных аспектов
GDI-программирования, в книге также затронуты и многие смежные области.
Для меня, например, была очень интересна глава посвящённая архитектуре Windows.
В ней вы прочитаете то, о чём не прочитаете у Рихтера, сковавшего себя
рамками документированных функций Windows API. Надо сказать, что эта глава,
как и некоторые другие носит исследовательский характер. Автор сначала проводит
исследование, объясняет свои методы, создаёт инструменты исследования,
а затем, пользуясь ими, убедительно обосновывает свои выводы.
Таковы главы "Расшифровка манипуляторов GDI",
"Отслеживание вызовов функций Win32 API", и др.
Теме DirectDraw посвящена только одна, последняя глава, но прошу заметить,
что в этой книге, каждая глава это как небольшая книга!
А вот про GDI+ пока нет ни строчки. Но из источников, заслуживающих
доверия, известно, что автор книги перешёл на работу в Microsoft и
сейчас работает именно в команде разработчиков GDI+ !
Поэтому нет никаких сомнений в том, что в следующих изданиях
нам ещё предстоит прочесть главу про GDI+, и ещё раз убедиться в том, что
тема "Программирование графики для Windows" неисчерпаема.