Leadtools.WinForms Send comments on this topic. | Back to Introduction - All Topics | Help Version 16.5.9.25
GetTransformWithDpi Method
See Also  Example
Leadtools.WinForms Namespace > RasterImageViewer Class : GetTransformWithDpi Method



Return the transform of the viewer taking into account the DPI of the image.

Syntax

Visual Basic (Declaration) 
Public Function GetTransformWithDpi() As Matrix
Visual Basic (Usage)Copy Code
Dim instance As RasterImageViewer
Dim value As Matrix
 
value = instance.GetTransformWithDpi()
C# 
public Matrix GetTransformWithDpi()
C++/CLI 
public:
Matrix GetTransformWithDpi(); 

Return Value

A Matrix object containing the values of the transform of the viewer taking into account the DPI of the image

Example

This example use the GetTransformWithDpi method to perform rubber band selection on a RasterImageViewer.

Visual BasicCopy Code
Friend Class MyForm4 : Inherits Form
    Private _viewer As RasterImageViewer
    ' Are we currently rubber banding
    Private isRubberBanding As Boolean
    ' The current rubberband rectangle
    Private rubberBandingRectangle As Rectangle
    ' Flag to indicates if the rubber band rectangle is drawn
    Private isRubberBandingRectangleDrawn As Boolean
    ' Did we clicp the cursor?
    Private isCursorClipped As Boolean
    Private saveClipRectangle As Rectangle

    Public Sub New(ByVal title As String)
        Text = title
        Size = New Size(750, 450)

        ' Create the raster viewer
        _viewer = New RasterImageViewer()
        _viewer.DoubleBuffer = True
        _viewer.Dock = DockStyle.Fill

        ' Load an image into the viewer
        RasterCodecs.Startup()
        Dim codecs As RasterCodecs = New RasterCodecs()
        _viewer.Image = codecs.Load(LeadtoolsExamples.Common.ImagesPath.Path + "Sample1.cmp")
        codecs.Dispose()
        RasterCodecs.Shutdown()

        Controls.Add(_viewer)
        _viewer.BringToFront()
        StartRubberBanding()
    End Sub

    ' Call this to start rubber banding on the viewer
    Private Sub StartRubberBanding()
        ' Subclass to the event we need
        AddHandler _viewer.MouseDown, AddressOf _viewer_MouseDown
        AddHandler _viewer.MouseMove, AddressOf _viewer_MouseMove
        AddHandler _viewer.MouseUp, AddressOf _viewer_MouseUp
        AddHandler _viewer.LostFocus, AddressOf _viewer_LostFocus
    End Sub

    ' Call this to stop rubber banding on the viewer
    Private Sub StopRubberBanding()
        ' Un-subclass to the events
        RemoveHandler _viewer.MouseDown, AddressOf _viewer_MouseDown
        RemoveHandler _viewer.MouseMove, AddressOf _viewer_MouseMove
        RemoveHandler _viewer.MouseUp, AddressOf _viewer_MouseUp
        RemoveHandler _viewer.LostFocus, AddressOf _viewer_LostFocus

        isRubberBanding = False
        rubberBandingRectangle = Rectangle.Empty
        isRubberBandingRectangleDrawn = False
        isCursorClipped = False
        saveClipRectangle = Rectangle.Empty
    End Sub

    ' Begins the rubber banding operation
    Private Sub BeginRubberBanding(ByVal x As Integer, ByVal y As Integer)
        rubberBandingRectangle = Rectangle.FromLTRB(x, y, x, y)

        isRubberBanding = True
        _viewer.Capture = True

        ' Clip the cursor
        ClipCursor(True)

        DrawRubberBandRectangle()
    End Sub

    ' Ends the rubber banding
    Private Sub EndRubberBanding()
        _viewer.Capture = False
        isRubberBanding = False

        If isRubberBandingRectangleDrawn Then
            DrawRubberBandRectangle()
        End If

        If isCursorClipped Then
            ClipCursor(False)
        End If
    End Sub

    Private Sub ClipCursor(ByVal clip As Boolean)
        If clip Then
            Dim rect As Rectangle = Rectangle.Intersect(FixRectangle(_viewer.PhysicalViewRectangle), _viewer.ClientRectangle)
            rect = _viewer.RectangleToScreen(rect)
            Dim parent As Control = _viewer.Parent
            Do While Not parent Is Nothing
                rect = Rectangle.Intersect(rect, _viewer.Parent.RectangleToScreen(_viewer.Parent.ClientRectangle))
                If TypeOf parent Is Form Then
                    Dim form As Form = TryCast(parent, Form)
                    If form.IsMdiChild Then
                        If Not form.Owner Is Nothing Then
                            rect = Rectangle.Intersect(rect, form.Owner.RectangleToScreen(form.Owner.ClientRectangle))
                        ElseIf Not form.Parent Is Nothing Then
                            rect = Rectangle.Intersect(rect, form.Parent.RectangleToScreen(form.Parent.ClientRectangle))
                        End If
                    End If
                End If

                parent = parent.Parent
            Loop

            rect.Height += 1
            rect.Width += 1

            saveClipRectangle = Cursor.Clip
            Cursor.Clip = rect
            isCursorClipped = True
        Else
            Cursor.Clip = saveClipRectangle
            isCursorClipped = False
            saveClipRectangle = Rectangle.Empty
        End If
    End Sub

    Private Shared Function FixRectangle(ByVal rect As Rectangle) As Rectangle
        If rect.Left > rect.Right Then
            rect = Rectangle.FromLTRB(rect.Right, rect.Top, rect.Left, rect.Bottom)
        End If
        If rect.Top > rect.Bottom Then
            rect = Rectangle.FromLTRB(rect.Left, rect.Bottom, rect.Right, rect.Top)
        End If

        Return rect
    End Function

    ' Draws the rubberband rectangle on the viewer
    Private Sub DrawRubberBandRectangle()
        Dim rect As Rectangle = FixRectangle(rubberBandingRectangle)
        rect.Width += 1
        rect.Height += 1
        rect = _viewer.RectangleToScreen(rect)
        ControlPaint.DrawReversibleFrame(rect, Color.Transparent, FrameStyle.Thick)

        isRubberBandingRectangleDrawn = Not isRubberBandingRectangleDrawn
    End Sub

    Private Sub _viewer_MouseDown(ByVal sender As Object, ByVal e As MouseEventArgs)
        _viewer.Focus()

        ' Cancel rubber banding if it is on
        If isRubberBanding Then
            EndRubberBanding()
        Else
            If _viewer.IsImageAvailable AndAlso e.Button = MouseButtons.Left Then
                ' See if we click is on the image
                Dim rect As Rectangle = _viewer.PhysicalViewRectangle
                If rect.Contains(e.X, e.Y) Then
                    ' Start the rubber banding
                    BeginRubberBanding(e.X, e.Y)
                End If
            End If
        End If
    End Sub

    Private Sub _viewer_MouseMove(ByVal sender As Object, ByVal e As MouseEventArgs)
        If isRubberBanding Then
            DrawRubberBandRectangle()

            rubberBandingRectangle = Rectangle.FromLTRB(rubberBandingRectangle.Left, rubberBandingRectangle.Top, e.X, e.Y)

            DrawRubberBandRectangle()
        End If
    End Sub

    Private Sub _viewer_MouseUp(ByVal sender As Object, ByVal e As MouseEventArgs)
        If isRubberBanding Then
            ' Save the rubberband rectangle
            Dim rect As Rectangle = rubberBandingRectangle

            EndRubberBanding()

            ' First, convert the rectangle to image coordinates

            rect = FixRectangle(rect)

            ' Must be at least 1 pixel in size
            If rect.Width > 1 AndAlso rect.Height > 1 Then
                ' Get the transform matrix
                ' This works even if the UseDpi property of the viewer is set to true
                Using transform As Matrix = _viewer.GetTransformWithDpi()
                    Dim t As Transformer = New Transformer(transform)
                    rect = Rectangle.Round(t.RectangleToLogical(rect))
                    rect = _viewer.Image.RectangleToImage(RasterViewPerspective.TopLeft, rect)

                    ' Add this rectangle as a region
                    ' Note: no conversion or xform is needed
                    _viewer.Image.AddRectangleToRegion(Nothing, rect, RasterRegionCombineMode.Set)
                End Using
            End If
        End If
    End Sub

    Private Sub _viewer_LostFocus(ByVal sender As Object, ByVal e As EventArgs)
        If isRubberBanding Then
            EndRubberBanding()
        End If
    End Sub
End Class
C#Copy Code
class MyForm4 : Form 

   private RasterImageViewer _viewer; 
   // Are we currently rubber banding 
   private bool isRubberBanding; 
   // The current rubberband rectangle 
   private Rectangle rubberBandingRectangle; 
   // Flag to indicates if the rubber band rectangle is drawn 
   private bool isRubberBandingRectangleDrawn; 
   // Did we clicp the cursor? 
   private bool isCursorClipped; 
   private Rectangle saveClipRectangle; 
 
   public MyForm4(string title) 
   { 
      Text = title; 
      Size = new Size(750, 450); 
 
      // Create the raster viewer 
      _viewer = new RasterImageViewer(); 
      _viewer.DoubleBuffer = true; 
      _viewer.Dock = DockStyle.Fill; 
 
      // Load an image into the viewer 
      RasterCodecs.Startup(); 
      RasterCodecs codecs = new RasterCodecs(); 
      _viewer.Image = codecs.Load(LeadtoolsExamples.Common.ImagesPath.Path + "Sample1.cmp"); 
      codecs.Dispose(); 
      RasterCodecs.Shutdown(); 
 
      Controls.Add(_viewer); 
      _viewer.BringToFront(); 
      StartRubberBanding(); 
   } 
 
   // Call this to start rubber banding on the viewer 
   private void StartRubberBanding() 
   { 
      // Subclass to the event we need 
      _viewer.MouseDown += new MouseEventHandler(_viewer_MouseDown); 
      _viewer.MouseMove += new MouseEventHandler(_viewer_MouseMove); 
      _viewer.MouseUp += new MouseEventHandler(_viewer_MouseUp); 
      _viewer.LostFocus += new EventHandler(_viewer_LostFocus); 
   } 
 
   // Call this to stop rubber banding on the viewer 
   private void StopRubberBanding() 
   { 
      // Un-subclass to the events 
      _viewer.MouseDown -= new MouseEventHandler(_viewer_MouseDown); 
      _viewer.MouseMove -= new MouseEventHandler(_viewer_MouseMove); 
      _viewer.MouseUp -= new MouseEventHandler(_viewer_MouseUp); 
      _viewer.LostFocus -= new EventHandler(_viewer_LostFocus); 
 
      isRubberBanding = false; 
      rubberBandingRectangle = Rectangle.Empty; 
      isRubberBandingRectangleDrawn = false; 
      isCursorClipped = false; 
      saveClipRectangle = Rectangle.Empty; 
   } 
 
   // Begins the rubber banding operation 
   private void BeginRubberBanding(int x, int y) 
   { 
      rubberBandingRectangle = Rectangle.FromLTRB(x, y, x, y); 
 
      isRubberBanding = true; 
      _viewer.Capture = true; 
 
      // Clip the cursor 
      ClipCursor(true); 
 
      DrawRubberBandRectangle(); 
   } 
 
   // Ends the rubber banding 
   private void EndRubberBanding() 
   { 
      _viewer.Capture = false; 
      isRubberBanding = false; 
 
      if (isRubberBandingRectangleDrawn) 
         DrawRubberBandRectangle(); 
 
      if (isCursorClipped) 
         ClipCursor(false); 
   } 
 
   private void ClipCursor(bool clip) 
   { 
      if (clip) 
      { 
         Rectangle rect = Rectangle.Intersect(FixRectangle(_viewer.PhysicalViewRectangle), _viewer.ClientRectangle); 
         rect = _viewer.RectangleToScreen(rect); 
         Control parent = _viewer.Parent; 
         while (parent != null) 
         { 
            rect = Rectangle.Intersect(rect, _viewer.Parent.RectangleToScreen(_viewer.Parent.ClientRectangle)); 
            if (parent is Form) 
            { 
               Form form = parent as Form; 
               if (form.IsMdiChild) 
               { 
                  if (form.Owner != null) 
                     rect = Rectangle.Intersect(rect, form.Owner.RectangleToScreen(form.Owner.ClientRectangle)); 
                  else if (form.Parent != null) 
                     rect = Rectangle.Intersect(rect, form.Parent.RectangleToScreen(form.Parent.ClientRectangle)); 
               } 
            } 
 
            parent = parent.Parent; 
         } 
 
         rect.Height += 1; 
         rect.Width += 1; 
 
         saveClipRectangle = Cursor.Clip; 
         Cursor.Clip = rect; 
         isCursorClipped = true; 
      } 
      else 
      { 
         Cursor.Clip = saveClipRectangle; 
         isCursorClipped = false; 
         saveClipRectangle = Rectangle.Empty; 
      } 
   } 
 
   private static Rectangle FixRectangle(Rectangle rect) 
   { 
      if (rect.Left > rect.Right) 
         rect = Rectangle.FromLTRB(rect.Right, rect.Top, rect.Left, rect.Bottom); 
      if (rect.Top > rect.Bottom) 
         rect = Rectangle.FromLTRB(rect.Left, rect.Bottom, rect.Right, rect.Top); 
 
      return rect; 
   } 
 
   // Draws the rubberband rectangle on the viewer 
   private void DrawRubberBandRectangle() 
   { 
      Rectangle rect = FixRectangle(rubberBandingRectangle); 
      rect.Width++; 
      rect.Height++; 
      rect = _viewer.RectangleToScreen(rect); 
      ControlPaint.DrawReversibleFrame(rect, Color.Transparent, FrameStyle.Thick); 
 
      isRubberBandingRectangleDrawn = !isRubberBandingRectangleDrawn; 
   } 
 
   private void _viewer_MouseDown(object sender, MouseEventArgs e) 
   { 
      _viewer.Focus(); 
 
      // Cancel rubber banding if it is on 
      if (isRubberBanding) 
         EndRubberBanding(); 
      else 
      { 
         if (_viewer.IsImageAvailable && e.Button == MouseButtons.Left) 
         { 
            // See if we click is on the image 
            Rectangle rect = _viewer.PhysicalViewRectangle; 
            if (rect.Contains(e.X, e.Y)) 
            { 
               // Start the rubber banding 
               BeginRubberBanding(e.X, e.Y); 
            } 
         } 
      } 
   } 
 
   private void _viewer_MouseMove(object sender, MouseEventArgs e) 
   { 
      if (isRubberBanding) 
      { 
         DrawRubberBandRectangle(); 
 
         rubberBandingRectangle = Rectangle.FromLTRB( 
            rubberBandingRectangle.Left, 
            rubberBandingRectangle.Top, 
            e.X, 
            e.Y); 
 
         DrawRubberBandRectangle(); 
      } 
   } 
 
   private void _viewer_MouseUp(object sender, MouseEventArgs e) 
   { 
      if (isRubberBanding) 
      { 
         // Save the rubberband rectangle 
         Rectangle rect = rubberBandingRectangle; 
 
         EndRubberBanding(); 
 
         // First, convert the rectangle to image coordinates 
 
         rect = FixRectangle(rect); 
 
         // Must be at least 1 pixel in size 
         if (rect.Width > 1 && rect.Height > 1) 
         { 
            // Get the transform matrix 
            // This works even if the UseDpi property of the viewer is set to true 
            using (Matrix transform = _viewer.GetTransformWithDpi()) 
            { 
               Transformer t = new Transformer(transform); 
               rect = Rectangle.Round(t.RectangleToLogical(rect)); 
               rect = _viewer.Image.RectangleToImage(RasterViewPerspective.TopLeft, rect); 
 
               // Add this rectangle as a region 
               // Note: no conversion or xform is needed 
               _viewer.Image.AddRectangleToRegion(null, rect, RasterRegionCombineMode.Set); 
            } 
         } 
      } 
   } 
 
   private void _viewer_LostFocus(object sender, EventArgs e) 
   { 
      if (isRubberBanding) 
      { 
         EndRubberBanding(); 
      } 
   } 
}

Remarks

Use this instead of the Transform property when the value of the UseDpi property is set to true.

If the value of the UseDpi property is false, then the return value of this method is an exact copy of the Transform matrix.

Note, since this method returns a copy of the matrix used inside this RasterImageViewer object, you need to call Matrix.Dispose on the return object.

Requirements

Target Platforms: Microsoft .NET Framework 2.0, Windows 98, Windows NT 4.0, Windows Millennium Edition, Windows 2000, Windows XP Home Edition, Windows XP Professional, Windows Server 2003 family

See Also