DockPanel.DragHandler.cs
上传用户:szlfmled
上传日期:2020-11-22
资源大小:978k
文件大小:4k
源码类别:

C#编程

开发平台:

C#

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Text;
  4. using System.Windows.Forms;
  5. using System.Drawing;
  6. using System.Drawing.Drawing2D;
  7. using System.ComponentModel;
  8. namespace WeifenLuo.WinFormsUI.Docking
  9. {
  10.     partial class DockPanel
  11.     {
  12.         /// <summary>
  13.         /// DragHandlerBase is the base class for drag handlers. The derived class should:
  14.         ///   1. Define its public method BeginDrag. From within this public BeginDrag method,
  15.         ///      DragHandlerBase.BeginDrag should be called to initialize the mouse capture
  16.         ///      and message filtering.
  17.         ///   2. Override the OnDragging and OnEndDrag methods.
  18.         /// </summary>
  19.         private abstract class DragHandlerBase : NativeWindow, IMessageFilter
  20.         {
  21.             protected DragHandlerBase()
  22.             {
  23.             }
  24.             protected abstract Control DragControl
  25.             {
  26.                 get;
  27.             }
  28.             private Point m_startMousePosition = Point.Empty;
  29.             protected Point StartMousePosition
  30.             {
  31.                 get { return m_startMousePosition; }
  32.                 private set { m_startMousePosition = value; }
  33.             }
  34.             protected bool BeginDrag()
  35.             {
  36.                 // Avoid re-entrance;
  37.                 lock (this)
  38.                 {
  39.                     if (DragControl == null)
  40.                         return false;
  41.                     StartMousePosition = Control.MousePosition;
  42.                     if (!NativeMethods.DragDetect(DragControl.Handle, StartMousePosition))
  43.                         return false;
  44.                     DragControl.FindForm().Capture = true;
  45.                     AssignHandle(DragControl.FindForm().Handle);
  46.                     Application.AddMessageFilter(this);
  47.                     return true;
  48.                 }
  49.             }
  50.             protected abstract void OnDragging();
  51.             protected abstract void OnEndDrag(bool abort);
  52.             private void EndDrag(bool abort)
  53.             {
  54.                 ReleaseHandle();
  55.                 Application.RemoveMessageFilter(this);
  56.                 DragControl.FindForm().Capture = false;
  57.                 OnEndDrag(abort);
  58.             }
  59.             bool IMessageFilter.PreFilterMessage(ref Message m)
  60.             {
  61.                 if (m.Msg == (int)Win32.Msgs.WM_MOUSEMOVE)
  62.                     OnDragging();
  63.                 else if (m.Msg == (int)Win32.Msgs.WM_LBUTTONUP)
  64.                     EndDrag(false);
  65.                 else if (m.Msg == (int)Win32.Msgs.WM_CAPTURECHANGED)
  66.                     EndDrag(true);
  67.                 else if (m.Msg == (int)Win32.Msgs.WM_KEYDOWN && (int)m.WParam == (int)Keys.Escape)
  68.                     EndDrag(true);
  69.                 return OnPreFilterMessage(ref m);
  70.             }
  71.             protected virtual bool OnPreFilterMessage(ref Message m)
  72.             {
  73.                 return false;
  74.             }
  75.             protected sealed override void WndProc(ref Message m)
  76.             {
  77.                 if (m.Msg == (int)Win32.Msgs.WM_CANCELMODE || m.Msg == (int)Win32.Msgs.WM_CAPTURECHANGED)
  78.                     EndDrag(true);
  79.                 base.WndProc(ref m);
  80.             }
  81.         }
  82.         private abstract class DragHandler : DragHandlerBase
  83.         {
  84.             private DockPanel m_dockPanel;
  85.             protected DragHandler(DockPanel dockPanel)
  86.             {
  87.                 m_dockPanel = dockPanel;
  88.             }
  89.             public DockPanel DockPanel
  90.             {
  91.                 get { return m_dockPanel; }
  92.             }
  93.             private IDragSource m_dragSource;
  94.             protected IDragSource DragSource
  95.             {
  96.                 get { return m_dragSource; }
  97.                 set { m_dragSource = value; }
  98.             }
  99.             protected sealed override Control DragControl
  100.             {
  101.                 get { return DragSource == null ? null : DragSource.DragControl; }
  102.             }
  103.             protected sealed override bool OnPreFilterMessage(ref Message m)
  104.             {
  105.                 if ((m.Msg == (int)Win32.Msgs.WM_KEYDOWN || m.Msg == (int)Win32.Msgs.WM_KEYUP) &&
  106.                     ((int)m.WParam == (int)Keys.ControlKey || (int)m.WParam == (int)Keys.ShiftKey))
  107.                     OnDragging();
  108.                 return base.OnPreFilterMessage(ref m);
  109.             }
  110.         }
  111.     }
  112. }