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

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

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

Пример: рисование контуров

Мы собираемся начать с короткого примера для рисования в основном окне приложения. Все примеры в этой главе созданы с помощью Visual Studio.NET как приложения Windows на C#. Вспомните, что для проекта такого типа мастер кода определяет класс с именем Form1, производный от System.Windows.Form, который представляет основное окно приложения. Если не утверждается обратное, то во всех примерах новый или измененный код означает код, добавленный к этому классу.

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

В первом примере создается просто форма и на ней рисуется в методе InitializeComponent() . Необходимо сказать вначале, что это не лучший способ рисования на экране, мы быстро обнаружим, что возникает проблем в связи с невозможностью перерисовать что-нибудь после запуска. Однако пример проиллюстрирует достаточно много деталей рисования, не требуя при этом большой работы.

В данном случае мы запускаем Visual Studio.NET, создаем приложение Windows и изменяем код в методе InitializeComponent() следующим образом:

private void InitializeComponent() {

 this.components = new System.ComponentModel.Container();

 this.Size = new System.Drawing.Size(300, 300);

 this.Text = 'Display At Startup';

 this.BackColor = Color.White;

и добавляем следующий код в конструктор Form1:

public Form1() {

 InitializeComponent();

 Graphics dc = this.CreateGraphics();

 this.Show();

 Pen BluePen = new Pen(Color.Blue, 3);

 dc.DrawRectangle(BluePen, 0, 0, 50, 50);

 Pen RedPen = new Pen(Color.Red, 2);

 dc.DrawEllipse(RedPen, 0, 50, 80, 60);

}

Это единственные изменения, которые необходимо сделать. Наш пример является примером DisplayAtStartup из загружаемого кода.

Фоновый цвет формы задается как белый, поэтому она выглядит 'подходящим' окном, в котором мы собираемся вывести графическое изображение. Соответствующая строка кода помещается в метод InitializeComponent(), чтобы Visual Studio .NET распознал строку и мог изменить внешний вид формы. Иначе можно было бы использовать графическое представление для задания цвета фона, что привело бы к появлению той же самой инструкции в InitializeComponent(). Вспомните, что этот метод используется системой Visual Studio.NET для создания представления формы. Если не задать явно цвет фона, то он останется с заданным по умолчанию для диалоговых окон цветом, объявленным в настройках Windows.

Затем мы создаем объект Graphics с помощью метода CreateGraphics() . Этот объект Graphics содержит контекст устройства Windows, который нужен для рисования. Созданный контекст устройства ассоциируется с устройством вывода, а также с этим окном. Отметим, что здесь используется переменная с именем dc для экземпляра объекта Graphics, отражая тот факт, что он в действительности представляет контекст устройства, действующий за сценой.

Далее для выведения окна вызывается метод Show(). Это делается просто для немедленного вывода окна, так как на самом деле нельзя выполнить рисования, пока окно не будет изображено — не на чем будет рисовать.

Наконец, мы выводим прямоугольник в точке с координатами (0, 0) с шириной и высотой равной 50 и эллипс в точке с координатами (0, 50) с шириной 80 и высотой 50. Отметим, что координаты (х, у) означают х пикселей вправо и у пикселей вниз от верхнего левого угла клиентской области окна и являются координатами верхнего левого угла изображаемой фигуры:

Запись (х, у) является стандартной математической записью, очень удобной для описания координат. Используемые методы DrawRectanglе() и DrawEllipse() имеют по 5 параметров. Первый параметр каждого метода — это экземпляр класса System.Drawing.Pen.

Добавить отзыв
ВСЕ ОТЗЫВЫ О КНИГЕ В ИЗБРАННОЕ

0

Вы можете отметить интересные вам фрагменты текста, которые будут доступны по уникальной ссылке в адресной строке браузера.

Отметить Добавить цитату