This article has been 
excerpted from book "Graphics Programming with GDI+".
Creating a Graphic Container
The BeginContainer method of the Graphics class creates a container. Each 
BeginContainer method is paired with an EndContainer method.
You can also create nested containers. The following code snippet creates two 
containers:
            GraphicsContainer gContrainer1 = g.BeginContainer();
            // Do something here
            GraphicsContain1er gContrainer2 = g.BeginContainer();
            // Do something here
            g.EndContainer(gContrainer2);
            g.EndContainer(gContrainer1);
Using Graphics Containers to Draw Text
As mentioned earlier, graphics containers are temporary canvases. Let's see how 
to set the quality of different text for different containers. Listing 9.15 
creates two containers, and each has different properties. The first container 
sets the TextRenderingHint property to AntiAlias and the TextContrast property 
to 4. The second container sets TextRenderingHint to AntiAliasGridFit and 
TextContrast to 12. After creating Font and SolidBrush objects, we set the 
TextRenderingHint property of the Graphics object, and then we call DrawString. 
Finally we call EndContainer to terminate the container scope.
LISTING 9.15: Using different graphics containers to draw text
        private void 
DrawTextMenu_Click(object sender, System.EventArgs 
e)
        {
            // Create a Graphics object and set its 
background as the form's background
            Graphics g =
this.CreateGraphics();
            g.Clear(this.BackColor);
            // Create font and brushes
            Font tnrFont =
new Font("Times 
New Roman", 40, FontStyle.Bold,
GraphicsUnit.Pixel);
            SolidBrush blueBrush =
new SolidBrush(Color.Blue);
            g.TextRenderingHint = TextRenderingHint.SystemDefault;
            // First container boundary starts here
            GraphicsContainer gContrainer1 = g.BeginContainer();
            // Gamma correction value = 0 – 12. 
Default is 4.
            g.TextContrast = 4;
            g.TextRenderingHint = TextRenderingHint.AntiAlias;
            g.DrawString("Text String", 
tnrFont, blueBrush, new
PointF(10, 20));
            // Second container boundary starts here
            GraphicsContainer gContrainer2 = g.BeginContainer();
            // Gamma correction value = 0 – 12. Default is 4.
            g.TextContrast = 12;
            g.TextRenderingHint = TextRenderingHint.AntiAliasGridFit;
            g.DrawString("Text String", 
tnrFont, blueBrush, new
PointF(10, 50));
            // Second container boundary finishes here
            g.EndContainer(gContrainer2);
            // First container boundary finishes here
            g.EndContainer(gContrainer1);
            //Draw string outside of the container
            g.DrawString("Text String", 
tnrFont, blueBrush, new
Point(10, 80));
            // Dispose of Graphics object
            blueBrush.Dispose();
            g.Dispose();
        }
Note: The TextRenderingHint enumeration is defined in the 
System.Drawing.Text namespace. Don't forget to add this namespace reference. 
Figure 9.23 shows the output from Listing 9.15. Notice the quality difference in 
the text.
Using Graphics Containers to Draw Shapes
In the previous section we saw how we can use containers to draw text with 
different rendering quality and performance. We can draw other shapes using 
SmoothingMode, CompositingQuality, and other properties.
Listing 9.16 uses the AntiAlias, GammaCorrected, and HighSpeed options to draw 
rectangles and ellipses. We create a container by calling BeginContainer, set 
the smoothing mode to anti-aliasing, and set the compositing quality and gamma 
correction of the Graphics object. Then we draw an ellipse and a rectangle. 
After that we create a second graphics container by making another call to 
BeginContainer and set the smoothing mode and compositing quality to high speed, 
and then we draw a new ellipse and rectangle. Finally, we make two calls to the 
EndContainer method to close the containers.
FIGURE 9.23: Using graphics containers to draw text
LISTING 9.16: Using graphics container to draw shapes
        private void 
DrawShapeMenu_Click(object sender, System.EventArgs 
e)
        {
            // Create a Graphics object and set its 
background as the form's background
            Graphics g =
this.CreateGraphics();
            g.Clear(this.BackColor);
            // Create pens
            Pen redPen =
new Pen(Color.Red, 
20);
            Pen bluePen =
new Pen(Color.Blue, 
10);
            // Create first graphics container
            GraphicsContainer gContainer1 = g.BeginContainer();
            // Set its properties
            g.SmoothingMode = SmoothingMode.AntiAlias;
            g.CompositingQuality =
                CompositingQuality.GammaCorrected;
            // Draw graphics objects
            g.DrawEllipse(redPen, 10, 10, 100, 50);
            g.DrawRectangle(bluePen, 210, 0, 100, 100);
            // Create second graphics container
            GraphicsContainer gContainer2 = g.BeginContainer();
            // Set its properties
            g.SmoothingMode = SmoothingMode.HighSpeed;
            g.CompositingQuality =
                CompositingQuality.HighSpeed;
            // Draw graphics objects
            g.DrawEllipse(redPen, 10, 150, 100, 50);
            g.DrawRectangle(bluePen, 210, 150, 100, 100);
            // Destroy containers
            g.EndContainer(gContainer2);
            g.EndContainer(gContainer1);
            // Dispose of object
            redPen.Dispose();
            bluePen.Dispose();
            g.Dispose();
        }
Figure 9.24 shows the output from Listing 9.16. The first ellipse and rectangle 
are smoother than the second set.
Graphics containers are also useful when you need to render large images either 
with high quality or at high speed. For example, if you have two large images 
and only one is quality-sensitive, you can create two graphics containers and 
set high quality for the first container and high speed for the second.
FIGURE 9.24: Using graphics containers to draw shapes
Conclusion
Hope the article would have helped you in understanding working with Graphics Containers in GDI+. Read other articles on GDI+ on the website.
	
		
			| ![bookGDI.jpg]() 
 | 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. |