Контексты устройств и объект Graphics

Лабораторная работа №1

Тема

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

Задание

Создать программу, которая выводит на экран ФИО исполнителя с помощью линий, используя ручки и разные цвета.

Теоретические сведения

GDI и GDI+


Вообще говоря, одной из сильных сторон Windows — да и всех современных операционных систем — является их способность абстрагироваться от деталей, характеризующих конкретные устройства, без указаний разработчика. Например, вам не нужно понимать работу драйвера устройства жесткого диска для того, чтобы программно читать или записывать файлы на диске. Вы просто вызываете соответствующие методы в соответствующих классах .NET (или во времена, предшествующие появлению .NET, — функции Windows API).

Этот принцип также справедлив в отношении рисования. Когда компьютер рисует нечто на экране, он делает это путем отправки команд видеокарте. Однако на рынке присутствуют многие сотни разнообразных видеокарт, большинство из которых имеют отличный от других набор команд и возможностей. Если бы вам пришлось принимать это во внимание и писать специфический код для каждого видеодрайвера, то написание обычного приложения стало бы практически невозможной задачей. Вот почему, начиная с ранних версий Windows, появился интерфейс графических устройств ( graphical device interface — GDI).

GDI обеспечивает уровень абстракции, скрывая разницу между различными видео- картами. Вы просто вызываете функцию Windows API, чтобы выполнить специфическую задачу, а GDI внутри себя самостоятельно решает, как заставить определенную клиентскую видеокарту выполнить то, что необходимо при запуске определенного фрагмента кода. Мало того, если у клиента есть несколько устройств отображения, например, мониторов и принтеров, GDI обеспечивает практически одинаковый результат при выводе одного и того же изображения на экран и принтер. Если клиент желает напечатать нечто вместо отображения его на экране, ваше приложение про- сто должно сообщить системе, что устройством вывода будет принтер, после чего вызывать те же функции API точно таким же образом.

Как видим, объект контекста устройства (device context — DC; скоро мы рассмотрим его) — это очень мощный объект, и возможно, вас удивит, что под GDI все операции рисования должны выполняться через контекст устройства. DC используется даже в операциях, которые не требуют рисования на экране или любом другом аппаратном устройстве — таких как модификация графических изображений в памяти. Хотя GDI предлагает относительно высокоуровневый программный интерфейс для разработчиков, он все же базируется на старом Windows API, с функциями в сти- ле C.

GDI+ — это уровень, находящийся между GDI и приложением, которые предоставляет более интуитивно понятную, основанную на наследовании объектную модель. Хотя GDI+ — это в основном оболочка вокруг GDI, тем не менее, Microsoft посредством GDI+ предлагает ряд новых возможностей и увеличенную производительность по сравнению с некоторыми старыми средствами GDI.

Часть базовой библиотеки классов .NET, связанная с GDI+, огромна! Гораздо важнее понять фундаментальные принципы, касающиеся рисования, чтобы вы смогли получить возможность при необходимости легко расширить свои знания. Полные списки всех классов и методов, доступных в GDI+, конечно же, содержатся в документации SDK.

Разработчикам на Visual Basic 6, скорее всего, концепции рисования покажутся незнакомыми, потому что Visual Basic 6 сосредоточен на элементах управления, которые выполняют рисование самостоятельно. Разработчики на C++/MFC, однако, окажутся на более знакомой территории, поскольку MFC требует от разработчиков более подробного управления процессом рисования с применением GDI. Однако даже если вы имеете обширный опыт работы с классическим GDI, все равно в этой главе найдете для себя много нового.


Пространства имен GDI+

Обзор основных пространств имен, в которых находятся базовые классы GDI+:

System.Drawing Содержит большинство классов, структур, перечислений и делегатов, обеспечивающих базовую функциональность рисования.
System.Drawing.Drawing2D Представляет основную поддержку для двумерной и векторной графики, включая сглаживание, геометрические трансформации и графические пути.
System.Drawing.Imaging Содержит различные классы, обеспечивающие манипуляции с графическими изображениями (битовые карты, файлы GIF и тому подобное).
System.Drawing.Printing Содержит классы, имеющие отношение к печати и предварительному просмотру выводимых на печать изображений.
System.Drawing.Design Включает некоторые предопределенные диалоговые окна, таблицы свойств и другие элементы интерфейса, имеющие отношение к расширению пользовательского интерфейса времени проектирования.
System.Drawing.Text Включает классы для выполнения более сложных манипуляций со шрифтами и семействами шрифтов.


Рисование линии

Чтобы нарисовать линию, вызовите метод DrawLine объекта Graphics. Объект Pen передается методу DrawLine в качестве одного из аргументов. В приведенном ниже примере демонстрируется рисование отрезка, соединяющего точки с координатами (4, 2) и (12, 6).

C#

myGraphics.DrawLine(myPen, 4, 2, 12, 6);

Метод DrawLine класса Graphics перегружен, поэтому для него поддерживается несколько способов передачи аргументов. Например, можно создать два объекта Point и передать эти объекты Point методу DrawLine в качестве аргументов.

C#

Point myStartPoint = new Point(4, 2);

Point myEndPoint = new Point(12, 6);

myGraphics.DrawLine(myPen, myStartPoint, myEndPoint);

Создание объекта Pen

При создании объекта Pen можно указать несколько атрибутов. Например, один из конструкторов Pen позволяет указывать при создании объекта его цвет и ширину. В приведенном ниже примере демонстрируется рисование синего отрезка толщиной 2 из точки с координатами (0, 0) в точку с координатами (60, 30).

C#

Pen myPen = new Pen(Color.Blue, 2);

myGraphics.DrawLine(myPen, 0, 0, 60, 30);

Рисование прямоугольника

Рисование прямоугольников в GDI+ похоже на рисование линий. Чтобы нарисовать прямоугольник, нужно создать два объекта: объект Graphics и объектPen. У объекта Graphics имеется метод DrawRectangle, а объект Pen предназначен для хранения таких атрибутов рисуемого элемента, как ширина линии и цвет. Объект Pen передается методу DrawRectangle в качестве одного из аргументов. В приведенном ниже примере демонстрируется рисование прямоугольника шириной 80 и высотой 40 точек, верхний левый угол которого расположен в точке с координатами (100, 50).

C#

myGraphics.DrawRectangle(myPen, 100, 50, 80, 40);

Метод DrawRectangle класса Graphics перегружен, поэтому для него поддерживается несколько способов передачи аргументов. Например, можно создать объект Rectangle и передать этот объект Rectangle в качестве аргумента методу DrawRectangle:

C#

Rectangle myRectangle = new Rectangle(100, 50, 80, 40);

myGraphics.DrawRectangle(myPen, myRectangle);

Объект Rectangle содержит методы и свойства, позволяющие задавать и извлекать данные о прямоугольнике. Например, методы Inflate и Offsetпозволяют изменять размер и расположение прямоугольника. Метод IntersectsWith позволяет определить, не пересекается ли данный прямоугольник с некоторым указанным прямоугольником, а метод Contains позволяет определить, находится ли указанная точка внутри данного прямоугольника.

Graphics.Clear – метод. Очищает всю поверхность рисования и выполняет заливку поверхности указанным цветом фона.

C#

public void Clear( Color color)

Метод Clear очищает состояние графического объекта и не должен вызываться в том случае, когда графический объект не может быть изменен.Например, если метод Clear вызывается на безопасном рабочем столе сессии терминального сервера, может возникнуть исключение ExternalException, и объект Graphics останется в некорректном состоянии.

Примеры

Следующий пример кода предназначен для использования с Windows Forms, и для него требуется объект PaintEventArgs e, являющийся параметром обработчика событий Paint. Данный код очищает поверхность рисования объекта Graphics и задает в качестве цвета фона определенный системой бирюзовый цвет.

C#

private void ClearColor(PaintEventArgs e){ // Clear screen with teal background. e.Graphics.Clear(Color.Teal);}

Параметры

pen

Тип: System.Drawing.Pen
Структура Pen, определяющая цвет, ширину и стиль линии.

pt1

Тип: System.Drawing.Point
Структура Point, представляющая первую точка для соединения.

pt2

Тип: System.Drawing.Point
Структура Point, представляющая вторую точка для соединения.

Примеры

Следующий пример кода предназначен для использования с Windows Forms, и для него требуется объект PaintEventArgs e, являющийся параметром обработчика событий Paint. Код выполняет следующие действия:

· Создает черное перо.

· Создает конечные точки линии.

· Рисует на экране линию.

C#

public void DrawLinePoint(PaintEventArgs e){ // Create pen. Pen blackPen = new Pen(Color.Black, 3); // Create points that define line. Point point1 = new Point(100, 100); Point point2 = new Point(500, 100); // Draw line to screen. e.Graphics.DrawLine(blackPen, point1, point2);}

Параметры

pen

Тип: System.Drawing.Pen
Структура Pen, определяющая цвет, ширину и стиль линии.

x1

Тип: System.Int32
Координата X первой точки.

y1

Тип: System.Int32
Координата Y первой точки.

x2

Тип: System.Int32
Координата X второй точки.

y2

Тип: System.Int32
Координата Y второй точки.

Данный метод проводит линию на экране, соединяющую две точки, которые определяются параметрами x1, y1, x2 и y2.

Примеры

Следующий пример кода предназначен для использования с Windows Forms, и для него требуется объект PaintEventArgs e, являющийся параметром обработчика событий Paint. Код выполняет следующие действия:

· Создает черное перо.

· Создает координаты конечных точек линии.

· Рисует на экране линию.

C#

public void DrawLineInt(PaintEventArgs e){ // Create pen. Pen blackPen = new Pen(Color.Black, 3); // Create coordinates of points that define line. int x1 = 100; int y1 = 100; int x2 = 500; int y2 = 100; // Draw line to screen. e.Graphics.DrawLine(blackPen, x1, y1, x2, y2);}

Отчет

Лабораторная работа №1

Тема

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

Задание

Создать программу, которая выводит на экран ФИО исполнителя с помощью линий, используя ручки и разные цвета.

Теоретические сведения

GDI и GDI+


Вообще говоря, одной из сильных сторон Windows — да и всех современных операционных систем — является их способность абстрагироваться от деталей, характеризующих конкретные устройства, без указаний разработчика. Например, вам не нужно понимать работу драйвера устройства жесткого диска для того, чтобы программно читать или записывать файлы на диске. Вы просто вызываете соответствующие методы в соответствующих классах .NET (или во времена, предшествующие появлению .NET, — функции Windows API).

Этот принцип также справедлив в отношении рисования. Когда компьютер рисует нечто на экране, он делает это путем отправки команд видеокарте. Однако на рынке присутствуют многие сотни разнообразных видеокарт, большинство из которых имеют отличный от других набор команд и возможностей. Если бы вам пришлось принимать это во внимание и писать специфический код для каждого видеодрайвера, то написание обычного приложения стало бы практически невозможной задачей. Вот почему, начиная с ранних версий Windows, появился интерфейс графических устройств ( graphical device interface — GDI).

GDI обеспечивает уровень абстракции, скрывая разницу между различными видео- картами. Вы просто вызываете функцию Windows API, чтобы выполнить специфическую задачу, а GDI внутри себя самостоятельно решает, как заставить определенную клиентскую видеокарту выполнить то, что необходимо при запуске определенного фрагмента кода. Мало того, если у клиента есть несколько устройств отображения, например, мониторов и принтеров, GDI обеспечивает практически одинаковый результат при выводе одного и того же изображения на экран и принтер. Если клиент желает напечатать нечто вместо отображения его на экране, ваше приложение про- сто должно сообщить системе, что устройством вывода будет принтер, после чего вызывать те же функции API точно таким же образом.

Как видим, объект контекста устройства (device context — DC; скоро мы рассмотрим его) — это очень мощный объект, и возможно, вас удивит, что под GDI все операции рисования должны выполняться через контекст устройства. DC используется даже в операциях, которые не требуют рисования на экране или любом другом аппаратном устройстве — таких как модификация графических изображений в памяти. Хотя GDI предлагает относительно высокоуровневый программный интерфейс для разработчиков, он все же базируется на старом Windows API, с функциями в сти- ле C.

GDI+ — это уровень, находящийся между GDI и приложением, которые предоставляет более интуитивно понятную, основанную на наследовании объектную модель. Хотя GDI+ — это в основном оболочка вокруг GDI, тем не менее, Microsoft посредством GDI+ предлагает ряд новых возможностей и увеличенную производительность по сравнению с некоторыми старыми средствами GDI.

Часть базовой библиотеки классов .NET, связанная с GDI+, огромна! Гораздо важнее понять фундаментальные принципы, касающиеся рисования, чтобы вы смогли получить возможность при необходимости легко расширить свои знания. Полные списки всех классов и методов, доступных в GDI+, конечно же, содержатся в документации SDK.

Разработчикам на Visual Basic 6, скорее всего, концепции рисования покажутся незнакомыми, потому что Visual Basic 6 сосредоточен на элементах управления, которые выполняют рисование самостоятельно. Разработчики на C++/MFC, однако, окажутся на более знакомой территории, поскольку MFC требует от разработчиков более подробного управления процессом рисования с применением GDI. Однако даже если вы имеете обширный опыт работы с классическим GDI, все равно в этой главе найдете для себя много нового.


Пространства имен GDI+

Обзор основных пространств имен, в которых находятся базовые классы GDI+:

System.Drawing Содержит большинство классов, структур, перечислений и делегатов, обеспечивающих базовую функциональность рисования.
System.Drawing.Drawing2D Представляет основную поддержку для двумерной и векторной графики, включая сглаживание, геометрические трансформации и графические пути.
System.Drawing.Imaging Содержит различные классы, обеспечивающие манипуляции с графическими изображениями (битовые карты, файлы GIF и тому подобное).
System.Drawing.Printing Содержит классы, имеющие отношение к печати и предварительному просмотру выводимых на печать изображений.
System.Drawing.Design Включает некоторые предопределенные диалоговые окна, таблицы свойств и другие элементы интерфейса, имеющие отношение к расширению пользовательского интерфейса времени проектирования.
System.Drawing.Text Включает классы для выполнения более сложных манипуляций со шрифтами и семействами шрифтов.

Контексты устройств и объект Graphics

В GDI способ идентификации устройства, на которое нужно направить вывод, заключается в обращении к объекту, называемому контекстом устройства (device context— DC). DC сохраняет информацию об определенном устройстве и может транслировать вызовы функций программного интерфейса GDI в конкретные команды, направляемые устройствам. Вы также можете опросить контекст устройства на предмет того, какие возможности он предоставляет (например, может ли принтер печатать в цвете или же только в черно-белом изображении), дабы соответствующим образом откорректировать вывод. Если вы пытаетесь заставить устройство делать что-то такое, что оно не способно сделать, то DC обычно обнаруживает это и предпринимает соответствующие действия (которые, в зависимости от ситуации, могут означать генерацию исключения либо модификацию запроса таким образом, чтобы получить как можно более близкий результат в рамках возможностей данного устройства).

Однако DC не только имеет дело с аппаратным устройством. Он служит в качестве моста между приложением и Windows, и принимает во внимание любые требования и ограничения, налагаемые на рисование Windows. Например, если Windows знает, что необходимо перерисовать лишь часть окна вашего приложения, DC перехватит и отменит попытки рисования вне этой области. Благодаря связи DC с Windows, работа через контекст устройств может упростить ваш код и в других отношениях.

Например, аппаратным устройствам необходимо сообщать, где следует рисовать объекты, и обычно им нужны координаты, отсчитываемые относительно верхнего левого угла экрана (или другого выходного устройства). Однако приложения обычно отображают нечто в клиентской области (области, зарезервированной для рисования) собственного окна, возможно, используя собственную систему координат. Поскольку окно может быть позиционировано в любом месте экрана, и пользователь в любой момент может его переместить, преобразования между этими системами координат могут оказаться непростой задачей. Однако DC всегда знает, где находится ваше окно, и может выполнять такие преобразования автоматически.

В GDI+ контекст устройства помещен в оболочку базового класса .NET с именем System.Drawing.Graphics. Большая часть рисования выполняется вызовом методов экземпляра Graphics. Фактически, поскольку класс Graphics отвечает за выполнение большинства операций рисования, очень немного в GDI+ происходит такого, что не касалось бы тем или иным образом экземпляра Graphics, а потому понимание того, как управлять этим объектом, является ключом к пониманию того, как рисовать на устройствах отображения с помощью GDI+.

Класс Graphics предоставляет методы рисования на устройстве отображения.

Перья, линии и прямоугольники в GDI+

Чтобы нарисовать линию с помощью интерфейса GDI+, нужно создать два объекта: объект Graphics и объект Pen. Объект Graphics содержит методы, непосредственно выполняющие рисование, а объект Pen служит хранилищем атрибутов, таких как цвет, ширина и стиль линии.

Рисование линии

Чтобы нарисовать линию, вызовите метод DrawLine объекта Graphics. Объект Pen передается методу DrawLine в качестве одного из аргументов. В приведенном ниже примере демонстрируется рисование отрезка, соединяющего точки с координатами (4, 2) и (12, 6).

C#

myGraphics.DrawLine(myPen, 4, 2, 12, 6);

Метод DrawLine класса Graphics перегружен, поэтому для него поддерживается несколько способов передачи аргументов. Например, можно создать два объекта Point и передать эти объекты Point методу DrawLine в качестве аргументов.

C#

Point myStartPoint = new Point(4, 2);

Point myEndPoint = new Point(12, 6);

myGraphics.DrawLine(myPen, myStartPoint, myEndPoint);

Создание объекта Pen

При создании объекта Pen можно указать несколько атрибутов. Например, один из конструкторов Pen позволяет указывать при создании объекта его цвет и ширину. В приведенном ниже примере демонстрируется рисование синего отрезка толщиной 2 из точки с координатами (0, 0) в точку с координатами (60, 30).

C#

Pen myPen = new Pen(Color.Blue, 2);

myGraphics.DrawLine(myPen, 0, 0, 60, 30);

Наши рекомендации