Система Orphus

Программирование графики для Windows

Серия Мастер-класс

Автор: Фень Юань
Издательство: Питер, 2002
1072 страницы

Материал предоставил: Андрей Мартынов
Найти в магазинах

Аннотация

Оглавление
Комментарии

Аннотация

Книга посвящена графическому программированию для 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" неисчерпаема.