Поделиться через


Состояние графического объекта

Класс Graphics является сердцем Windows GDI+. Чтобы нарисовать что-либо, создайте объект Graphics , задайте его свойства и вызовите его методы ( DrawLine, DrawImage, DrawString и т. п.).

В следующем примере создаются объекты Graphics и Pen , а затем вызывается метод Graphics::D rawRectangle объекта Graphics :

HDC          hdc;
PAINTSTRUCT  ps;

hdc = BeginPaint(hWnd, &ps);
{
   Graphics graphics(hdc);
   Pen pen(Color(255, 0, 0, 255));  // opaque blue
   graphics.DrawRectangle(&pen, 10, 10, 200, 100);
}
EndPaint(hWnd, &ps);

В приведенном выше коде метод BeginPaint возвращает дескриптор в контекст устройства, и этот дескриптор передается конструктору Graphics . Контекст устройства — это структура (поддерживаемая Windows), которая содержит сведения об используемом устройстве отображения.

Состояние графики

Объект Graphics не только предоставляет методы рисования, такие как DrawLine и DrawRectangle. Объект Graphics также поддерживает графическое состояние, которое можно разделить на следующие категории:

  • Ссылка на контекст устройства
  • Параметры качества
  • Преобразования
  • Отсеченная область

Контекст устройства

Программисту приложений не нужно думать о взаимодействии между графическим объектом и контекстом устройства. Это взаимодействие обрабатывается GDI+ в фоновом режиме.

Параметры качества

Графический объект имеет несколько свойств, влияющих на качество элементов, которые рисуются на экране. Эти свойства можно просматривать и управлять ими, вызывая методы get и set. Например, можно вызвать метод Graphics::SetTextRenderingHint , чтобы указать тип сглаживания (при наличии), применяемого к тексту. Другие методы набора, влияющие на качество, — Graphics::SetSmoothingMode, Graphics::SetCompositingMode, Graphics::SetCompositingQuality и Graphics::SetInterpolationMode.

В следующем примере рисуются два многоточия: для режима сглаживания задано значение SmoothingModeAntiAlias , а для режима сглаживания задано значение SmoothingModeHighSpeed:

Graphics graphics(hdc);
Pen pen(Color(255, 0, 255, 0));  // opaque green

graphics.SetSmoothingMode(SmoothingModeAntiAlias);
graphics.DrawEllipse(&pen, 0, 0, 200, 100);
graphics.SetSmoothingMode(SmoothingModeHighSpeed);
graphics.DrawEllipse(&pen, 0, 150, 200, 100);

Преобразования

Объект Graphics поддерживает два преобразования (мир и страница), которые применяются ко всем элементам, нарисованным этим графическим объектом. Любое аффинное преобразование может храниться в преобразовании мировых координат. Аффинные преобразования включают в себя масштабирование, поворот, отражение, наклон и сдвиг. Преобразование координат страницы можно использовать для масштабирования и изменения единиц измерения (например, пикселей на дюймы). Дополнительные сведения о преобразованиях см. в разделе Системы координат и преобразования.

В следующем примере задаются преобразования мира и страниц объекта Graphics . Для преобразования мировых координат устанавливается поворот на 30 градусов. Преобразование страницы задается таким образом, что координаты, передаваемые второму объекту Graphics::D rawEllipse , будут обрабатываться как миллиметры, а не пиксели. Код выполняет два идентичных вызова метода Graphics::D rawEllipse . Преобразование мира применяется к первому вызову Graphics::D rawEllipse , а оба преобразования (мир и страница) применяются ко второму вызову Graphics::D rawEllipse .

Graphics graphics(hdc);
Pen pen(Color(255, 255, 0, 0));

graphics.ResetTransform();
graphics.RotateTransform(30.0f);            // World transformation
graphics.DrawEllipse(&pen, 30, 0, 50, 25);
graphics.SetPageUnit(UnitMillimeter);       // Page transformation
graphics.DrawEllipse(&pen, 30, 0, 50, 25);

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

снимок экрана: окно, содержащее маленький тонкий эллипс и большой, более толстый эллипс

 

Отсеченная область

Объект Graphics поддерживает отсеченную область, которая применяется ко всем элементам, нарисованным этим графическим объектом. Вы можете задать область обрезки, вызвав метод SetClip .

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

Graphics graphics(hdc);
Pen pen(Color(255, 255, 0, 0), 5);  // opaque red, width 5
SolidBrush brush(Color(255, 180, 255, 255));  // opaque aqua

// Create a plus-shaped region by forming the union of two rectangles.
Region region(Rect(50, 0, 50, 150));
region.Union(Rect(0, 50, 150, 50));
graphics.FillRegion(&brush, &region);

// Set the clipping region.
graphics.SetClip(&region);

// Draw two clipped lines.
graphics.DrawLine(&pen, 0, 30, 150, 160);
graphics.DrawLine(&pen, 40, 20, 190, 150);

На следующем рисунке показаны обрезанные линии.

Иллюстрация, показывающая цветную фигуру, пересекаемую двумя диагональными красными линиями