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 : ImageViewerInteractiveMode Class |
public abstract class ImageViewerInteractiveMode
'Declaration
Public MustInherit Class ImageViewerInteractiveMode
ImageViewerInteractiveMode works with the InteractiveService object of the ImageViewer to provide rich user interface experience when the user interacts with the viewer using mouse or touch.
ImageViewerInteractiveMode is a base abstract class, you can derive your own class to handle custom interaction with the viewer. For more information and for a list of the out of the box modes provided by LEADTOOLS, refer to Image Viewer Interactive Modes.
ImageViewerInteractiveMode has the following functionality:
Member | Description |
---|---|
WorkingCursor, IdleCursor and HitTestStateCursor. |
Cursor to use when the interactive mode is in an idle, working or hit-test state (for desktop browsers). |
MouseButtons |
The mouse button attached to this mode (for desktop browsers) |
To use an interactive mode, you create an instance of any of the derived classes and assign it to the viewer using one of the following methods:
ImageViewer.DefaultInteractiveMode: Assigns the interactive mode to the left mouse button on desktop browsers or default touch events on devices that support touch.
ImageViewer.InteractiveModes: Add more than one interactive mode to the viewer.
You can use multiple interactive modes at the same time. For example, use the following code to support panning/zooming with the left mouse button and magnify glass with the right button:
This example will create a custom ImageViewerInteractiveMode that will rotate the image when the user clicks or touches and drags on the viewer.
Imports Leadtools Imports Leadtools.Controls Imports Leadtools.Codecs Imports Leadtools.Drawing Imports Leadtools.ImageProcessing Imports Leadtools.ImageProcessing.Color Private Class TransformInteractiveMode : Inherits ImageViewerInteractiveMode Public Sub New() MyBase.New() Me.AutoItemMode = ImageViewerAutoItemMode.AutoSet End Sub Private _scaleKeyModifier As Keys = Keys.Control Public Overridable Property ScaleKeyModifier() As Keys Get Return _scaleKeyModifier End Get Set(value As Keys) ' Supported is none and any modifiers Select Case value Case Keys.None, Keys.Alt, Keys.Shift, Keys.Control _scaleKeyModifier = value Case Else Throw New ArgumentException("Invalid value", "ScaleKeyModifier") End Select End Set End Property Private _rotateKeyModifier As Keys = Keys.Alt Public Overridable Property RotateKeyModifier() As Keys Get Return _rotateKeyModifier End Get Set(value As Keys) ' Supported is none and any modifiers Select Case value Case Keys.None, Keys.Alt, Keys.Shift, Keys.Control _rotateKeyModifier = value Case Else Throw New ArgumentException("Invalid value", "PageKeyModifier") End Select End Set End Property Public Overrides ReadOnly Property Name() As String Get Return "Transform" End Get End Property Public Overrides ReadOnly Property Id() As Integer Get Return ImageViewerInteractiveMode.UserModeId + 3 End Get End Property Public Overrides Sub Start(ByVal imageViewer As ImageViewer) MyBase.Start(imageViewer) Dim service As InteractiveService = MyBase.InteractiveService ' Pan required events AddHandler service.DragStarted, AddressOf service_DragStarted AddHandler service.DragDelta, AddressOf service_DragDelta AddHandler service.DragCompleted, AddressOf service_DragCompleted AddHandler service.DoubleTap, AddressOf service_DoubleTap End Sub Public Overrides Sub [Stop](ByVal imageViewer As ImageViewer) If IsStarted Then Dim service As InteractiveService = MyBase.InteractiveService RemoveHandler service.DragStarted, AddressOf service_DragStarted RemoveHandler service.DragDelta, AddressOf service_DragDelta RemoveHandler service.DragCompleted, AddressOf service_DragCompleted RemoveHandler service.DoubleTap, AddressOf service_DoubleTap MyBase.Stop(imageViewer) End If End Sub Private Sub service_DragStarted(ByVal sender As Object, ByVal e As InteractiveDragStartedEventArgs) ' Make sure pinch is not working, otherwise, ignore pan If (Not Me.CanStartWork(e)) Then Return End If ' Make sure we are on an item If Me.Item Is Nothing Then Return End If e.IsHandled = True Me.OnWorkStarted(EventArgs.Empty) End Sub Private Sub service_DragDelta(ByVal sender As Object, ByVal e As InteractiveDragDeltaEventArgs) If (Not Me.IsWorking) Then Return End If Dim item As ImageViewerItem = Me.Item If item Is Nothing Then Return End If ' Find out what to do Dim dx As Integer = e.Change.X Dim dy As Integer = e.Change.Y If dx = 0 AndAlso dy = 0 Then Return End If Dim scaleKey As Keys = Me.ScaleKeyModifier Dim rotateKey As Keys = Me.RotateKeyModifier Dim doScale As Boolean = (Control.ModifierKeys And scaleKey) = scaleKey Dim doRotate As Boolean = (Control.ModifierKeys And rotateKey) = rotateKey Dim imageViewer As ImageViewer = Me.ImageViewer If doScale Then Scale(imageViewer, item, dy, e.Origin) ElseIf doRotate Then Rotate(imageViewer, item, dx, e.Origin) Else Translate(imageViewer, item, dx, dy) End If e.IsHandled = True End Sub Private Sub service_DragCompleted(ByVal sender As Object, ByVal e As InteractiveDragCompletedEventArgs) If (Not Me.IsWorking) Then Return End If e.IsHandled = True OnWorkCompleted(EventArgs.Empty) End Sub Private Sub service_DoubleTap(ByVal sender As Object, ByVal e As InteractiveEventArgs) ' Make sure we not working already If Me.IsWorking OrElse (Not Me.CanStartWork(e)) Then Return End If ' Make sure we have an item Dim item As ImageViewerItem = Me.Item If item Is Nothing Then Return End If e.IsHandled = True Me.OnWorkStarted(EventArgs.Empty) Identity(Me.ImageViewer, item) Me.OnWorkCompleted(EventArgs.Empty) End Sub Private Sub Identity(ByVal imageViewer As ImageViewer, ByVal item As ImageViewerItem) item.Transform = LeadMatrix.Identity End Sub Private Sub Scale(ByVal imageViewer As ImageViewer, ByVal item As ImageViewerItem, ByVal dy As Integer, ByVal position As LeadPoint) ' ... ' set scale code ' ... End Sub Private Sub Rotate(ByVal imageViewer As ImageViewer, ByVal item As ImageViewerItem, ByVal dx As Integer, ByVal position As LeadPoint) ' ... ' set rotate code ' ... End Sub Private Sub Translate(ByVal imageViewer As ImageViewer, ByVal item As ImageViewerItem, ByVal dx As Integer, ByVal dy As Integer) ' ... ' set translate code ' ... End Sub End Class <TestMethod> Public Sub ImageViewerInteractiveMode_Example() _imageViewer.InteractiveModes.BeginUpdate() Dim mode As New TransformInteractiveMode mode.IsEnabled = False _imageViewer.InteractiveModes.Add(mode) '... '... '... _imageViewer.InteractiveModes.EndUpdate() End Sub
using Leadtools; using Leadtools.Controls; using Leadtools.Codecs; using Leadtools.Drawing; using Leadtools.ImageProcessing; using Leadtools.ImageProcessing.Color; private class TransformInteractiveMode : ImageViewerInteractiveMode { public TransformInteractiveMode() : base() { this.AutoItemMode = ImageViewerAutoItemMode.AutoSet; } private Keys _scaleKeyModifier = Keys.Control; public virtual Keys ScaleKeyModifier { get { return _scaleKeyModifier; } set { // Supported is none and any modifiers switch (value) { case Keys.None: case Keys.Alt: case Keys.Shift: case Keys.Control: _scaleKeyModifier = value; break; default: throw new ArgumentException("Invalid value", "ScaleKeyModifier"); } } } private Keys _rotateKeyModifier = Keys.Alt; public virtual Keys RotateKeyModifier { get { return _rotateKeyModifier; } set { // Supported is none and any modifiers switch (value) { case Keys.None: case Keys.Alt: case Keys.Shift: case Keys.Control: _rotateKeyModifier = value; break; default: throw new ArgumentException("Invalid value", "PageKeyModifier"); } } } public override string Name { get { return "Transform"; } } public override int Id { get { return ImageViewerInteractiveMode.UserModeId + 3; } } public override void Start(ImageViewer imageViewer) { base.Start(imageViewer); var service = base.InteractiveService; // Pan required events service.DragStarted += new EventHandler<InteractiveDragStartedEventArgs>(service_DragStarted); service.DragDelta += new EventHandler<InteractiveDragDeltaEventArgs>(service_DragDelta); service.DragCompleted += new EventHandler<InteractiveDragCompletedEventArgs>(service_DragCompleted); service.DoubleTap += new EventHandler<InteractiveEventArgs>(service_DoubleTap); } public override void Stop(ImageViewer imageViewer) { if (IsStarted) { var service = base.InteractiveService; service.DragStarted -= new EventHandler<InteractiveDragStartedEventArgs>(service_DragStarted); service.DragDelta -= new EventHandler<InteractiveDragDeltaEventArgs>(service_DragDelta); service.DragCompleted -= new EventHandler<InteractiveDragCompletedEventArgs>(service_DragCompleted); service.DoubleTap -= new EventHandler<InteractiveEventArgs>(service_DoubleTap); base.Stop(imageViewer); } } private void service_DragStarted(object sender, InteractiveDragStartedEventArgs e) { // Make sure pinch is not working, otherwise, ignore pan if (!this.CanStartWork(e)) return; // Make sure we are on an item if (this.Item == null) return; e.IsHandled = true; this.OnWorkStarted(EventArgs.Empty); } private void service_DragDelta(object sender, InteractiveDragDeltaEventArgs e) { if (!this.IsWorking) return; var item = this.Item; if (item == null) return; // Find out what to do var dx = e.Change.X; var dy = e.Change.Y; if (dx == 0 && dy == 0) return; var scaleKeyModifier = this.ScaleKeyModifier; var rotateKeyModifier = this.RotateKeyModifier; var scale = (Control.ModifierKeys & scaleKeyModifier) == scaleKeyModifier; var rotate = (Control.ModifierKeys & rotateKeyModifier) == rotateKeyModifier; var imageViewer = this.ImageViewer; if (scale) { Scale(imageViewer, item, dy, e.Origin); } else if (rotate) { Rotate(imageViewer, item, dx, e.Origin); } else { Translate(imageViewer, item, dx, dy); } e.IsHandled = true; } private void service_DragCompleted(object sender, InteractiveDragCompletedEventArgs e) { if (!this.IsWorking) return; e.IsHandled = true; OnWorkCompleted(EventArgs.Empty); } private void service_DoubleTap(object sender, InteractiveEventArgs e) { // Make sure we not working already if (this.IsWorking || !this.CanStartWork(e)) return; // Make sure we have an item var item = this.Item; if (item == null) return; e.IsHandled = true; this.OnWorkStarted(EventArgs.Empty); Identity(this.ImageViewer, item); this.OnWorkCompleted(EventArgs.Empty); } private void Identity(ImageViewer imageViewer, ImageViewerItem item) { item.Transform = LeadMatrix.Identity; } private void Scale(ImageViewer imageViewer, ImageViewerItem item, int dy, LeadPoint position) { // ... // set scale code // ... } private void Rotate(ImageViewer imageViewer, ImageViewerItem item, int dx, LeadPoint position) { // ... // set rotate code // ... } private void Translate(ImageViewer imageViewer, ImageViewerItem item, int dx, int dy) { // ... // set translate code // ... } } [TestMethod] public void ImageViewerInteractiveMode_Example() { _imageViewer.InteractiveModes.BeginUpdate(); _imageViewer.InteractiveModes.Add(new TransformInteractiveMode { IsEnabled = false }); //... //... //... _imageViewer.InteractiveModes.EndUpdate(); }