// * // * Copyright (C) 2008 Roger Alsing : http://www.RogerAlsing.com // * // * This library is free software; you can redistribute it and/or modify it // * under the terms of the GNU Lesser General Public License 2.1 or later, as // * published by the Free Software Foundation. See the included license.txt // * or http://www.gnu.org/copyleft/lesser.html for details. // * // * using System; using System.ComponentModel; using System.Drawing; using System.IO; using System.Windows.Forms; using ScrollEventArgs=Alsing.Windows.Forms.IntelliMouse.ScrollEventArgs; using ScrollEventHandler=Alsing.Windows.Forms.IntelliMouse.ScrollEventHandler; namespace Alsing.Windows.Forms.CoreLib { /// /// Summary description for IntelliMouseControl. /// public class IntelliMouseControl : Control { protected const int WM_CAPTURECHANGED = 0x0215; protected const int WM_LBUTTONDOWN = 0x0201; protected const int WM_MBUTTONDOWN = 0x0207; protected const int WM_MBUTTONUP = 0x0208; protected const int WM_MOUSELEAVE = 0x02A3; protected const int WM_RBUTTONDOWN = 0x0204; protected bool Active; protected IContainer components; private bool IsDirty; #region GENERAL DECLARATIONS protected WeakReference _CurrentParent; protected Point ActivationPoint = new Point(0, 0); protected Point CurrentDelta = new Point(0, 0); protected Control CurrentParent { get { if (_CurrentParent != null) return (Control) _CurrentParent.Target; return null; } set { _CurrentParent = new WeakReference(value); } } #endregion #region EVENTS public event EventHandler BeginScroll = null; public event EventHandler EndScroll = null; public event ScrollEventHandler Scroll = null; #endregion #region PUBLIC PROPERTY IMAGE protected Bitmap _Image; protected PictureBox picImage; protected RegionHandler regionHandler1; protected Timer tmrFeedback; public Bitmap Image { get { return _Image; } set { _Image = value; IsDirty = true; } } #endregion #region PUBLIC PROPERTY TRANSPARENCYKEY protected Color _TransparencyKey = Color.FromArgb(255, 0, 255); public Color TransparencyKey { get { return _TransparencyKey; } set { _TransparencyKey = value; IsDirty = true; } } #endregion #region CONSTRUCTOR public IntelliMouseControl() { InitializeComponent(); // SetStyle(ControlStyles.Selectable,false); // this.Image = (Bitmap)this.picImage.Image; // this.Visible =false; } #endregion #region DISPOSE protected override void Dispose(bool disposing) { #if DEBUG try { Console.WriteLine("disposing intellimouse"); } catch {} #endif if (disposing) { if (components != null) { components.Dispose(); } } base.Dispose(disposing); } #endregion #region FINALIZE ~IntelliMouseControl() { #if DEBUG try { Console.WriteLine("finalizing intellimouse"); } catch {} #endif } #endregion #region Component Designer generated code /// /// Required method for Designer support - do not modify /// the contents of this method with the code editor. /// protected void InitializeComponent() { this.components = new System.ComponentModel.Container(); var resources = new System.Resources.ResourceManager(typeof (IntelliMouseControl)); this.tmrFeedback = new Timer(); this.picImage = new System.Windows.Forms.PictureBox(); this.regionHandler1 = new Alsing.Windows.Forms.CoreLib.RegionHandler(this.components); // // tmrFeedback // this.tmrFeedback.Enabled = true; this.tmrFeedback.Interval = 10; this.tmrFeedback.Tick += new System.EventHandler(this.tmrFeedback_Tick); // // picImage // this.picImage.Image = ((System.Drawing.Bitmap) (resources.GetObject("picImage.Image"))); this.picImage.Location = new System.Drawing.Point(17, 17); this.picImage.Name = "picImage"; this.picImage.TabIndex = 0; this.picImage.TabStop = false; // // regionHandler1 // this.regionHandler1.Control = null; this.regionHandler1.MaskImage = null; this.regionHandler1.TransparencyKey = System.Drawing.Color.FromArgb(((System.Byte) (255)), ((System.Byte) (0)), ((System.Byte) (255))); // // IntelliMouseControl // this.ParentChanged += new System.EventHandler(this.IntelliMouseControl_ParentChanged); } #endregion protected void CreateRegion() { regionHandler1.ApplyRegion(this, Image, TransparencyKey); IsDirty = false; } public void Activate(int x, int y) { if (IsDirty) CreateRegion(); Size = new Size(Image.Width, Image.Height); Location = new Point(x - Image.Width/2, y - Image.Height/2); ActivationPoint.X = x; ActivationPoint.Y = y; BringToFront(); Visible = true; Focus(); Active = false; Application.DoEvents(); SetCursor(0, 0); tmrFeedback.Enabled = true; onBeginScroll(new EventArgs()); NativeMethods.SendMessage(Handle, WM_MBUTTONDOWN, 0, 0); Active = true; } protected void SetCursor(int x, int y) { int dY = y; int dX = x; CurrentDelta.X = dX; CurrentDelta.Y = dY; if (dY > 16) { var ms = new MemoryStream(Properties.Resources.MoveDown); Cursor = new Cursor(ms); CurrentDelta.Y -= 16; } else if (dY < -16) { var ms = new MemoryStream(Properties.Resources.MoveUp); Cursor = new Cursor(ms); CurrentDelta.Y += 16; } else { var ms = new MemoryStream(Properties.Resources.MoveUpDown); Cursor = new Cursor(ms); CurrentDelta = new Point(0, 0); } } protected override void OnMouseDown(MouseEventArgs e) { base.OnMouseDown(e); if (Active) { if (e.Button != MouseButtons.None && (e.Button != MouseButtons.Middle && e.X != 0 && e.Y != 0)) { Deactivate(); var p = new Point(e.X + Left, e.Y + Top); NativeMethods.SendMessage(Parent.Handle, WM_LBUTTONDOWN, 0, p.Y*0x10000 + p.X); } } } protected override void OnMouseMove(MouseEventArgs e) { if (Active) { if (e.Button != MouseButtons.Middle && e.Button != MouseButtons.None) { Deactivate(); } else { int x = e.X; int y = e.Y; x -= Image.Width/2; y -= Image.Height/2; SetCursor(x, y); NativeMethods.SendMessage(Handle, WM_MBUTTONDOWN, 0, 0); } } else { base.OnMouseMove(e); } } protected void Deactivate() { NativeMethods.SendMessage(Handle, WM_MBUTTONUP, 0, 0); Active = false; tmrFeedback.Enabled = false; Hide(); onEndScroll(new EventArgs()); Parent.Focus(); } protected override void OnResize(EventArgs e) { Size = Image != null ? new Size(Image.Width, Image.Height) : new Size(32, 32); } protected void Parent_MouseDown(object s, MouseEventArgs e) { if (e.Button == MouseButtons.Middle) { Activate(e.X, e.Y); } } protected void tmrFeedback_Tick(object sender, EventArgs e) { var a = new ScrollEventArgs {DeltaX = CurrentDelta.X, DeltaY = CurrentDelta.Y}; onScroll(a); } protected virtual void onBeginScroll(EventArgs e) { if (BeginScroll != null) BeginScroll(this, e); } protected virtual void onEndScroll(EventArgs e) { if (EndScroll != null) EndScroll(this, e); } protected virtual void onScroll(ScrollEventArgs e) { if (Scroll != null) Scroll(this, e); } protected void IntelliMouseControl_ParentChanged(object sender, EventArgs e) { if (CurrentParent != null) { CurrentParent.MouseDown -= Parent_MouseDown; } if (Parent != null) { Parent.MouseDown += Parent_MouseDown; Deactivate(); } } protected override void OnKeyDown(KeyEventArgs e) { Deactivate(); } protected override void OnLeave(EventArgs e) { base.OnLeave(e); Deactivate(); } protected override void OnLostFocus(EventArgs e) { base.OnLostFocus(e); Deactivate(); } protected override void WndProc(ref Message m) { if (m.Msg == WM_MOUSELEAVE) { base.WndProc(ref m); Deactivate(); return; } base.WndProc(ref m); } } }