You want to create off-screen bitmaps to store graphics in memory.
Sample code folder: Chapter 09\BitmapObject
Create Bitmap objects, and load images into them or draw directly on them.
You can create a bitmap in memory, draw graphics onto a Graphics object created for the bitmap, and then draw the bitmap to a form, panel, or other paintable surface. This can provide an increase in speed, and sequentially drawing multiple bitmaps onto a visible surface gives you a simple but effective type of animation.
The code example in this recipe creates a bitmap based on the size of the form and the nature of the Graphics object for the form. A new Graphics object is created based on the new bitmap, so graphics methods will apply to the bitmap. Much of the rest of the code creates radial lines emanating from two points near the center of the bitmap. Finally, once the bitmap graphics are complete, the bitmap is drawn to the form's Graphics object, which paints onto the face of the form:
Private Sub Form1_Paint(ByVal sender As Object, _ ByVal e As System.Windows.Forms.PaintEventArgs) _ Handles Me.Paint ' ----- Draw to the form indirectly through a bitmap. Dim x As Single Dim y As Single Dim xc As Single Dim yc As Single Dim angle As Single Dim radians As Single Dim workImage As Bitmap Dim canvas As Graphics ' ----- Create a bitmap that is the same size and ' format as the form surface. workImage = New Bitmap(Me.Size.Width, Me.Size.Height, _ e.Graphics) ' ----- Create a canvas for the bitmap. Drawing on the ' canvas impacts the bitmap directly. canvas = Graphics.FromImage(workImage) ' ---- Draw a radial pattern. For angle = 0 To 360 Step 2 radians = angle * Math.PI / 180 x = 500 * Math.Cos(radians) y = 500 * Math.Sin(radians) yc = Me.ClientSize.Height / 2 xc = Me.ClientSize.Width * 10 / 21 canvas.DrawLine(Pens.Black, xc, yc, xc + x, yc + y) xc = Me.ClientSize.Width * 11 / 21 canvas.DrawLine(Pens.Black, xc, yc, xc + x, yc + y) Next angle ' ----- Stamp the bitmap on the form surface. e.Graphics.DrawImage(workImage, 0, 0) End Sub
The key lines of code here are the ones that create the workImage and canvas objects. They create a bitmap compatible with the form and a graphics surface for the bit-map. All drawing methods require a Graphics object to provide a drawing surface. The last line uses the Graphics. DrawImage() method to draw the custom image onto the form, providing a way to get the in-memory bitmap onto a visible surface.
Figure 9-8 shows the new bitmap's contents as drawn onto the face of the form.
Figure 9-8. Drawing an in-memory bitmap onto a form
As you resize this form, its Paint event fires repeatedly, and the bitmap is recreated on the fly. However, it doesn't redraw the entire surface, because Windows tries to limit screen redraws to only those parts that it thinks have changed. In this case, only the newly exposed areas of the form are redrawn. To circumvent this, add the following code to the form:
Private Sub Form1_Resize(ByVal sender As Object, _ ByVal e As System.EventArgs) Handles Me.Resize ' ----- Redraw the surface cleanly. Me.Invalidate() End Sub
Now the entire image is redrawn as the form size changes.