Sure you can create a Subclass of any Picture, Canvas or class and write code to center another Picture in its respective Graphics contexts. But taking the class extension approach means that you can reuse the same code for any of these (or any additional class) offering a Graphic context, so you can pass along the Picture you want to center and re-scale (if needed) in its area.
You may already know that in order to create a Method Class Extension, you need to add a new method to a Module. For example, you can create a new Module and name it “Graphic Extensions”.
Then add a new Method to it using the following signature:
- Name: CenterPicture
- Parameters: Extends g As Graphics, Image As Picture
- Scope: Global

Add the code that will position and scale the received picture on the Graphic area:
// Let's check first that the referenced Picture is not nil
If Not (image Is Nil) Then
Var Height, Width As Integer
Var SourceY, SourceX As Integer = 0
//If the Image width and Height just fit inside the Graphic area
//then there is not need to scale it.
If image.Width <= g.Width And image.Height <= g.Height Then
Width = image.Width
Height = image.Height
Else
// Else, let's scale the image when its width is greater
// than its height
If g.Width >= g.Height And image.Width >= image.Height Then
Width = g.Width
Height = (Image.Height * Width) / image.Width
//…recalculating its width if the new height is greater
// than the height of the current Graphics context
If Height > g.Height Then
Height = g.Height
Width = (image.Width*Height)/image.Height
End If
// let's scale the image when its width is less than its height
// but the width of the graphics context is greater than its height
Elseif g.Width >= g.Height And image.Width <= image.Height Then
Height = g.Height
Width = (image.Width * Height) / image.Height
// scale the imagen when the width is greater than its height
// and the width from the Graphics context is less than its height
Elseif g.Width <= g.Height And image.Width >= image.Height Then
Width = g.Width
Height = (image.Height * Width) / image.Width
// lastly, this is the case when both the image and Graphics width
// is less than its respective heights.
Elseif g.Width <= g.Height And image.Width <= image.Height Then
Height = g.Height
Width = (image.Width*Height)/image.Height
// It may be the case that the new calculated width is greater
// than the available width in the Graphics context,
// so we adjust the scale on the max width for the image.
If Width > g.Width Then
Width = g.Width
Height = (image.Height*Width)/image.Width
End If
End If
End If
// Let's calculate the X and Y coordinates in order to
// display the image centered on the Graphics context
sourcex = (g.Width/2) - (Width/2)
sourcey = (g.Height/2) - (Height/2)
// and we draw finally the picture in the Graphic context
// using the new calculated values
g.DrawPicture(image,sourcex,sourcey,Width,Height,0,0,image.Width,Image.Height)
End If
And that’s all.
From now on, you can call this method from the Paint Event Handler of a Canvas subclass, or the Graphics context of another Picture using:
g.CenterPicture(mImage) // mImage is a valid instance of a Picture
Of course, you can go ahead and add other useful method extensions to your own Graphics Extensions module.
