Products | Support | Email a link to this topic. | Send comments on this topic. | Back to Introduction - All Topics | Help Version 19.0.4.3
|
Leadtools.Controls Assembly > Leadtools.Controls Namespace : ImageViewerRubberBandInteractiveMode Class |
public class ImageViewerRubberBandInteractiveMode : ImageViewerInteractiveMode
'Declaration
Public Class ImageViewerRubberBandInteractiveMode Inherits ImageViewerInteractiveMode
ImageViewerRubberBandInteractiveMode derives from ImageViewerInteractiveMode and subscribes to the following events of the InteractiveService:
ImageViewerRubberBandInteractiveMode works as follows:
When DragStarted is received, Render is called to to draw the rubber band shape. The following properties are used to customize the appearance of this shape: ShapeBorderPen, BackgroundBrush and the event RubberBandStarted is fired.
Note that if you can derive your own class and override Render to customize the rendering of the shape.
When DragDelta is received, Render is called to update the shape and RubberBandDelta is fired.
When DragCompleted is received, RubberBandCompleted is fired.
ImageViewerRubberBandInteractiveMode interactive mode does not perform any action on the viewer (besides drawing, moving and then removing the shape). It is up to the user to implement any custom operation required. For example, to select a region of interest on the image. ImageViewerZoomToInteractiveMode derives from ImageViewerRubberBandInteractiveMode and calls ImageViewer.ZoomToRect upon the receiving of RubberBandCompleted event.
Drawing a rubber-band on the viewer is usually followed by another user operation to perform the action. In most cases, the rubber band is to be restricted on the "work" area. The RestrictToWorkBounds can control this behavior.
For more information, refer to Image Viewer Interactive Modes.
This example will use ImageViewerRubberBandInteractiveMode to select a region of interest in the image. When the user finishes selecting the area, the example will draw a blue with yellow border rectangle on the image.
Start with the ImageViewer example, remove all the code inside the example function (search for the "// TODO: add example code here" comment) and insert the following code:
Imports Leadtools Imports Leadtools.Controls Imports Leadtools.Codecs Imports Leadtools.Drawing Imports Leadtools.ImageProcessing Imports Leadtools.ImageProcessing.Color Public Shared Function AddRoundRect(ByVal path As GraphicsPath, ByVal bounds As LeadRect, ByVal xRadius As Integer, ByVal yRadius As Integer) As Boolean If bounds.Width < 1 OrElse bounds.Height < 1 Then Return False End If If xRadius < 1 OrElse yRadius < 1 Then ' Add a rectangle path.AddRectangle(New Rectangle(bounds.X, bounds.Y, bounds.Width, bounds.Height)) Return True End If Dim x As Integer = bounds.X Dim y As Integer = bounds.Y Dim width As Integer = bounds.Width Dim height As Integer = bounds.Height ' adapt horizontal and vertical diameter if the rectangle is too little Dim xDiameter As Integer = xRadius * 2 Dim yDiameter As Integer = yRadius * 2 If width < (xDiameter) Then xDiameter = width End If If height < (yDiameter) Then yDiameter = height End If xRadius = xDiameter \ 2 yRadius = yDiameter \ 2 Dim xw As Integer = x + width Dim yh As Integer = y + height Dim xwr As Integer = xw - xRadius Dim yhr As Integer = yh - yRadius Dim xr As Integer = x + xRadius Dim yr As Integer = y + yRadius Dim xwr2 As Integer = xw - xDiameter Dim yhr2 As Integer = yh - yDiameter path.StartFigure() path.AddArc(x, y, xDiameter, yDiameter, 180, 90) path.AddLine(xr, y, xwr, y) path.AddArc(xwr2, y, xDiameter, yDiameter, 270, 90) path.AddLine(xw, yr, xw, yhr) path.AddArc(xwr2, yhr2, xDiameter, yDiameter, 0, 90) path.AddLine(xwr, yh, xr, yh) path.AddArc(x, yhr2, xDiameter, yDiameter, 90, 90) path.AddLine(x, yhr, x, yr) path.CloseFigure() Return True End Function <TestMethod> Public Sub ImageViewerRubberBandInteractiveMode_Example() Dim rubberBandMode As ImageViewerRubberBandInteractiveMode = New ImageViewerRubberBandInteractiveMode() For Each shape As ImageViewerRubberBandShape In System.Enum.GetValues(GetType(ImageViewerRubberBandShape)) _rubberBandShapesComboBox.Items.Add(shape) Next shape _rubberBandShapesComboBox.SelectedItem = rubberBandMode.Shape AddHandler _rubberBandShapesComboBox.SelectedIndexChanged, Sub(sender, e) rubberBandMode.Shape = CType(_rubberBandShapesComboBox.SelectedItem, _ ImageViewerRubberBandShape) AddHandler rubberBandMode.RubberBandCompleted, Sub(sender, e) If e.IsCanceled Then Return End If If rubberBandMode.Item Is Nothing Then Return End If Dim points As LeadPoint() = New LeadPoint(e.Points.Count - 1) {} Dim i As Integer = 0 Do While i < points.Length points(i) = LeadPoint.Create(e.Points(i).X, e.Points(i).Y) i += 1 Loop Dim min As LeadPoint = LeadPoint.Empty Dim max As LeadPoint = LeadPoint.Empty i = 0 Do While i < points.Length points(i) = _imageViewer.ConvertPoint(rubberBandMode.Item, ImageViewerCoordinateType.Control, ImageViewerCoordinateType.Image, points(i)) If i = 0 Then min = points(i) max = points(i) Else min.X = Math.Min(min.X, points(i).X) min.Y = Math.Min(min.Y, points(i).Y) max.X = Math.Max(max.X, points(i).X) max.Y = Math.Max(max.Y, points(i).Y) End If i += 1 Loop Dim center As LeadPoint = LeadPoint.Create(min.X + (max.X - min.X) \ 2, min.Y + (max.Y - min.Y) \ 2) Dim rasterItem As ImageViewerItem = rubberBandMode.Item Dim image As RasterImage = rasterItem.Image Dim hdc As IntPtr = RasterImagePainter.CreateLeadDC(image) Using graphics As Graphics = graphics.FromHdc(hdc) Using path As GraphicsPath = New GraphicsPath() Select Case rubberBandMode.Shape Case ImageViewerRubberBandShape.Rectangle, ImageViewerRubberBandShape.Ellipse Dim rect As LeadRect = LeadRect.Normalize(LeadRect.FromLTRB(points(0).X, points(0).Y, points(1).X, points(1).Y)) Dim rc As Rectangle = New Rectangle(rect.X, rect.Y, rect.Width, rect.Height) If rubberBandMode.Shape = ImageViewerRubberBandShape.Rectangle Then path.AddRectangle(rc) Else path.AddEllipse(rc) End If Case ImageViewerRubberBandShape.RoundRectangle Dim radius As LeadSize = rubberBandMode.RoundRectangleRadius Dim rect As LeadRect = LeadRect.Normalize(LeadRect.FromLTRB(points(0).X, points(0).Y, points(1).X, points(1).Y)) AddRoundRect(path, rect, radius.Width, radius.Height) Case ImageViewerRubberBandShape.Freehand Dim firstPoint As Boolean = True Dim lastPoint As LeadPoint = LeadPoint.Empty For Each pt As LeadPoint In points If (Not firstPoint) Then path.AddLine(lastPoint.X, lastPoint.Y, pt.X, pt.Y) Else firstPoint = False End If lastPoint = pt Next pt Case Else End Select path.CloseFigure() If image.Width > 1000 OrElse image.Height > 1000 Then Using pen As Pen = New Pen(Color.Yellow, 8) graphics.DrawPath(pen, path) End Using Else graphics.DrawPath(Pens.Yellow, path) End If End Using End Using RasterImagePainter.DeleteLeadDC(hdc) _imageViewer.Invalidate() End Sub rubberBandMode.AutoItemMode = ImageViewerAutoItemMode.AutoSet rubberBandMode.ItemPart = ImageViewerItemPart.Image _imageViewer.InteractiveModes.BeginUpdate() _imageViewer.InteractiveModes.Add(rubberBandMode) Dim autopan As ImageViewerAutoPanInteractiveMode = New ImageViewerAutoPanInteractiveMode() autopan.PanDelay = 100 _imageViewer.InteractiveModes.Add(autopan) _imageViewer.InteractiveModes.EndUpdate() End Sub
using Leadtools; using Leadtools.Controls; using Leadtools.Codecs; using Leadtools.Drawing; using Leadtools.ImageProcessing; using Leadtools.ImageProcessing.Color; public static bool AddRoundRect(GraphicsPath path, LeadRect bounds, int xRadius, int yRadius) { if (bounds.Width < 1 || bounds.Height < 1) return false; if (xRadius < 1 || yRadius < 1) { // Add a rectangle path.AddRectangle(new Rectangle(bounds.X, bounds.Y, bounds.Width, bounds.Height)); return true; } int x = bounds.X; int y = bounds.Y; int width = bounds.Width; int height = bounds.Height; // adapt horizontal and vertical diameter if the rectangle is too little int xDiameter = xRadius * 2; int yDiameter = yRadius * 2; if (width < (xDiameter)) xDiameter = width; if (height < (yDiameter)) yDiameter = height; xRadius = xDiameter / 2; yRadius = yDiameter / 2; int xw = x + width; int yh = y + height; int xwr = xw - xRadius; int yhr = yh - yRadius; int xr = x + xRadius; int yr = y + yRadius; int xwr2 = xw - xDiameter; int yhr2 = yh - yDiameter; path.StartFigure(); path.AddArc(x, y, xDiameter, yDiameter, 180, 90); path.AddLine(xr, y, xwr, y); path.AddArc(xwr2, y, xDiameter, yDiameter, 270, 90); path.AddLine(xw, yr, xw, yhr); path.AddArc(xwr2, yhr2, xDiameter, yDiameter, 0, 90); path.AddLine(xwr, yh, xr, yh); path.AddArc(x, yhr2, xDiameter, yDiameter, 90, 90); path.AddLine(x, yhr, x, yr); path.CloseFigure(); return true; } [TestMethod] public void ImageViewerRubberBandInteractiveMode_Example() { ImageViewerRubberBandInteractiveMode rubberBandMode = new ImageViewerRubberBandInteractiveMode(); foreach (ImageViewerRubberBandShape shape in Enum.GetValues(typeof(ImageViewerRubberBandShape))) _rubberBandShapesComboBox.Items.Add(shape); _rubberBandShapesComboBox.SelectedItem = rubberBandMode.Shape; _rubberBandShapesComboBox.SelectedIndexChanged += (sender, e) => rubberBandMode.Shape = (ImageViewerRubberBandShape)_rubberBandShapesComboBox.SelectedItem; rubberBandMode.RubberBandCompleted += (sender, e) => { if (e.IsCanceled) return; if (rubberBandMode.Item == null) return; LeadPoint[] points = new LeadPoint[e.Points.Count]; for (var i = 0; i < points.Length; i++) points[i] = LeadPoint.Create(e.Points[i].X, e.Points[i].Y); LeadPoint min = LeadPoint.Empty; LeadPoint max = LeadPoint.Empty; for (int i = 0; i < points.Length; i++) { points[i] = _imageViewer.ConvertPoint(rubberBandMode.Item, ImageViewerCoordinateType.Control, ImageViewerCoordinateType.Image, points[i]); if (i == 0) { min = points[i]; max = points[i]; } else { min.X = Math.Min(min.X, points[i].X); min.Y = Math.Min(min.Y, points[i].Y); max.X = Math.Max(max.X, points[i].X); max.Y = Math.Max(max.Y, points[i].Y); } } LeadPoint center = LeadPoint.Create(min.X + (max.X - min.X) / 2, min.Y + (max.Y - min.Y) / 2); ImageViewerItem rasterItem = rubberBandMode.Item; RasterImage image = rasterItem.Image; IntPtr hdc = RasterImagePainter.CreateLeadDC(image); using (Graphics graphics = Graphics.FromHdc(hdc)) { using (GraphicsPath path = new GraphicsPath()) { switch (rubberBandMode.Shape) { case ImageViewerRubberBandShape.Rectangle: case ImageViewerRubberBandShape.Ellipse: { LeadRect rect = LeadRect.Normalize(LeadRect.FromLTRB(points[0].X, points[0].Y, points[1].X, points[1].Y)); Rectangle rc = new Rectangle(rect.X, rect.Y, rect.Width, rect.Height); if (rubberBandMode.Shape == ImageViewerRubberBandShape.Rectangle) path.AddRectangle(rc); else path.AddEllipse(rc); } break; case ImageViewerRubberBandShape.RoundRectangle: { LeadSize radius = rubberBandMode.RoundRectangleRadius; LeadRect rect = LeadRect.Normalize(LeadRect.FromLTRB(points[0].X, points[0].Y, points[1].X, points[1].Y)); AddRoundRect(path, rect, radius.Width, radius.Height); } break; case ImageViewerRubberBandShape.Freehand: { bool firstPoint = true; LeadPoint lastPoint = LeadPoint.Empty; foreach (LeadPoint pt in points) { if (!firstPoint) path.AddLine(lastPoint.X, lastPoint.Y, pt.X, pt.Y); else firstPoint = false; lastPoint = pt; } } break; default: break; } path.CloseFigure(); if (image.Width > 1000 || image.Height > 1000) { using (Pen pen = new Pen(Color.Yellow, 8)) graphics.DrawPath(pen, path); } else { graphics.DrawPath(Pens.Yellow, path); } } } RasterImagePainter.DeleteLeadDC(hdc); _imageViewer.Invalidate(); }; rubberBandMode.AutoItemMode = ImageViewerAutoItemMode.AutoSet; rubberBandMode.ItemPart = ImageViewerItemPart.Image; _imageViewer.InteractiveModes.BeginUpdate(); _imageViewer.InteractiveModes.Add(rubberBandMode); ImageViewerAutoPanInteractiveMode autopan = new ImageViewerAutoPanInteractiveMode(); autopan.PanDelay = 100; _imageViewer.InteractiveModes.Add(autopan); _imageViewer.InteractiveModes.EndUpdate(); }