Outlining, Dragging, and Pasting a Region (C++ Builder 6.0)
Take the following steps to add code that lets you outline an area with a mouse, drag a copy of the selected area, and paste the copy into another part of the bitmap:
1. |
Start with the project that you created in Loading and Displaying an Image. |
2. |
Add a second LEAD Raster View control, and set its Visible property to False. |
3. |
On the Project pull-down menu, use the Import Type library… and install the LEAD Raster Process object library (14.5). Press OK. |
4. |
Select the LEAD Raster Process from the ActiveX tab and add it to your form. |
5. |
Declare the following variables in the private section of “Unit1.h”. In online help, you can use the Edit pull-down menu to copy the block of code. |
bool ReadyToDrag; //The state after marking the region but before dragging
bool Dragging; //The state when the mouse is used for dragging the floater
float StartX; //Starting X position in screen twips
float StartY; //Starting Y position in screen twips
float FloaterX; //Floater X position in screen twips
float FloaterY; //Floater Y position in screen twips
float ZoomFactorX; //Used for translating positioning information
float ZoomFactorY; //Used for translating positioning information
6. |
At the top of your main form, add two command buttons and name them as follows: |
|
|
Name |
Caption |
|
btnSelRgn |
Select Region |
|
btnPasteFloater |
Paste Floater |
7. |
Code btnSelRgn control's Click procedure as the following. In online help, you can use the Edit pull-down menu to copy the block of code. |
void __fastcall TForm1::btnSelRgnClick(TObject *Sender)
{
LEADRasterView1->RgnFrameType = RGNFRAME_ANIMATED;
LEADRasterView1->Raster->RefBitmap = false ;
LEADRasterView1->RgnMarkingMode = RGNMARK_FREEHAND;
ShowMessage ( "Draw a freehand region" ) ;
}
8. |
Code btnPasteFloater control's Click procedure as the following. In online help, you can use the Edit pull-down menu to copy the block of code. |
void __fastcall TForm1::btnPasteFloaterClick(TObject *Sender)
{
float LCRgnX;
float LCRgnY;
float LCRgnWidth;
float LCRgnHeight;
float LBRgnX;
float LBRgnY;
float LBRgnWidth;
float LBRgnHeight;
CombineConstants MyOp ;
//Do nothing if there is no floater
if (LEADRasterView1->Floater == 0 )
return;
//Get the floater into another bitmap
LEADRasterView2->Raster->RefBitmap = false;
LEADRasterView2->ScaleMode = LEADRasterView1->ScaleMode;
LEADRasterView2->Raster->Bitmap = LEADRasterView1->Floater;
//Get the floater's client coordinates into local variables
LCRgnX = LEADRasterView1->FloaterDstLeft;
LCRgnY = LEADRasterView1->FloaterDstTop;
LCRgnWidth = LEADRasterView1->FloaterDstWidth;
LCRgnHeight = LEADRasterView1->FloaterDstHeight;
//Delete the floater->
LEADRasterView1->FloaterVisible = false;
LEADRasterView1->Floater = 0;
//Translate the client coordinates to bitmap coordinates
LBRgnX = ((LCRgnX - LEADRasterView1->DstLeft) / ZoomFactorX) + LEADRasterView1->SrcLeft;
LBRgnY = ((LCRgnY - LEADRasterView1->DstTop) / ZoomFactorY) + LEADRasterView1->SrcTop;
LBRgnWidth = LCRgnWidth / ZoomFactorX;
LBRgnHeight = LCRgnHeight / ZoomFactorY;
//Reposition the region to use as a mask for the Combine method
LEADRasterView1->Raster->OffsetRgn ( LBRgnX - LEADRasterView1->Raster->Rgnleft, LBRgnY - LEADRasterView1->Raster->RgnTop ) ;
//Use the Combine method to paste the Lead2 bitmap into the Lead1 bitmap
MyOp = (CombineConstants)(CB_OP_ADD + CB_DST_0) ; //Operation flags for a simple paste
LEADRasterProcess1->Combine ( LEADRasterView1->Raster, LBRgnX, LBRgnY, LBRgnWidth, LBRgnHeight, LEADRasterView2->
Raster, 0, 0, MyOp ) ;
//Repaint the part of the client area that has changed
LEADRasterView1->RepaintRect (LCRgnX, LCRgnY, LCRgnWidth, LCRgnHeight, false);
//Free the region
LEADRasterView1->Raster->FreeRgn ( ) ;
}
9. |
Handle the LEADRasterView1 control's OnMouseDown2 event, and code LEADRasterView1MouseDown2 as follows: |
void __fastcall TForm1::LEADRasterView1MouseDown2(TObject *Sender, short Button, short Shift, long x, long y)
{
float BitmapX;
float BitmapY;
float NewX;
float NewY;
float NewWidth;
float NewHeight;
//Do nothing if we are drawing a region.
if (LEADRasterView1->RgnMarkingMode != RGNMARK_NONE)
return;
//Save the starting position, in case we need it.
StartY= y;
StartX= x;
//If we are ready to drag the selection, get a floater.
if (ReadyToDrag)
{
//Translate the current mouse coordinates.
//These coordinates account for the zoom factor and offset.
ZoomFactorX = LEADRasterView1->DstWidth / LEADRasterView1->SrcWidth;
ZoomFactorY = LEADRasterView1->DstHeight / LEADRasterView1->SrcHeight;
BitmapX = (x / ZoomFactorX) - (LEADRasterView1->DstLeft / ZoomFactorX) + LEADRasterView1->SrcLeft;
BitmapY = (y / ZoomFactorY) - (LEADRasterView1->DstTop / ZoomFactorY) + LEADRasterView1->SrcTop;
//Continue to create the floater if the mouse is pointing to the region we marked
if ( LEADRasterView1->Raster->IsPtInRgn (BitmapX, BitmapY) )
{
//Hide the region frame->
LEADRasterView1->RgnFrameType = RGNFRAME_NONE;
//Create the floater bitmap, which will be the part of the main bitmap that is
//in the region's bounding rectangle
LEADRasterView1->Floater = LEADRasterView1->Raster->Bitmap;
//Translate the bitmap region coordinates to client area coordinates
NewY = ((LEADRasterView1->Raster->RgnTop - LEADRasterView1->SrcTop) * ZoomFactorY) + LEADRasterView1->DstTop;
NewX = ((LEADRasterView1->Raster->Rgnleft - LEADRasterView1->SrcLeft) * ZoomFactorX) + LEADRasterView1->DstLeft;
NewWidth = LEADRasterView1->Raster->RgnWidth * ZoomFactorX;
NewHeight = LEADRasterView1->Raster->RgnHeight * ZoomFactorY;
//Set the initial display position of the floater
LEADRasterView1->SetFloaterDstRect ( NewX, NewY, NewWidth, NewHeight);
//Set form-level variables
FloaterY = LEADRasterView1->FloaterDstTop;
FloaterX = LEADRasterView1->FloaterDstLeft;
LEADRasterView1->FloaterVisible = True;
Dragging = True;
ReadyToDrag = False;
}
}
}
10. |
Handle the LEADRasterView1 control's OnMouseMove2 event, and code LEADRasterView1MouseMove2 as follows: |
void __fastcall TForm1::LEADRasterView1MouseMove2 (TObject *Sender,
short Button, short Shift, long x, long y)
{
float xDelta;
float yDelta;
float NewX;
float NewY;
float NewWidth;
float NewHeight;
//Do nothing if we are drawing a region.
if (LEADRasterView1->RgnMarkingMode !=RGNMARK_NONE)
return;
//Reposition the floater if we are dragging it.
if ((Dragging) && (Button == 1) && (LEADRasterView1->Floater != 0))
{
if ( LEADRasterView1->IsPtInFloater (x, y))
{
//Update the position variables->
xDelta = x - StartX;
yDelta = y - StartY;
NewX = FloaterX + xDelta;
NewY = FloaterY + yDelta;
NewWidth = LEADRasterView1->FloaterDstWidth ;
NewHeight = LEADRasterView1->FloaterDstHeight;
//Reposition the floater
LEADRasterView1->SetFloaterDstRect (NewX, NewY, NewWidth, NewHeight) ;
//Save the form-level position variables->
FloaterY = NewY;
FloaterX = NewX;
StartY = y;
StartX = x;
}
}
}
11. |
Handle the LEADRasterView1 control's OnMouseUp2 event, and code LEADRasterView1MouseUp2 as follows: |
void __fastcall TForm1::LEADRasterView1MouseUp2 (TObject *Sender,
short Button, short Shift, long x, long y)
{
//if we were drawing a region, set up for the next operation.
if ( LEADRasterView1->RgnMarkingMode != RGNMARK_NONE )
{
LEADRasterView1->RgnMarkingMode = RGNMARK_NONE;
LEADRasterView1->RgnFrameType = RGNFRAME_STATIC;
ReadyToDrag = True;
ShowMessage ( "Now, drag the selection to another place." ) ;
}
}
12. |
Run your program to test it. |