SetRgn... example for Visual Basic

Note: Also works with Access 95 and 97.

This example demonstrates the SetRgnEllipse, SetRgnRect, SetRgnRoundRect, and SetRgnPolygon methods by simulating client area coordinates. Normally, you would get the coordinates interactively from mouse events and would use Windows GDI functions to outline the shape of each region before it is created.

To create the polygonal region, this example uses the PolygonSize, PolygonX, and PolygonY properties.

Also, to demonstrate the SetRgnColor method, it uses the Fill method to fill the region with a solid color, then uses the fill color to create a new region.

'Declare local variables.
Dim ZoomFactorX As Single 'Used for translating positioning information
Dim ZoomFactorY As Single 'Used for translating positioning information
Dim OffsetX, OffsetY, CurrentX, CurrentY 'To simulate mouse coordinates
Dim SimLeft, SimTop, SimWidth, SimHeight 'To simulate mouse coordinates
Dim LBRgnLeft, LBRgnTop, LBRgnWidth, LBRgnHeight, eW, eH 'For bitmap coordinates
Dim i As Integer 'Loop counter
Dim xPoint, yPoint 'Arrays for polygon points

'Initialize the variables that we will manipulate to simulate mouse coordinates.
OffsetX = Lead1.ScaleWidth / 15
OffsetY = Lead1.ScaleHeight / 15
CurrentX = OffsetX
CurrentY = OffsetY

'Set the zoom factors.
ZoomFactorX = Lead1.DstWidth / Lead1.SrcWidth
ZoomFactorY = Lead1.DstHeight / Lead1.SrcHeight

'Start by simulating the drawing of a rectangle.
SimLeft = CurrentX
SimTop = CurrentY
SimWidth = OffsetX * 2
SimHeight = OffsetY * 2

'Translate the simulated client coordinates to bitmap coordinates.
LBRgnLeft = (SimLeft / ZoomFactorX) - (Lead1.DstLeft / ZoomFactorX) + Lead1.SrcLeft
LBRgnTop = (SimTop / ZoomFactorY) - (Lead1.DstTop / ZoomFactorY) + Lead1.SrcTop
LBRgnWidth = SimWidth / ZoomFactorX
LBRgnHeight = SimHeight / ZoomFactorY

'Create the rectangular region, outline it, and display a message so that we can see what happened.
Lead1.SetRgnRect LBRgnLeft, LBRgnTop, LBRgnWidth, LBRgnHeight, L_RGN_SET
Lead1.RgnFrameType = RGNFRAME_STATIC
MsgBox "Here is the rectangular region"

'Move the current mouse position so that we overlap the existing region.
CurrentX = CurrentX + OffsetX
CurrentY = CurrentY + OffsetY

'Next, simulate the drawing of an ellipse.
SimLeft = CurrentX
SimTop = CurrentY
SimWidth = OffsetX * 3
SimHeight = OffsetY * 2

'Translate the simulated client coordinates to bitmap coordinates.
LBRgnLeft = (SimLeft / ZoomFactorX) - (Lead1.DstLeft / ZoomFactorX) + Lead1.SrcLeft
LBRgnTop = (SimTop / ZoomFactorY) - (Lead1.DstTop / ZoomFactorY) + Lead1.SrcTop
LBRgnWidth = SimWidth / ZoomFactorX
LBRgnHeight = SimHeight / ZoomFactorY

'Add the elliptical region, using a Boolean OR,
'and display a message so that we can see what happened.
Lead1.SetRgnEllipse LBRgnLeft, LBRgnTop, LBRgnWidth, LBRgnHeight, L_RGN_OR
Lead1.RgnFrameType = RGNFRAME_STATIC
MsgBox "Here is the added ellipse, with a Boolean OR"

'Move the current mouse position so that we overlap the existing region.
CurrentX = CurrentX + OffsetX
CurrentY = CurrentY + OffsetY

'Next, simulate the drawing of a rounded rectangle.
SimLeft = CurrentX
SimTop = CurrentY
SimWidth = OffsetX * 3
SimHeight = OffsetY * 2

'Translate the simulated client coordinates to bitmap coordinates.
LBRgnLeft = (SimLeft / ZoomFactorX) - (Lead1.DstLeft / ZoomFactorX) + Lead1.SrcLeft
LBRgnTop = (SimTop / ZoomFactorY) - (Lead1.DstTop / ZoomFactorY) + Lead1.SrcTop
LBRgnWidth = SimWidth / ZoomFactorX
LBRgnHeight = SimHeight / ZoomFactorY

'Define an ellipse to use for the corners.
eW = LBRgnWidth / 4
eH = LBRgnHeight / 4

'Add the rounded rectangular region, using a Boolean exclusive OR,
'and display a message so that we can see what happened.
Lead1.SetRgnRoundRect LBRgnLeft, LBRgnTop, LBRgnWidth, LBRgnHeight, eW, eH, L_RGN_XOR
MsgBox "Here is the rounded rectangle, with a Boolean XOR"

'Move the current mouse position so that we overlap the existing region.
CurrentX = CurrentX + (2 * OffsetX)
CurrentY = CurrentY + (2 * OffsetY)

'Set up some arrays to use as client area grid values. 
'OffsetX and OffsetY set the grid sizes.
xPoint = Array(0, -1, 2, 1, 1, 2, -1, -2)
yPoint = Array(0, -1, -1, 1, -1, 1, 1, 1)

'Initialize the polygon size using an arbitrary number.
'This number will be increased dynamically.
Lead1.PolygonSize = 5

'Fill in the array for the polygon. This simulates a user's mouse clicks.
For i = 0 To 7
    CurrentX = CurrentX + (xPoint(i) * OffsetX)
    CurrentY = CurrentY + (yPoint(i) * OffsetY)
    Lead1.PolygonX(i) = (CurrentX / ZoomFactorX) - (Lead1.DstLeft / ZoomFactorX) + Lead1.SrcLeft
    Lead1.PolygonY(i) = (CurrentY / ZoomFactorY) - (Lead1.DstTop / ZoomFactorY) + Lead1.SrcTop
    If i + 1 = Lead1.PolygonSize Then Lead1.PolygonSize = Lead1.PolygonSize + 5
Next

'Adjust the polygon size to the actual number of points.
Lead1.PolygonSize = i

'Add the polygonal region, using a Boolean OR,
'and display a message so that we can see what happened.
Lead1.SetRgnPolygon L_POLY_WINDING, L_RGN_OR
MsgBox "Here is the added polygon, with a Boolean OR"

'Fill the resulting polygon with red, and display a message.
Lead1.Fill RGB(255, 0, 0)
Lead1.RgnFrameType = RGNFRAME_NONE
Lead1.ForceRepaint
MsgBox "Using SetRgnColor and L_RGN_SETNOT, all else will become blue."

'Clean up memory
Lead1.FreeRgn

'Do the final region.
Lead1.SetRgnColor RGB(255, 0, 0), L_RGN_SETNOT
Lead1.Fill RGB(0, 0, 255)
Lead1.ForceRepaint

'Clean up memory
Lead1.FreeRgn
Lead1.PolygonSize = 0