Программирование графики для windows
Программирование графики для Windows
Серия Мастер-класс
Автор: Фень Юань
Издательство: Питер, 2002
1072 страницы
Материал предоставил: Андрей Мартынов
Аннотация
Книга посвящена графическому программированию для Windows с использованием Win32 GDI API. Кроме того в ней приведены начальные сведения о DirectDraw и краткое введение в непосредственный режим Direct3D. Рассматриваются стандартные возможности, поддерживаемые на всех платформах Win32, 32-разрядные возможности, реализованные только в Windows NT/2000, и новейшие расширения GDI, появившиеся только в Windows 2000 и Windows 98. В книге приведено множество фрагментов кода, подходящих для практического применения. Помимо простейших тестовых и демонстрационных программ, вы найдёте в ней множество функций, классов С++, драйверов, утилит и нетривиальных программ, вполне подходящих для использования в коммерческих проектах.
На компакт-диске находятся полные исходные тексты, файлы рабочих областей Microsoft Visual C++, заранее откомпилированные двоичные файлы (в отладочных и окончательных версиях) и файлы в формате JPEG для глав, посвящённых графическим алгоритмам.
Оглавление
Глава 1. Основные принципы и понятия
Глава 2. Архитектура графической системы Windows
Глава 3. Внутренние структуры данных GDI/DirectDraw
4. Мониторинг графической системы Windows
Глава 5. Абстракция графического устройства
Глава 6. Системы координат и преобразования
Глава 8. Линии и кривые
Глава 9. Замкнутые области
Глава 10. Основные сведения о растрах
Глава 11. Нетривиальное использование растров
Глава 12. Графические алгоритмы и растры Windows
Глава 16. Метафайлы
Глава 18. DirectDraw и непосредственный режим Direct3D
Комментарии
Это книга, которую не почитаешь по дороге на работу. Для её перемещения нужна маленькая тележка. То, что называется фолиант.
Фень Юань (http://www.fengyuan.com), сотрудник исследовательской лаборатории Hewlett-Packard в Ванкувере, подошёл к своей работе очень серьёзно. Думаю он прекрасно понимал, что если и можно писать в наши дни книгу на такую тему, то это должна быть этапная книга, книга подводящая черту, книга аккумулирующая весь многолетний опыт использования GDI, и в тоже время книга, отражающая самые последние новации GDI. Надо сказать, что эта задача во многом выполнена. Более того, наряду с очень подробным освящением основных аспектов GDI-программирования, в книге также затронуты и многие смежные области.
Для меня, например, была очень интересна глава посвящённая архитектуре Windows. В ней вы прочитаете то, о чём не прочитаете у Рихтера, сковавшего себя рамками документированных функций Windows API. Надо сказать, что эта глава, как и некоторые другие носит исследовательский характер. Автор сначала проводит исследование, объясняет свои методы, создаёт инструменты исследования, а затем, пользуясь ими, убедительно обосновывает свои выводы. Таковы главы «Расшифровка манипуляторов GDI», «Отслеживание вызовов функций Win32 API», и др.
Теме DirectDraw посвящена только одна, последняя глава, но прошу заметить, что в этой книге, каждая глава это как небольшая книга!
А вот про GDI+ пока нет ни строчки. Но из источников, заслуживающих доверия, известно, что автор книги перешёл на работу в Microsoft и сейчас работает именно в команде разработчиков GDI+ ! Поэтому нет никаких сомнений в том, что в следующих изданиях нам ещё предстоит прочесть главу про GDI+, и ещё раз убедиться в том, что тема «Программирование графики для Windows» неисчерпаема.
Библиотека Интернет Индустрии I2R.ru
Малобюджетные сайты.
Продвижение веб-сайта.
Контент и авторское право.
Графика Windows и API. Создание векторного редактора. Часть 1
Известно, что многих программистов пугает сложность использования графики в Windows. Понятия дескрипторов, контекстов, шаблонов и т.п. вещей отпугивает многих. Но на самом деле, поняв концепцию и принципы графической подсистемы (GUI) вы сами увидите, что это несложная вещь.
Как и где рисует Windows
В Windows есть понятия дескрипторов (Handle) окна, дескрипторов контекста устройства и дескрипторов объекта, соответственно английские термины handle window (hWND), handle device context (hDC) и handle object (это общее название). Под hWND понимаются такие элементы как форма, кнопки, панели и т.д., с помощью этого дескриптора элементам передаются сообщения и данные, а вот с помощью hDC производятся графические операции с содержимым самого объекта.
Контекст устройства — структура, которая определяет набор графических объектов, их свойств и способов воздействия на объект. Графические объекты включают перо (pen) для линии, кисть (brush) для заполнения, битовая плоскость (bitmap) для копирования или прокручивания частей экрана, палитра (palette) для определения набора доступных цветов, регион (region) для усечения областей и других действий.
Дескриптор объекта — это вообще независимая штука, она может существовать отдельно от hWND и hDC (эти же работают в паре). К дескрипторам объекта (далее hOBJ) относятся перья системы рисования (Pen — цвет пера, толщина и тип линии), кисть, заполняющая область (Brush — цвет кисти, стиль и вид шаблона заполнения) и т.д.
Для осуществления операций вы всегда должны, затребовать какой — либо дескриптор. Затребовав hDC, вы обязаны вернуть его системе, иначе по истечению времени Windows прекратит все операция рисования и просто зависнет.
Поясним на примере понятия дескрипторов. Лист бумаги назовем оконным элементом, т.е. он имеет hWND, чтобы что-либо на нем нарисовать необходимо, получить его hDC. У вас есть три карандаша разного цвета (красный, черный, зеленый). Взяв карандаш в руки, производится выбор объекта в контекст листа бумаги. Затем, используя методы перемещения карандаша, вы рисуете по поверхности. Вот в принципе и все.
Общий принцип работы (упрощенно) можно свести к следующему:
- Получить через hWND, дескриптор контекста устройства hDC.
- Выбрать в контекст hDC нужный объект и сохранить предыдущее состояние.
- Произвести операцию.
- Вернуть старое содержимое контекста.
- Вернуть hDC в систему.
ВНИМАНИЕ! Когда вы создали объект и выбрали его в контекст, сохраните предыдущий объект. Затем после всех своих операций верните его в контекст и удалите созданный объект. Это очень важная операция.
Описание нашего редактора
Составим техническое задание на разработку. Написать редактор векторной графики, который позволял бы изменять свойства фигур (цвет, толщина линий и заливка областей), перемещал фигуры по плоскости и изменял их размеры. Для простоты используем всего две фигуры: прямоугольник и окружность. Нарисуем их сначала в фиксированных позициях и с заранее заданными свойствами. Выбор фигур (пока) производится через меню.
Начинаем проектирование и программирование
Не будем торопиться начинать рисовать, а посидим и подумаем. Больше всего времени занимает операция вывода на экран и как следствие мерцание. Следовательно, надо обойти эти ограничения.
Большинство коммерческих программ (например, кроме ErWin) используют принцип виртуального окна, т.е. окна находящегося в оперативной памяти с размерами и характеристиками области вывода на экране. Все операции рисования производятся с ним, а затем оно выводится в нужное место экрана (хотя необязательно на экран, но и на принтер), операцией копирования битовых плоскостей. Эффективность налицо.
А теперь от теорий перейдем к практике. Прочитайте описание функций и структур API графики, чтобы, далее понять работу программы.
Структуры и константы
Хранит координаты прямоугольника.
Public Type RECT
Left As Long
Top As Long
Right As Long
Bottom As Long
End Type
Хранит координаты точки.
Public Type POINTAPI
X As Long
Y As Long
End Type
Хранит параметры пера.
Public Type LOGPEN
lopnStyle As Long — стиль пера
lopnWidth As POINTAPI — толщина пера (это структура)
lopnColor As Long — цвет пера
End Type
Хранит параметры кисти.
Public Type LOGBRUSH
lbStyle As Long — стиль кисти
lbColor As Long — цвет кисти
lbHatch As Long — шаблон заполнения
End Type
Константы приведены не все, за полным списком обратитесь в SDK графики MSDN.
Public Const BS_SOLID = 0 — Полная заливка фигуры
Public Const BS_HATCHED = 2 — Стиль установки шаблона
Public Const HS_CROSS = 4 — Шаблон сетки
Public Const HS_BDIAGONAL = 3 — Диагональный шаблон
Public Const PS_SOLID = 0 — Сплошное перо
Public Const WHITENESS = &HFF0062 — Заливка шаблона белым цветом
Public Const SRCCOPY = &HCC0020 — Копирование битовых карт
Полную декларацию описания функций смотрите в исходном тексте. Где пропущено описание типа подразумевается тип Long.
GetDC (hwnd) — Получает дескриптор контекста устройства для указанного hWnd.
CreateCompatibleBitmap (HDC, nWidth, nHeight) — Создает совместимую битовую карту из контекста HDC размерами (nWidth, nHeight).
CreateCompatibleDC (HDC) — Создает совместимый дескриптор контекста из указанного HDC.
ReleaseDC (hwnd, HDC) — Удаляет дескриптор контекста HDC для дескриптора окна hWnd.
SelectObject (HDC, hObject) — Выбирает в контекст HDC объект, задаваемый дескриптором hObject.
PatBlt (HDC, x, y, nWidth, nHeight, dwRop) — Заполняет контекст HDC от координат (x,y,nWidth,hHeight) используя текущую кисть контекста в соответствии с операцией dwRop.
DeleteObject (hObject) — Удаляет дескриптор hObject.
DeleteDC (HDC) — Удаляет контекст HDC.
BitBlt (hDestDC, x, y, nWidth, nHeight, hSrcDC, xSrc, ySrc, dwRop) — Копирует битовую область, из контекста hSrcDC, начиная с координат (xSrc, ySrc) в соответствии с растровой операцией dwRop в битовую область контекста hDestDC в координаты (x, y, nWidth, nHeight).
InvalidateRect (hwnd, pRect As RECT, bErase) — Вызывает событие обновления поверхности окна для дескриптора окна hWnd в области прямоугольника, задаваемого координатами pRect. Если bErase равен истине, то производится очистка фона.
Rectangle (HDC, X1, Y1, X2, Y2) — Рисует прямоугольник в контексте HDC по координатам (X1, Y1, X2, Y2).
Ellipse (HDC, X1, Y1, X2, Y2) — Рисует окружность в контексте HDC по координатам (X1, Y1, X2, Y2).
Описание процедур программы
В форме Visual Basic свойство AutoRedraw установите в True, иначе при выводе виртуального окна будет происходить мерцание. Свойство ScaleMode установите в Pixels, т.к. все функции работаю с пикселями и для других единиц необходимо проводить преобразование.
Первым делом создаем виртуальное окно, процедурой CreateVirtualWindow. Вот её текст.
‘ В этой переменной хранится временный дескриптор контекста окна
Dim CDC As Long
‘ Получаем дескриптор контекста холста
CDC = GetDC(Me.hwnd)
‘ Создаем совместимый дескриптор
MDC = CreateCompatibleDC (CDC)
‘ Создаем совместимую битовую карту с картой битов холста
MBM = CreateCompatibleBitmap (CDC, RectForm.Right, RectForm.Bottom)
‘ Удаляем дескриптор
ReleaseDC Me.hwnd, CDC
‘ Выбираем битовую карту во временный контекст
SelectObject MDC, MBM
‘ Заливка области белым цветом (для простоты)
PatBlt MDC, 0, 0, RectForm.Right, RectForm.Bottom, WHITENESS
Пояснение. Используя функцию GetDC, получаем дескриптор контекста формы через hWND объекта Me. Затем нам надо создать совместимый контекст устройства для нашего виртуального окна, т.к. это должно быть два разных объекта, но с идентичными характеристиками. Все это производится функций CreateCompatibleDC, полученный hDC сохраняем в глобальной переменной MDC типа Long. Так как виртуальное окно, по сути битовая карта, то с помощью функции CreateCompatibleBitmap создаем битовую карту нашего окна с размерами указанными нами заранее (смотрите исходный текст в процедуру Form_Load) и полученный дескриптор сохраняем в глобальной переменной MBM типа Long. Затем, обратите внимание, удаляем временный дескриптор CDC через функцию ReleaseDC, это важная операция. Напоследок выбираем в наш контекст полученную битовую карту с помощью функции SelectObject. Очистку области производим с помощью функции PatBlt.
Уничтожение виртуального окна, производится процедурой DestroyVirtualWindow.
Sub DestroyVirtualWindow()
‘ Удалить битовую карту
DeleteObject MBM
‘ Удалить дескриптор
DeleteDC MDC
End Sub
Пояснение. После окончания работы приложения виртуальное окно должно быть уничтожено, чтобы освободить ресурсы. Первым удаляем битовую карту функцией DeleteObject, затем уничтожаем контекст функцией DeleteDC.
Вывод виртуального окна на экран, процедурой InvalidateCanvas.
Sub InvalidateCanvas()
‘ Используем переменную RectForm, чтобы ускорить операцию получения координат.
‘ Маленькая оптимизация.
Call InvalidateRect(Me.hwnd, RectForm, False)
‘ Заливка области белым цветом (для простоты)
PatBlt MDC, 0, 0, RectForm.Right, RectForm.Bottom, WHITENESS
‘ Перерисовать фигуры
Call DrawFigures(MDC, SHAPE_RECT)
Call DrawFigures(MDC, SHAPE_ELLIPSE)
‘ Вывести виртуальное окно на форму
BitBlt Me.HDC, RectForm.Left, RectForm.Top, RectForm.Right, RectForm.Bottom, MDC, 0, 0, SRCCOPY
End Sub
Пояснение. Чтобы вывести наше окно на экран, вызываем функцию InvalidateRect, которая посылает сообщение форме, что она должна перерисоваться (здесь кроется одна тонкость, связанная с событием Paint формы и свойством AutoRedraw, предлагаю вам самим с этим разобраться, тогда вы точно поймете тонкости рисования). Далее опять очищаем окно белым цветом. Выводим фигуры в окно через собственную процедуру DrawFigures. И самое главное, выводим виртуальное окно в форму через функцию битового копирования BitBlt.
Отображение фигуры на виртуальном окне, процедурой DrawFigures.
Sub DrawFigures(HDC As Long, IndexFigure As Byte)
‘ Дескрипторы пера
Dim NewPen, OldPen As Long
‘ Дескрипторы кисти
Dim NewBrush, OldBrush As Long
‘ Создаем перо из структуры заданной фигуры
NewPen = CreatePenIndirect(Figures(IndexFigure).Pen)
‘ Создаем кисть из структуры заданной фигуры
NewBrush = CreateBrushIndirect(Figures(IndexFigure).Brush)
‘ Выбираем созданные дескрипторы пера и кисти в контекст
OldPen = SelectObject(HDC, NewPen)
OldBrush = SelectObject(HDC, NewBrush)
Select Case Figures(IndexFigure).Shape
Case SHAPE_RECT:
Call ShapeRect(HDC, Figures(IndexFigure).Coord)
Case SHAPE_ELLIPSE:
Call ShapeEllipse(HDC, Figures(IndexFigure).Coord)
End Select
‘ Выбираем в контекст старые кисть и перо
‘ ЭТО ОЧЕНЬ ВАЖНАЯ ОПЕРАЦИЯ
SelectObject HDC, OldBrush
SelectObject HDC, OldPen
‘ Удаляем новые кисть и перо
‘ И ЭТО ОЧЕНЬ ВАЖНАЯ ОПЕРАЦИЯ
DeleteObject (NewBrush)
DeleteObject (NewPen)
End Sub
Пояснение. В данную процедуру передается дескриптор контекста и индекс типа фигуры, которую необходимо нарисовать. Далее используя функции CreatePenIndirect и CreateBrushIndirect, создаем из структур новое перо и кисть. Сохраняем полученные дескрипторы объектов в локальных переменных (после окончания процедуры они нам будут не нужны) NewPen и NewBrush типа Long. Выбираем новое перо и кисть в контекст, сохраняя при этом предыдущие значения в переменных OldPen и OldBrush, функцией SelectObject. Рисуем фигуры. Возвращаем предыдущие значения. Удаляем дескрипторы новых объектов. Все остальное вы поймете из исходных текстов, прилагаемых к статье.
Используя все вышеописанное, вы можете расширять возможности стандартных элементов Windows или писать свои. Например, добавить рисунки в ComboBox или ListBox. Поле для усовершенствований и оптимизации не ограниченно. Буду рад, если вы найдете интересные варианты и сообщите мне. В последующих статьях мы рассмотрим, как по щелчку мыши выбрать фигуру, переместить её или изменить размеры с помощью маркеров (как во всех векторных редакторах). Последняя статья будет посвящена разработке справочной системы для нашего проекта в двух стандартных системах справки — скомпилированном HTML и WinHelp.
Программирование графики для windows
Ф.Юань — Программирование графики для Windows
Издательство: Питер
ISBN: 5-318-00297-8
Страниц: 1072
Год: 2002
Формат: PDF
Размер: 14.5 Mb
От издателя
Книга посвящена графическому программированию для Windows с использованием Win32 GDI API. Кроме того, в ней приведены начальные сведения о DirectDraw и краткое введение в непосредственный режим Direct3D. Рассматриваются стандартные возможности, поддерживаемые на всех платформах Win32, 32-разрядные возможности, реализованные только в Windows NT/2000, и новейшие расширения GDI, появившиеся только в Windows 2000 и Windows 98. В книге приведено множество фрагментов кода, подходящих для практического применения. Помимо простейших тестовых и демонстрационных программ, вы найдете в ней множество функций, классов C++, драйверов, утилит и нетривиальных программ, вполне подходящих для использования в коммерческих проектах.
Ссылки для ознакомления:
depositfiles
ifolder
Комментариев: 0 +
Кристиан Нейгел, Билл Ивьен, Д. Глинн, Уотсон, Морган Скиннер — C# 4.0 и платформа .NET 4 для профессионалов
Издательство: Вильямс
ISBN: 978-5-8459-1656-3
Год: 2010
Страниц: 1440
Формат: DJVU + CD
Размер: 65 Mb
Бьерн Страуструп — Программирование. Принципы и практика использования C++
Издательство: Вильямс
ISBN: 978-5-8459-1705-8
Год: 2011
Страниц: 1246
Формат: DJVU
Размер: 20 Mb
Роберт Мартин — Чистый код. Создание, анализ и рефакторинг
Издательство: Питер
ISBN: 978-5-49807-381-1
Год: 2010
Страниц: 464
Формат: DJVU
Размер: 6.4 Mb
Назарр К., Рихтер Дж. — Windows via C/C++. Программирование на языке Visual C++
Издательство: Питер, Русская Редакция
ISBN: 978-5-7502-0367-3
Год: 2009
Страниц: 896
Формат: DOCX
Размер: 15 Mb
Трей Нэш — C# 2010. Ускоренный курс для профессионалов
Издательство: Вильямс
ISBN: 978-5-8459-1638-9
Год: 2010
Страниц: 592
Формат: DJVU
Размер: 9 Mb
Лаптев В.В. — C++. Объектно-ориентированное программирование
Издательство: Питер
ISBN: 978-5-91180-200-4
Год: 2008
Страниц: 464
Формат: DJVU
Размер: 8.2 Mb
Алекс Макки — Введение в .NET 4.0 и Visual Studio 2010 для профессионалов
Издательство: Вильямс
ISBN: 978-5-8459-1639-6, 978-1-43-022455-6
Год: 2010
Страниц: 416
Программирование графики для windows
Секреты программирования трехмерной графики для Windows 95
Секреты программирования трехмерной графики для Windows 95
Пер. с англ. — Спб.: Питер, 1997. — 352 c.; ил.
До недавнего времени считалось, что трехмерный синтез в реальном времени на РС возможен только под DOS, где программист обладает полной свободой в обращении с аппаратными средствами компьютера. Тем более невозможно было представит быструю трехмерную графику в среде Windows — низкая производительность интерфейса графических устройств GDI не позволяла даже думать об этом. Однако ситуация в корне изменилась с появлением Direct3D, новой библиотеки семейства DirectX. Direct3D поддерживает весь основной набор функций, необходимых для работы с трехмерной графикой — создание трехмерных макетов, выбор источника света и параметров камеры, работу с текстурами и материалами, при этом по производительности не уступая DOS-приложениям.
Книга, написанная опытным программистом, раскрывает перед читателями основные принципы программирования трехмерной графики для Windows, помогает освоиться с Direct3D и открывает широкие возможности для самостоятельных экспериментов. В ней содержится множество программ-примеров. Все программы написаны на С++.
Глава «Наше первое трехмерное приложение» предлагает создать приложение для Windows, которое отображает в окне несколько трехмерных объектов. Для написания «скелета» приложения автор пользуется Microsoft Visual C++ и Microsoft Foundation Classes (MFC). Затем остается добавить около 50 строк для вызова функций библиотеки 3dPlus — и все готово!
После этого автор переходит к построению приложения с более хитроумной структурой, которое будет совершенствоваться по мере усвоения материала книги. По своей структуре новое приложение напоминает созданное в первой главе, за тем исключением, что в нем присутствует меню и панель инструментов, а трехмерное окно создается несколько иначе.
В главе «Интерфейсы и классы» кратко рассматриваются интерфейсы механизма визуализации Direct3D, а также классы С++ из библиотеки 3dPlus, которые пользуются этими интерфейсами.
В следующей главе читателю предлагается снова вернуться к программированию и научиться создавать собственные трехмерные фигуры.
Глава «Преобразования» учит перемещать объекты внутри макета, применяя к ним различные преобразования (называемые также «трансформациями»). Кроме того, читатель узнает, как с помощью определенных преобразований изменять положение, ориентацию и размеры объектов.
Следующий раздел посвящен перемещениям объектов внутри макета и раскрывает несколько способов приведения объектов в самостоятельное движение.
Одной из распространенных задач, возникающих при работе с трехмерной графикой, является выяснение, принадлежит ли точка в трехмерном окне какому-либо из видимых объектов. Решению этой задачи посвящена глава «Проверка попадания».
В главе «Цвет и текстуры» читатель научится работать с цветом, загружать фоновое изображение и накладывать текстуры на объекты. Из главы «Спрайты» он узнает, как можно пользоваться плоскими фигурами для создания персонажей в интерактивной трехмерной игре.
Глава «Свет и тень» рассматривает все разновидности источников света, которые могут встретиться в создаваемых приложениях, знакомит с их свойствами и объясняет, с какими накладными расходами сопряжено использование каждого из них. Также автор показывает, каким образом можно имитировать тени в макете.
В главе «Клипы» рассматривается пара способов для создания клипов. Первый заключается в покадровой съемке макета, а второй — в запоминании положения и ориентации движущейся фигуры.
Отдельные главы посвящены интерфейсу DirectDraw, который открывает перед пользователем низкоуровневый доступ к видеоадаптеру, и непосредственному режиму Direct3D — прослойке, расположенной над DirectDraw и предназначенной для вывода точек, линий и треугольников.
В приложении содержатся некоторые рекомендации по работе с отладчиком Microsoft Visual C++ в удаленном режиме, а также сведения об отладчике ядра Microsoft Windows (Wdeb386), входящего в состав Win32 SDK.
В книге имеется глоссарий, библиография и алфавитный указатель.
Книги для обзорапредоставлены магазином
«Сельхозкнига»,Минск, пр. Ф. Скорины, 92