КГ_6глава (Компьютерная графика)
Описание файла
Файл "КГ_6глава" внутри архива находится в папке "Компьютерная графика". Документ из архива "Компьютерная графика", который расположен в категории "". Всё это находится в предмете "инженерная графика" из 4 семестр, которые можно найти в файловом архиве РТУ МИРЭА. Не смотря на прямую связь этого архива с РТУ МИРЭА, его также можно найти и в других разделах. Архив можно найти в разделе "книги и методические указания", в предмете "компьютерная графика" в общих файлах.
Онлайн просмотр документа "КГ_6глава"
Текст из документа "КГ_6глава"
Разработка графических программ для Windows
Цая разработки разнообразных программ для операционной системы Windows существует много инструментальных средств. Различные средства могут воплощать в практику различные методологические подходы. Одну и ту же программу можно изготовить, как правило, несколькими способами. В том числе и графическую программу.
Мы будем использовать язык программирования C++, а если говорить точнее, то преимущественно обычный С. Везде, где это возможно, будем обходиться простыми языковыми средствами. Такие элементы C++, как классы, будем использовать только там, где они действительно необходимы, и где без них трудно обойтись. Не следует считать это отказом от современных технологий, например, от объектно-ориентированного и компонентного программирования, визуальной технологии разработки программ. Я с большим уважением отношусь к этим действительно эффективным технологиям, но здесь они практически бесполезны (во всяком случае, последние две).
Для того чтобы сосредоточиться на особенностях программирования именно графики, при написании наших учебных программ мы не будем отвлекаться на другие аспекты программирования (например, разработку пользовательского интерфейса). Такое упрощение, как представляется, позволит детальнее ознакомиться с компьютерной графикой изнутри. Если не знать графику, то компоненты и визуальное программирование не помогут. Последнее утверждение может показаться явно спорным, однако, по-моему, это именно так — не следует писать программы, не понимая сути того, что программируешь.
Графическая программа, как конечный продукт, с одной стороны, воплощает некоторые обобщенные методы и алгоритмы. С другой стороны, эти методы и алгоритмы должны обязательно соответствовать архитектуре компьютера и
операционной системы. Разумеется, можно писать программы, не зная, i
устроен процессор и как работает память, однако это непрофессионально.
I Важный аспект при разработке программ — это изучение особенностей оп(
рационной системы (ОС)— в нашем случае это будет Windows. Извести несколько библиотек, например MFC или OWL, которые прячут дета| функционирования Windows, и может показаться, что успешно программ! ровать можно без изучения операционной системы. Вместо этого изучаете версия библиотеки, считающаяся на данный момент современной. Но биб! лиотеки изменяются, некоторые из них вообще исчезают, и тогда необхода мо изучать очередную библиотеку и инструментальную среду разработку Так рано или поздно приходит осознание того, что изучение самой операци' онной системы (которая существует значительно дольше, чем любая из би$ лиотек и сред программирования для этой ОС) и архитектуры компьютера' закладывает надежный фундамент для дальнейшего повышения квалифш* ции, в том числе и для овладения новыми технологиями программирования,
Мы будем изучать использование функций API Windows без посредничеств* высокоуровневых библиотек общего назначения для разработки программ; Потом рассмотрим графическую библиотеку OpenGL.
Из множества литературных источников, освещающих эту тему, можно порекомендовать в первую очередь документацию SDK для разработчиков Windows-программ [61] и прекрасную книгу [20J.
6.1. Первый пример программы для Windows
Наша первая графическая программа названа StudEx. Она предназначена для работы в среде 32-битных ОС Windows различных версий, например, 95, 98, 2000, Millennium, NT. Программа написана на языке C++ (строго говоря почти что на чистом С, если не считать комментариев) с использований
функций API Windows. Текст программы состоит из трех файлов
studex.cpp, studex.rc, studex.def.
Файл studex. cpp (это главный файл текста программы):
И-------Затем следует определение функций---------------
I/--------------Главная функция программы-------------------
//----Она определяет первые шаги работы программы----------
ц---д0 создания окна и вхождения в цикл сообщений---------
//—для Windows-программ функция С,C++ main названа WinMain
//-----------организация цикла обработки сообщений-------
while (GetMessage(&msg,NULL,NULL,NULL))
TranslateMessage(smsg);
DispatchMessage(Smsg);
}
return msg. wParam; }
//-------------функция главного окна программы---------
//—ее вызывает Windows, когда посылает сообщение нашей—
//-------------------------программе-------------------
LRESULT CALLBACK WndProc(HWND hWnd, UINT message,
WPARAM wParam, LPARAM lParam) switch (message) //Обработка всех сообщений для окна
case WM_COMMAND: //Обработка сообщений пунктов меню switch (LOWORD(wParam)) {
case 201: //выбран пункт меню Графика
DrawStudyExample(hWnd); //это наша собственная
//функция break;
case 108:
DestroyWindow(hWnd); //для завершения работы break;
default : break; }
break; case WM_DESTROY:
PostQuitMessage(0); //для окончания цикла сообщений break;
default : return DefWindowProc(hWnd, //обработка
message, //всех wParam, //остальных
lParara); //сообщений
}
return 0L; }
//-----------это наша собственная функция, она-----------
//-будет содержать графические операторы рисования в окне---
void DrawStudyExample(HWND hWnd)
(
HDC hdc;
hdc = GetDC (hWnd) ; //контекст окна
if (hdc)
{
//после того, как получено ненулевое hdc, можно рисовать,
//например, десять прямоугольников размером 70 х 50 ...
for (int i=0; i<10; i++)
Rectangle(hdc, i*30, i*20, i*30+70, i*20+50);
}
ReleaseDC(hWnd,hdc); //этот контекст больше не нужен
)
Файл studex. гс (здесь содержится описание меню):
STUDEXMENU MENU
(
POPUP "«.Файл"
{
MENUITEM "&Открыть...", 101
MENUITEM "«.Записать как...", 102 | MENUITEM SEPARATOR
MENUITEM "«.Печать", 103
MENUITEM SEPARATOR
MENUITEM "«.Закончить", 108
1
MENUITEM "«.Графика", 201 I
Файл studex.def (файл описания для Windows):
NAME StudEx
DESCRIPTION 'Study Example1
EXETYPE WINDOWS
CODE PRELOAD MOVEABLE DISCARDABLE
DATA PRELOAD MOVEABLE MULTIPLE
Приведенный выше текст программы — это только исходный текст. Его необходимо скомпилировать, чтобы получить выполняемый файл в машинных кодах. Для компиляции и отладки этой программы можно использовать разнообразные инструментальные средства программирования, например, Borland C++ 5.02, Borland C++ Builder, Microsoft Visual C++ 6.0 и другие. После создания проекта в среде системы программирования в результате компили-
рования получим выполняемый файл. Имя этого файла— studex.exe (или другое, что определяется при создании проекта). Запустите программу в среде Windows. После появления окна программы выберите пункт меню "Графика". На экране дисплея будет изображение, как на рис. 6.1.
Рис. 6.1. Первый пример графической программы
6.2. Модульность программ
Приведенный выше текст первого примера графической программы для ОС Windows достаточно объемный. Для того чтобы упростить тексты других примеров графических программ, необходимо спланировать наше дальнейшее программирование. Рассмотрим структуру главного файла (studex.cpp):
Как видим, программа состоит из трех частей. Первая из них, содержащая функцию winMain, будет присутствовать во всех следующих примерах без всяких изменений. Это достаточно длинный текст, поэтому вместо того, чтобы его каждый раз копировать во всех следующих примерах, создадим отдельный файл, на который будем ссылаться в дальнейшем, и назовем его
winmain.cpp:
I
[ //--------------------функция WinMain и объявление WndProc---------
В следующих примерах мы будем использовать различные варианты оконной функции WndProc. Тот вариант, что приведен для первого примера, будет часто использоваться — его также запишем в отдельный файл и назовем
В файле winmainl. срр содержится текст оконной функции, объявление фунь ЦИИ DrawStudyExample И директива'#include "winmain. срр", благодаря КОТО рой при компиляции используется текст функции winMain. Следовательно, текст первого примера программы можно трансформировать в такой:
Это значительно короче. Большой кусок программы, включающий функции; создания и обслуживания окна, спрятан в отдельных файлах, ссылка на которые выполнена директивой #inciude. Такая модульность с использованием отдельных кусков текста, которые вначале собираются в единый текст и затем компилируются все вместе, может эффективно применяться лишь для небольших программ, которые мы и рассмотрим в качестве примеров. Для 1 более сложных программ лучше использовать проекты из раздельно компи-1 лируемых модулей OBJ, а также библиотеки DLL и компоненты типа ActiveX.
6.3. Использование
графических функций API Windows
Операционная система Windows предоставляет программистам возможность использовать в своих программах сотни разнообразных функций, доступ к которым сделан в виде интерфейса API (Application Program Interface). При разработке программы на основе компьютерных языков, таких как С, C++, Pascal, в текст программы можно включать вызовы функций, которые входят в состав API Windows. После компиляции создается выполняемый файл (*.ехе), который можно запускать на разных компьютерах с различными версиями ОС Windows, и программа будет корректно выполняться. Поскольку сами функции располагаются в модулях операционной системы, а в нашей программе содержатся только вызовы функций (call), то код выполняемого файла имеет небольшой размер.
Необходимо заметить, что мы будем рассматривать программы согласно спецификации Win32 для ОС Windows версий 95, 98, частично для NT и 2000. Существует несколько систем программирования, которые поддерживают разработку таких программ, например, Borland C++ [11, 59].
6.4. Контекст графического устройства
Графические функции из состава API Windows объединены в отдельную группу — подсистему GDI (Graphic Device Interface). Важная черта подсистемы GDI — аппаратная независимость многих функций от конкретного графического устройства.
Контекст графического устройства (Device Context) — это важный элемент графики в среде операционной системы Windows. Понятие контекста введено для описания того, где будет рисоваться изображение. Другими словами, контекст графического устройства указывает плоскость отображения, на которую делается графический вывод. В качестве контекста может быть окно программы на экране дисплея или страница принтера, или другое место, куда можно направить графический вывод.
Если ваша программа делает вызов графических функций API Windows, таких как рисование точек, линий, фигур, текста и тому подобных, необходимо указывать идентификатор контекста (handle of device context) и координаты. Вызов необходимого драйвера — для экрана дисплея, принтера или другого устройства — делает уже сама Windows. Это в значительной мере освобождает программиста от второстепенных дел и облегчает разработку программ, однако желательно учитывать специфику работы конкретного устройства.
Идентификатор контекста графического устройства (hdc)— это числовое значение, знание которого дает возможность направить графический вывод в нужное место. Перед началом рисования необходимо получить это числовое значение. После рисования обычно нужно освободить, деактивизировать контекст. Несоблюдение этого требования чревато неприятными последствиями— от утечек памяти до прекращения нормальной работы программы. Корректное использование контекста графического устройства осуществляется в такой последовательности:
1. Создание, активизация контекста, получение значения hdc.