Gets a value that indicates if this mode has started.
public virtual bool IsStarted { get; }
true if this mode has started; otherwise, it is false.
The value of IsStarted will be set to true after Start is called and will be set back to false when Stop is called.
When the mode is started, the required service events are hooked into and the mode is waiting for user interaction. For example, a click and move to initiate a drag operation in the ImageViewerPanZoomInteractiveMode.
When the mode is working, it is in the middle of performing the operation, for example, panning the image in the viewer in the case of ImageViewerPanZoomInteractiveMode.
This value is useful when deriving your own interactive mode classes. Refer to ImageViewerInteractiveMode for an example.
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
// ...
}
}
public void ImageViewerInteractiveMode_Example()
{
_imageViewer.InteractiveModes.BeginUpdate();
_imageViewer.InteractiveModes.Add(new TransformInteractiveMode { IsEnabled = false });
//...
//...
//...
_imageViewer.InteractiveModes.EndUpdate();
}