This article has been
excerpted from book "Graphics Programming with GDI+".
During the life cycle of a Graphics object, the object maintains a list of
graphics states. These graphics states fall into various categories depending on
the operations being applied to the Graphics object. For example, setting the
compositing quality of a Graphics object changes the object's state.
Graphics states can be divided into three categories:
- Quality setting
- Transformations
- Clipping region
The first state of the Graphics object involves
the quality of shapes and images. This state changes when you set the quality of
a Graphics object using the SmoothingMode, TextRenderingHint, CompositingMode,
CompositingQuality, and InterpolationMode properties of the Graphics class.
Transformation is another state that a Graphics object maintains. Transformation
is the process of changing graphics object from one state to another by
rotation, scaling, reflection, translation, and shearing.
The Graphics object maintains two transformation states: world and page. The
world transformation defines the conversion of world coordinates to page
coordinates. World coordinates are coordinates that you define in your program,
and page coordinates are coordinates that GDI+ uses to expose the object
coordinates. The page transformation defines the conversion of page coordinates
to device coordinates. Device coordinates determine how a graphics object will
be displayed on a particular display device.
The Graphics class provides the ScaleTransform, RotateTransform, and
TranslateTransform methods, as well as the Transform property, to support
transformations.
The world unit (by default) is always defined as a pixel. For example, in the
following code snippet a rectangle will be drawn starting at 0 pixels from the
left edge and 0 pixel from the top edge, with width and height of 100 and 50
pixels, respectively.
Graphics g = this.CreateGraphics();
g.DrawRectangle(Pens.Green, 0, 0, 100, 50);
Page coordinates may be different from world coordinates, depending on the page
unit and page scaling of the Graphics object. For example, if the page unit is
an inch, the page coordinates will start at point (0, 0) but the width and
height of the rectangle will be 100 inches and 50 inches, respectively.
TABLE 9.9: GraphicsUnit members
Member |
Description |
Display |
1/75 inch as the
unit of measure. |
Document |
The document unit
(1/300 inch) as the unit of measure. |
Inch |
An inch as the unit
of measure. |
Millimeter |
A millimeter as the
unit of measure. |
Pixel |
A pixel as the unit
of measure. |
Point |
A printer's point
(1/72 inch) as the unit of measure. |
World |
The world unit as
the unit of measure. |
The PageScale and PageUnit properties define a page transformation. The PageUnit
property defines the unit of measure used for page coordinates, and the
PageScale property defines the scaling between world and page units for a
Graphics object. The PageUnit property takes a value of type GraphicsUnit
enumeration, which is defined in Table 9.9.
Listing 9.13 draws three ellipses with the same size but different PageUnit
values: Pixel, Millimeter, and Point.
LISTING 9.13: Setting page transformation
private void
TransformUnits_Click(object sender, System.EventArgs
e)
{
// Create a Graphics object and set its background as
form's background
Graphics g = this.CreateGraphics();
g.Clear(this.BackColor);
// Draw an ellipse with default units
g.DrawEllipse(Pens.Red, 0, 0, 100, 50);
// Draw an ellipse with page unit as pixel
g.PageUnit
= GraphicsUnit.Pixel;
g.DrawEllipse(Pens.Red, 0, 0, 100, 50);
// Draw an ellipse with page unit as millimeter
g.PageUnit
= GraphicsUnit.Millimeter;
g.DrawEllipse(Pens.Blue, 0, 0, 100, 50);
// Draw an ellipse with page unit as point
g.PageUnit
= GraphicsUnit.Point;
g.DrawEllipse(Pens.Green, 0, 0, 100, 50);
// Dispose of object
g.Dispose();
}
Figure 9.21 shows the output from Listing 9.13. Although the parameters to
DrawEllipse are the same, we get results of different sizes because of the
different PageUnit settings.
The third state of the Graphics object is the clipping region. A Graphics object
maintains a clipping region that applies to all items drawn by that object. You
can set the clipping region by calling the SetClip method. It has six overloaded
forms, which vary in using a Graphics object, graphics path, region, rectangle,
or handle to a GDI region as the first parameter. The second parameter in all
six forms is CombineMode, which has six values: Complement, Exclude, Intersect,
Replace, Union, and Xor. The Clip property of the Graphics object specifies a
Region object that limits the portion of a Graphics object that is currently
available for drawing. The ClipBounds property returns a RectangleF Structure
that represents a bounding rectangle for the clipping region of a Graphics
object.
FIGURE 9.21: Drawing with different PageUnit Values
Conclusion
Hope the article would have helped you in understanding
Graphics States in GDI+. Read other articles on GDI+ on the website.
|
This book teaches
.NET developers how to work with GDI+ as they develop applications
that include graphics, or that interact with monitors or printers.
It begins by explaining the difference between GDI and GDI+, and
covering the basic concepts of graphics programming in Windows. |