Состояние графического объекта
Класс 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, ®ion);
// Set the clipping region.
graphics.SetClip(®ion);
// Draw two clipped lines.
graphics.DrawLine(&pen, 0, 30, 150, 160);
graphics.DrawLine(&pen, 40, 20, 190, 150);
На следующем рисунке показаны обрезанные линии.