Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

GMSAPR

.pdf
Скачиваний:
11
Добавлен:
16.03.2016
Размер:
9.01 Mб
Скачать

41

случаях, когда необходимо выполнение нескольких case блоков) необходимо использовать оператор goto — в данном случае он не нарушает логику и структуры программы, и к нему не подходят аргументы «о вреде использования операторов goto». Однако, не рекомендуется использовать его нигде, кроме этого случая. Оператор goto запутывает структуру программы и нарушает ее иерархичность, его использование причисляют к «плохому стилю программирования».

В операторах try-catch добавлен блок finally, выполняющийся вне зависимости от того, произошло исключение или нет.

Новые удобные операторы: is, as, typeof, ref, out, foreach, иначе трактуются static и extern.

Директивы препроцессора. В C# не используются заголовочные .h файлы, запрещается использование макрокоманд, заменяющих константы или фрагменты кода.

Ниже приведён пример программы на C# - консольный вариант "Hello, World!" (какой же учебник может обойтись без классического примера программы «Hello World»? Нужно поддерживать традиции.):

using System;

class ЗдравствуйМир

{

static void Main(string[] args)

{

string строка = "World"; Console.WriteLine("Hello, {0}!", строка);

}

}

Обратите внимание, что C# разрешает использовать кириллицу в символах идентификаторов. В данном случае, «ЗдравствуйМир» и «строка» — вполне допустимые с точки зрения компилятора имена. Однако, всё-таки такие

42

«смешанные» программы не совсем удобны ни при написании (переключение между раскладками), ни при прочтении.

Кроме всего прочего, язык C# проще в освоении и использовании языка C++ и позиционируется Microsoft как основной язык разработки программ для

.NET платформы.

2.6 GDI и GDI+

Одним из подмножеств Windows API является GDI (Graphic Device Interface интерфейс графических устройств). Задача GDI — обеспечение аппаратно-независимой графики. GDI — это Windows интерфейс для представления графических объектов и передачи их на устройства вывода (например, дисплей или принтер). Благодаря функциям GDI Windowsприложение может выводить графическую информацию на практически любых устройствах. GDI является графическим ядром различных Windows ОС вплоть до Windows 2000 (включительно).

С графикой Windows с помощью GDI неразрывно связано понятие контекста устройства (device context, DC). Контекстом в Windows называется логическое представление какого-либо физического устройства, например монитора, принтера или плоттера. Контекст устройства представляет собой структуру данных, которая определяет состояние драйвера устройства и способ вывода информации. Такая информация, в частности, включает в себя: палитру устройства, определяющую набор доступных цветов; параметры пера для черчения линий; параметры кисти для закраски и заливки; параметры шрифта, использующегося для вывода текста.

Особенность графики в Windows состоит в том, что приложения не взаимодействуют напрямую с физическими устройствами, а для того, чтобы нарисовать что-нибудь, обращаются к функциям GDI, которые в качестве аргумента принимают контекст устройства. В GDI существуют пять типов контекста устройства – связанный с дисплеем (Display DC), принтером (Printer

43

DC), контекст виртуального устройства в памяти (Memory DC), контекст метафайла (Metafile DC, воспроизводит графическую сцену посредством выполнения специальных команд) и специальный вид контекста — информационный (Information DC).

Библиотека MFC содержит ряд классов, инкапсулирующих различные типы контекстов устройств Windows. Класс CDC является базовым для остальных классов контекстов устройств. Этот класс используется для организации вывода информации на экран и на другие устройства (принтер), и имеет несколько десятков различных методов. Часть методов класса CDC предназначена для задания различных атрибутов контекста устройства (параметров, влияющих на вывод информации, например: цвет, режим отображения и др.), другая часть методов предназначена для вывода текста, рисования линий и фигур. Класс CDC содержит методы для работы как с векторной, так и растровой графикой.

При желании информацию о любом из классов MFC, в том числе и о классе CDC, можно получить в библиотеке MSDN.

Например, метод CDC::SelectObject() предназначен для выбора в контексте устройства объекта, с использованием которого будет выполняться рисование. В качестве аргумента этот метод может принимать указатели на объекты: перья (pens), кисти (brushes), шрифты (fonts), битовые изображения

(bitmaps) и регионы (regions). Соответственно, метод имеет следующие формы:

CPen* SelectObject( CPen* pPen );

CBrush* SelectObject( CBrush* pBrush );

virtual CFont* SelectObject( CFont* pFont ); CBitmap* SelectObject( CBitmap* pBitmap ); int SelectObject( CRgn* pRgn ).

Метод возвращает указатель на объект, который был замещен, или NULL в случае ошибки. При использовании метода следует создать указатель на

44

замещаемый объект, который и заполнит метод SelectObject, а после окончания работы с новым объектом выбрать его обратно. То есть:

CBrush* pOldBrush = SelectObject(MyBrush);

. . . //Рисуем новой кистью

SelectObject(pOldBrush);

В противном случае система не сможет удалить выбранный объект, и он останется в памяти до окончания работы программы. При интенсивном использовании функций рисования это приведет к «зависанию» программы.

При использовании архитектуры Document-View (стандартная архитектура приложения объект-облик, когда программа делится на два взаимодействующих класса — объекта и его представления (представлений)) вывод информации осуществляется в функции OnDraw(). В качестве параметра в функцию OnDraw() передается указатель на объект класса CDC:

OnDraw(CDC* pDC)

Объект, адрес которого передается через указатель pDC, заранее подготовлен каркасом приложения и содержит контекст того устройства, на которое осуществляется вывод. Таким образом, нам требуется лишь воспользоваться методами класса CDC для вывода наших данных

Не смотря на достаточно большую библиотеку функций GDI, функциональность стандартного GDI не настолько обширна, чтобы удовлетворить даже средние потребности программистов при работе с графикой. Поэтому в версиях Windows XP и 2003 вводится новое графическое ядро следующего поколения – GDI+.

Ниже перечисляются основные особенности GDI+ по сравнению с GDI:

Прозрачное управление памятью: объекты ядра GDI+ создаются в куче с помощью собственного менеджера памяти прозрачно для программиста;

45

Использование перегрузки имен функций: функции одного назначения различаются только по своим параметрам;

Собственное пространство имен: все типы GDI+ описаны в пространстве имен Gdiplus, что позволяет использовать понятные имена типов (такие, как Rect, Pen и Matrix) без конфликтов с другими библиотеками;

Перегрузка операторов: предоставляет удобные операции '+' и '–' для таких типов, как Point и Size;

Архитектурные новинки библиотеки:

Аппаратная абстракция: упрощается перенос на 64-битные платформы;

Новый дизайн графических функций/объектов: теперь можно не бояться оставить выбранной кисть в контексте перед удалением — типичная для GDI ошибка.

Разделение функций закраски и отрисовки: предоставляет большую гибкость в рисовании, например, позволяет заливать незамкнутые фигуры.

Увеличившаяся поддержка траекторий (paths) и их взаимодействия с регионами: теперь траектории являются

полноправными объектами вне контекста рисования и могут легко трансформироваться в регионы.

Новые возможности:

Градиентная закраска: позволяет заливать сложные фигуры оттенками с различными законами распределения цвета, рисовать векторные примитивы (например, линии) с градиентной окраской;

Поддержка прозрачности: можно создавать кисти и растры с прозрачными и полупрозрачными областями, заливать области полупрозрачным цветом, назначать Color Key для растрового

46

изображения и работать с его альфа-каналом, а также рисовать полупрозрачные векторные примитивы и текст;

Режимы улучшения изображения: позволяют значительно улучшить пользовательское восприятие за счет сглаживания контурных неровностей (anti-aliasing) и префильтрации (interpolation) растровых изображений;

Сплайны: кроме уже существующих в GDI кривых Безье, поддерживается новый вид кривых: сплайны. Сплайны являются гладкими кривыми;

Траектории: как уже говорилось, траектории теперь существуют независимо от контекста рисования и представляют собой мощное средство создания сложных векторных объектов. Кроме того, появилась возможность выравнивать (flatten) траектории, то есть преобразовывать их к набору отрезков прямых;

Координатные преобразования: объект Matrix позволяет осуществлять операции поворота, переноса, масштабирования и отражения объектов GDI+;

Регионы: в отличие от GDI, регионы теперь не привязаны к координатам устройства и подчиняются координатным преобразованиям;

Работа с растрами: Поддерживается отрисовка растров с наложением внешнего альфа-канала, масштабированием, растяжением, искажением и поворотом растров. При этом можно установить режимы отображения отдельных пикселов — от простого переноса до префильтрации (наилучшее качество изображения). Стало возможным рисовать векторные примитивы, залитые текстурами.

Поддержка популярных форматов графических файлов:

необычайно приятное новшество для всех программистов, имеющих дело с разными графическими форматами.

47

Поддерживаются форматы BMP, GIF, TIFF, JPEG, Exif (расширение TIFF и JPEG для цифровых фотокамер), PNG, ICO, WMF и EMF. Декодеры различных форматов выполнены с учетом их специфики, то есть появилась возможность, например, отобразить анимационный GIF или добавить комментарий к TIFF- файлу. Загруженный, созданный или модифицированный файл может быть сохранен на диск в одном из подходящих форматов

Формат EMF+: Для описания новых возможностей был создан новый формат метафайла EMF+, который позволяет сохранить на диск и затем проиграть последовательность графических команд. Существует возможность записать «дуальный» метафайл, понятный старым GDI-программам. Новые программы будут читать из него GDI+-информацию.

Ксожалению, GDI и GDI+ не поддерживают аппаратную акселерацию и подходят лишь для реализации офисных приложений, не требующих особой производительности. При этом считается, что GDI+ чуть медленнее своего более примитивного собрата. Для приложений, которым необходима «быстрая» графика (и тем более — объёмная) желательно использовать специализированные библиотеки вроде DirectX (только под Windows) и OpenGL (кроссплатформенная).

2.7DirectX и OpenGL

OpenGL и Direct3D — две основные на сегодняшний день аппаратноускоряемые библиотеки для создания компьютерной трехмерной графики.

Microsoft DirectX — это коллекция API, разработанных для простого и эффективного решения задач, связанных с игровым и видеопрограммированием под ОС Windows. Наиболее широко используется при написании компьютерных игр. Пакет средств разработки DirectX бесплатно доступен на сайте Microsoft.

48

Большая часть функциональности строится на основе COM объектов, доступ к которым можно получить через интерфейсы.

Вцелом, DirectX подразделяется на:

DirectX Graphics: набор интерфейсов, ранее (до версии 8.0) делившихся на:

DirectDraw: интерфейс вывода растровой графики (начиная с версии 8.0 — упразднен).

Direct3D (D3D): интерфейс вывода трехмерных примитивов.

DirectInput: интерфейс, используемый для обработки данных, поступающих с клавиатуры, мыши, джойстика и пр. игровых контроллеров.

DirectPlay: интерфейс сетевой коммуникации игр.

DirectSound: интерфейс низкоуровневой работы со звуком (формата Wave)

DirectMusic: интерфейс воспроизведения музыки в форматах

Microsoft.

DirectSetup: часть, ответственная за установку DirectX.

DirectX Media Objects: реализует функциональную поддержку потоковых объектов (например, энкодеры/декодеры)

Рассмотрим эти компоненты более подробно:

DirectDraw предназначен для взаимодействия с видеоадаптером. Одна из основных функций этого компонента - предоставление прямого доступа к видеопамяти. Кроме того, DirectDraw позволяет получать всю интересующую информацию об устройстве и изменить его параметры, управлять палитрой, цветовой гаммой, и инициализировать несколько мониторов, а также, что немаловажно для программистов в области профессиональной графики, захватывать видеоизображения. Вот некоторые преимущества использования

DirectDraw перед GDI:

49

Уровень аппаратной абстракции (HAL) DirectDraw предоставляет интерфейсы для прямого доступа к видеопамяти, что значительно увеличивает производительность программ.

DirectDraw распознает все возможности видеоадаптеров и использует их. К примеру, если ваш видеоадаптер поддерживает аппаратное копирование данных, DirectDraw будет пользоваться именно этой возможностью. К тому же, если какие-либо действия аппаратно невозможны, они будут эмулироваться программно, на уровне аппаратной эмуляции (HEL – Hardware Emulation Level).

Существует возможность переключения видеостраниц, причем допускается создание нескольких вторичных страниц и размещение их как в видео-, так и в системной памяти.

Поддержка полноэкранных режимов, трехмерных z-буферов, динамических палитр, изменение экранного разрешения.

Реализация полноэкранных приложений с использованием графических средств Windows является довольно трудоемким процессом, а скорость их работы оставляет желать лучшего (в связи

с отсутствием аппаратной акселерации).

Direct3D обеспечивает два уровня API для работы с трехмерной графикой — непосредственный режим (Immediate Mode) и абстрактный (Retained Mode). Непосредственный режим Direct3D представляет собой низкоуровневый API трехмерной графики, который идеально подходит для опытных программистов, занимающихся переносом существующих игр и приложений в DirectX. Абстрактный режим Direct3D представляет собой высокоуровневый API, позволяющий легко реализовать приложения с трехмерной графикой; он основан на использовании непосредственного режим Direct3D. Direct3D поддерживает переключаемый буфер глубины, закраску Гуро, освещение сцены несколькими разнотипными источниками света, а также работу с материалами и текстурами, трансформациями и отсечением.

50

DirectSound предоставляет средства взаимодействия со звуковой картой. Посредством этого компонента можно воспроизводить оцифрованные звуковые данные и осуществлять их запись. При одновременном воспроизведении нескольких порций данных DirectSound выполняет автоматическое микширование, но его можно выполнять и самостоятельно. Кроме того, отдельная часть DirectSound, которую иногда называют DirectSound3D, позволяет имитировать "объемное" звучание, задавая положение источника в пространстве, положение "слушателя" и многие другие характеристики.

DirectMusic представляет собой музыкальный компонент в составе DirectX. Представляет собой реализацию технологии MIDI (записанные звуки различных музыкальных инструментов проигрываются в нужной тональности и последовательности).

DirectPlay является средством реализации сетевого взаимодействия. При его использовании не нужно учитывать нюансы различных сетевых протоколов - всю заботу об этом берет на себя данный компонент. DirectPlay изначально разрабатывался для игр и поэтому имеет такие возможности, как создание "игроков", объединение их в группы, использование собственных сессий, рассылка текстовых сообщений и многое другое. Для создания игр можно использовать как выделенный сервер, так и одноранговое соединение. В последнем случае кто-то из "игроков" буде неофициальным сервером, и при его выбывании происходит автоматический выбор другого "игрока" в этом качестве. Кроме того, поддерживает последовательное соединение через порт и модем.

DirectInput позволяет осуществлять получение информации от пользователя, то есть обслуживать устройства управления, такие как клавиатура, джойстик, мышь и всевозможные устройства с обратной связью

(force feedback devices).

Новая версия Direct X, изначально называвшаяся «Windows Graphics Foundation», позднее была переименована в DirectX 10. DirectX 10 представляет

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]