SetRgn... example for Visual J++

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.

// Initialize the variables that we will manipulate to simulate mouse coordinates.
int nOffsetX = (int) LEAD1.getScaleWidth() / 15;
int nOffsetY = (int) LEAD1.getScaleHeight() / 15;
int nCurrentX = nOffsetX;
int nCurrentY = nOffsetY;

// Set the zoom factors.
float fZoomFactorX = LEAD1.getDstWidth() / LEAD1.getSrcWidth();
float fZoomFactorY = LEAD1.getDstHeight() / LEAD1.getSrcHeight();

// Start by simulating the drawing of a rectangle.
int nSimLeft = nCurrentX;
int nSimTop = nCurrentY;
int nSimWidth = nOffsetX * 2;
int nSimHeight = nOffsetY * 2;

// Translate the simulated client coordinates to bitmap coordinates.
int nLBRgnLeft = (int) ( ( nSimLeft / fZoomFactorX) - ( LEAD1.getDstLeft() / fZoomFactorX ) + LEAD1.getSrcLeft() );
int nLBRgnTop = (int) ( ( nSimTop / fZoomFactorY) - ( LEAD1.getDstTop() / fZoomFactorY ) + LEAD1.getSrcTop() );
int nLBRgnWidth = (int) ( nSimWidth / fZoomFactorX );
int nLBRgnHeight = (int) ( nSimHeight / fZoomFactorY );

// Create the rectangular region, outline it, and display a message so that we can see what happened.
LEAD1.SetRgnRect( nLBRgnLeft, nLBRgnTop, nLBRgnWidth, nLBRgnHeight, (short) LTOCXU.RgnCombineModeConstants.L_RGN_SET );
LEAD1.setRgnFrameType( (short) LTOCXU.RgnFrameTypeConstants.RGNFRAME_STATIC );
MessageBox.show( "Here is the rectangular region" );

// Move the current mouse position so that we overlap the existing region.
nCurrentX += nOffsetX;
nCurrentY += nOffsetY;

// Next, simulate the drawing of an ellipse.
nSimLeft = nCurrentX;
nSimTop = nCurrentY;
nSimWidth = nOffsetX * 3;
nSimHeight = nOffsetY * 2;

// Translate the simulated client coordinates to bitmap coordinates.
nLBRgnLeft = (int) ( ( nSimLeft / fZoomFactorX) - ( LEAD1.getDstLeft() / fZoomFactorX ) +LEAD1.getSrcLeft() );
nLBRgnTop = (int) ( ( nSimTop / fZoomFactorY) - ( LEAD1.getDstTop() / fZoomFactorY ) + LEAD1.getSrcTop() );
nLBRgnWidth = (int) ( nSimWidth / fZoomFactorX );
nLBRgnHeight = (int) ( nSimHeight / fZoomFactorY );

// Add the elliptical region, using a Boolean OR,
// and display a message so that we can see what happened.
LEAD1.SetRgnEllipse( nLBRgnLeft, nLBRgnTop, nLBRgnWidth, nLBRgnHeight, (short) LTOCXU.RgnCombineModeConstants.L_RGN_OR );
LEAD1.setRgnFrameType( (short) LTOCXU.RgnFrameTypeConstants.RGNFRAME_STATIC );
MessageBox.show( "Here is the added ellipse, with a Boolean OR" );

// Move the current mouse position so that we overlap the existing region.
nCurrentX += nOffsetX;
nCurrentY += nOffsetY;

// Next, simulate the drawing of a rounded rectangle.
nSimLeft = nCurrentX;
nSimTop = nCurrentY;
nSimWidth = nOffsetX * 3;
nSimHeight = nOffsetY * 2;

// Translate the simulated client coordinates to bitmap coordinates.
nLBRgnLeft = (int) ( ( nSimLeft / fZoomFactorX) - ( LEAD1.getDstLeft() / fZoomFactorX ) + LEAD1.getSrcLeft() );
nLBRgnTop = (int) ( ( nSimTop / fZoomFactorY) - ( LEAD1.getDstTop() / fZoomFactorY ) + LEAD1.getSrcTop() );
nLBRgnWidth = (int) ( nSimWidth / fZoomFactorX );
nLBRgnHeight = (int) ( nSimHeight / fZoomFactorY );

// Define an ellipse to use for the corners.
int eW = nLBRgnWidth / 4;
int eH = nLBRgnHeight / 4;

// Add the rounded rectangular region, using a Boolean exclusive OR,
// and display a message so that we can see what happened.
LEAD1.SetRgnRoundRect( nLBRgnLeft, nLBRgnTop, nLBRgnWidth, nLBRgnHeight, eW, eH, (short) LTOCXU.RgnCombineModeConstants.L_RGN_XOR );
MessageBox.show( "Here is the rounded rectangle, with a Boolean XOR" );

// Move the current mouse position so that we overlap the existing region.
nCurrentX += 2 * nOffsetX;
nCurrentY += 2 * nOffsetY;

// Set up some arrays to use as client area grid values. 
// OffsetX and OffsetY set the grid sizes.
int [] xPoint = { 0, -1, 2, 1, 1, 2, -1, -2 };
int [] yPoint = { 0, -1, -1, 1, -1, 1, 1, 1 };

// Initialize the polygon size using an arbitrary number.
// This number will be increased dynamically.
LEAD1.setPolygonSize( (short) 5 );

// Fill in the array for the polygon. This simulates a user's mouse clicks.
short i;
for( i = 0 ; i < 8 ; i ++ )
{
   nCurrentX += xPoint[ i ] * nOffsetX;
   nCurrentY += yPoint[ i ] * nOffsetY;
   LEAD1.setPolygonX( i, (int) ( ( nCurrentX / fZoomFactorX ) - ( LEAD1.getDstLeft() / fZoomFactorX ) + LEAD1.getSrcLeft() ) );
   LEAD1.setPolygonY( i, (int) ( ( nCurrentY / fZoomFactorY ) - ( LEAD1.getDstTop() / fZoomFactorY ) + LEAD1.getSrcTop() ) );
   if( ( i + 1 ) == LEAD1.getPolygonSize() )
      LEAD1.setPolygonSize( (short) ( LEAD1.getPolygonSize() + 5 ) );
}

// Adjust the polygon size to the actual number of points.
LEAD1.setPolygonSize( i );

// Add the polygonal region, using a Boolean OR,
// and display a message so that we can see what happened.
LEAD1.SetRgnPolygon( (short) LTOCXU.RgnPolygonFillModeConstants.L_POLY_WINDING, (short) LTOCXU.RgnCombineModeConstants.L_RGN_OR );
MessageBox.show( "Here is the added polygon, with a Boolean OR" );

// Fill the resulting polygon with red, and display a message.
LEAD1.Fill( new Color( 255, 0, 0 ) );
LEAD1.setRgnFrameType( (short) LTOCXU.RgnFrameTypeConstants.RGNFRAME_NONE );
LEAD1.ForceRepaint();
MessageBox.show( "Using SetRgnColor and L_RGN_SETNOT, all else will become blue." );

// Clean up memory
LEAD1.FreeRgn();

// Do the final region.
LEAD1.SetRgnColor( new Color( 255, 0, 0 ), (short) LTOCXU.RgnCombineModeConstants.L_RGN_SETNOT );
LEAD1.Fill( new Color( 0, 0, 255 ) );
LEAD1.ForceRepaint();

// Clean up memory
LEAD1.FreeRgn();
LEAD1.setPolygonSize( (short) 0 );