Outlining, Dragging, and Pasting a Region (Visual Basic)

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 RasterView control, name it LEADRasterView2, and set its Visible property to False. NOTE: for simplicity, this example uses 2 controls. In order to save memory, your application could use a dynamically created ILEADRaster object instead of the 2nd LEAD Raster View control.

3.

Add the following form-level variables to the declarations procedure of the general object in your main form. In online help, you can use the Edit pull-down menu to copy the block of code.

Dim ReadyToDrag As Boolean 'The state after marking the region but before dragging
Dim Dragging As Boolean 'The state when the mouse is used for dragging the floater
Dim StartX As Single 'Starting X position in screen twips
Dim StartY As Single 'Starting Y position in screen twips
Dim FloaterX As Single 'Floater X position in screen twips
Dim FloaterY As Single 'Floater Y position in screen twips
Dim ZoomFactorX As Single 'Used for translating positioning information
Dim ZoomFactorY As Single 'Used for translating positioning information

4.

Add the LEAD RasterProcess Object Library to your project.

 

On the Project pull-down menu, use the References option, and select the LEAD RasterProcess Object Library (14.5).

5.

image\btncmd.gif At the top of your main form, add two command buttons and name them as follows:

 

Name

Caption

 

SelRgnBtn

Select Region

 

PasteFloaterBtn

Paste Floater

6.

Add the following code to the SelRgnBtn control's Click procedure. In online help, you can use the Edit pull-down menu to copy the block of code.

Private Sub SelRgnBtn_Click()
    LEADRasterView1.RgnFrameType = RGNFRAME_ANIMATED
    LEADRasterView1.Raster.RefBitmap = False
    LEADRasterView1.RgnMarkingMode = RGNMARK_FREEHAND
    MsgBox "Draw a freehand region"
End Sub

7.

Add the following code to the PasteFloaterBtn control's Click procedure:

Private Sub PasteFloaterBtn_Click()
    Dim RasterProc As New LEADRasterProcess
    Dim LCRgnX As Single
    Dim LCRgnY As Single
    Dim LCRgnWidth As Single
    Dim LCRgnHeight As Single
    Dim LBRgnX As Single
    Dim LBRgnY As Single
    Dim LBRgnWidth As Single
    Dim LBRgnHeight As Single
    Dim MyOp As CombineConstants
    
    'Do nothing if there is no floater.
    If LEADRasterView1.Floater = 0 Then Exit Sub
    '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 be used 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 LEADRasterView2 bitmap into the LEADRasterView1 bitmap.
    MyOp = CB_OP_ADD + CB_DST_0 'Operation flags for a simple paste.
    RasterProc.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
End Sub

8.

In the LEADRasterView1 control's MouseDown procedure, add the following code:

Private Sub LEADRasterView1_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal x As Single, ByVal y As Single)
    Dim BitmapX As Single
    Dim BitmapY As Single
    Dim NewX As Single
    Dim NewY As Single
    Dim NewWidth As Single
    Dim NewHeight As Single
    'Do nothing if we are drawing a region.
    If LEADRasterView1.RgnMarkingMode <> RGNMARK_NONE Then Exit Sub
    ' 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 = True Then
      '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) Then
         '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
      End If
    End If
End Sub

9.

In the LEADRasterView1 control's MouseMove procedure, add the following code.

Private Sub LEADRasterView1_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal x As Single, ByVal y As Single)
    Dim xDelta As Single
    Dim yDelta As Single
    Dim NewX As Single
    Dim NewY As Single
    Dim NewWidth As Single
    Dim NewHeight As Single
    'Do nothing if we are drawing a region.
    If LEADRasterView1.RgnMarkingMode <> RGNMARK_NONE Then Exit Sub
    'Reposition the floater if we are dragging it.
    If Dragging = True And Button = 1 And LEADRasterView1.Floater <> 0 Then
        If LEADRasterView1.IsPtInFloater(x, y) Then
            '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
        End If
    End If
EndSub

10.

In the LEADRasterView1 control's MouseUp procedure, add the following code.

Private Sub LEADRasterView1_MouseUp(ByVal Button As Integer, ByVal Shift As Integer, ByVal x As Single, ByVal y As Single)
    ' If we were drawing a region, set up for the next operation.
    If LEADRasterView1.RgnMarkingMode <> RGNMARK_NONE Then
        LEADRasterView1.RgnMarkingMode = RGNMARK_NONE
        LEADRasterView1.RgnFrameType = RGNFRAME_STATIC
        ReadyToDrag = True
        MsgBox "Now, drag the selection to another place."
    End If
End Sub

11.

Run your program to test it.