C\#Dev Grid 드래그 이동 을 실현 하 는 방법
전체 인 스 턴 스 코드 는 여 기 를 클릭 하 십시오본 사이트 다운로드
끌 어 당 길 때 줄 캡 처 효과
구현 코드 는 다음 과 같 습 니 다:
/// <summary>
///
/// </summary>
public static class DragHelper
{
/// <summary>
/// BandedGridView
/// </summary>
/// <param name="gvMain"></param>
public static void DragGridRow<T>(this BandedGridView gvMain)
{
//
DragMaster dragMaster = new DragMaster();
//
Rectangle _DragRowRect = Rectangle.Empty;
GridControl gcMain = gvMain.GridControl;
GridHitInfo _DownHitInfo = null;
//
gcMain.AllowDrop = true;
gvMain.OptionsDetail.EnableMasterViewMode = false;
#region DragOver
gcMain.DragOver += delegate(object sender, System.Windows.Forms.DragEventArgs e)
{
if (e.Data.GetDataPresent(typeof(T)))
e.Effect = DragDropEffects.Move;
else
e.Effect = DragDropEffects.None;
};
#endregion
#region DragDrop
gcMain.DragDrop += delegate(object sender, System.Windows.Forms.DragEventArgs e)
{
//
T newRow = (T)e.Data.GetData(typeof(T));
//
// e
var clientPoint = gcMain.PointToClient(new Point(e.X, e.Y));
GridHitInfo hitInfo = gvMain.CalcHitInfo(new Point(clientPoint.X, clientPoint.Y));
var oldRow = (T)gvMain.GetRow(hitInfo.RowHandle);
//
if (oldRow == null || newRow == null) return;
//
//
var oldIndex = _DownHitInfo.RowHandle;
//
var newIndex = hitInfo.RowHandle;
BindingSource bs = (BindingSource)(gcMain.DataSource);
if (bs == null)
return;
bs.RemoveAt(oldIndex);
bs.Insert(oldIndex, oldRow);
bs.RemoveAt(newIndex);
bs.Insert(newIndex, newRow);
bs.ResetBindings(false);
};
#endregion
#region MouseDown
gcMain.MouseDown += delegate(object sender, MouseEventArgs e)
{
_DownHitInfo = null;
GridHitInfo hitInfo = gvMain.CalcHitInfo(new Point(e.X, e.Y));
if (Control.ModifierKeys != Keys.None) return;
if (e.Button == MouseButtons.Left && hitInfo.RowHandle >= 0)
{
// Grid
if (!gvMain.OptionsBehavior.Editable
|| gvMain.OptionsBehavior.ReadOnly)
return;
//
if (hitInfo.InRowCell)
return;
//
_DownHitInfo = hitInfo;
}
};
#endregion
#region MouseMove
gcMain.MouseMove += delegate(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
if (_DownHitInfo != null)
{
Size dragSize = SystemInformation.DragSize;
//
Rectangle dragRect = new Rectangle(new Point(_DownHitInfo.HitPoint.X - dragSize.Width / 2, _DownHitInfo.HitPoint.Y - dragSize.Height / 2), dragSize);
if (!dragRect.Contains(new Point(e.X, e.Y)))
{
//
var p = gcMain.PointToScreen(e.Location);
//
gcMain.Refresh();
//
var bmp = GetDragRowImage(gcMain, _DownHitInfo, _DragRowRect);
Point offSetPoint = new Point(p.X + 1, p.Y - dragMaster.DragSize.Height / 2);
//
dragMaster.StartDrag(bmp, offSetPoint, DragDropEffects.Move);
//
object row = gvMain.GetRow(_DownHitInfo.RowHandle);
//
gcMain.DoDragDrop(row, DragDropEffects.Move);
//
DevExpress.Utils.DXMouseEventArgs.GetMouseArgs(e).Handled = true;
//
_DownHitInfo = null;
}
}
}
};
#endregion
#region , QueryContinueDrag
gcMain.QueryContinueDrag += delegate(object sender, QueryContinueDragEventArgs e)
{
switch (e.Action)
{
case DragAction.Continue:
//
Point offSetPoint = new Point(Cursor.Position.X + 1, Cursor.Position.Y - dragMaster.DragSize.Height / 2);
dragMaster.DoDrag(offSetPoint, DragDropEffects.Move, false);
break;
default:
//
_DragRowRect = Rectangle.Empty;
//
dragMaster.EndDrag();
break;
}
};
#endregion
#region
gvMain.CustomDrawRowIndicator += delegate(object sender, RowIndicatorCustomDrawEventArgs e)
{
if (_DragRowRect == Rectangle.Empty && _DownHitInfo != null && _DownHitInfo.RowHandle == e.RowHandle)
{
_DragRowRect = e.Bounds;
}
};
#endregion
}
/// <summary>
/// GridView
/// </summary>
/// <param name="gvMain"></param>
public static void DragGridRow<T>(this GridView gvMain)
{
//
DragMaster dragMaster = new DragMaster();
//
Rectangle _DragRowRect = Rectangle.Empty;
GridControl gcMain = gvMain.GridControl;
GridHitInfo _DownHitInfo = null;
//
gcMain.AllowDrop = true;
gvMain.OptionsDetail.EnableMasterViewMode = false;
#region DragOver
gcMain.DragOver += delegate(object sender, System.Windows.Forms.DragEventArgs e)
{
if (e.Data.GetDataPresent(typeof(T)))
e.Effect = DragDropEffects.Move;
else
e.Effect = DragDropEffects.None;
};
#endregion
#region DragDrop
gcMain.DragDrop += delegate(object sender, System.Windows.Forms.DragEventArgs e)
{
//
T newRow = (T)e.Data.GetData(typeof(T));
//
// e
var clientPoint = gcMain.PointToClient(new Point(e.X, e.Y));
GridHitInfo hitInfo = gvMain.CalcHitInfo(new Point(clientPoint.X, clientPoint.Y));
var oldRow = (T)gvMain.GetRow(hitInfo.RowHandle);
//
if (oldRow == null || newRow == null) return;
//
//
var oldIndex = _DownHitInfo.RowHandle;
//
var newIndex = hitInfo.RowHandle;
BindingSource bs = (BindingSource)(gcMain.DataSource);
if (bs == null)
return;
bs.RemoveAt(oldIndex);
bs.Insert(oldIndex, oldRow);
bs.RemoveAt(newIndex);
bs.Insert(newIndex, newRow);
bs.ResetBindings(false);
};
#endregion
#region MouseDown
gcMain.MouseDown += delegate(object sender, MouseEventArgs e)
{
_DownHitInfo = null;
GridHitInfo hitInfo = gvMain.CalcHitInfo(new Point(e.X, e.Y));
if (Control.ModifierKeys != Keys.None) return;
if (e.Button == MouseButtons.Left && hitInfo.RowHandle >= 0)
{
// Grid
if (!gvMain.OptionsBehavior.Editable
|| gvMain.OptionsBehavior.ReadOnly)
return;
//
if (hitInfo.InRowCell)
return;
//
_DownHitInfo = hitInfo;
}
};
#endregion
#region MouseMove
gcMain.MouseMove += delegate(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
if (_DownHitInfo != null)
{
Size dragSize = SystemInformation.DragSize;
//
Rectangle dragRect = new Rectangle(new Point(_DownHitInfo.HitPoint.X - dragSize.Width / 2, _DownHitInfo.HitPoint.Y - dragSize.Height / 2), dragSize);
if (!dragRect.Contains(new Point(e.X, e.Y)))
{
//
var p = gcMain.PointToScreen(e.Location);
//
gcMain.Refresh();
//
var bmp = GetDragRowImage(gcMain, _DownHitInfo, _DragRowRect);
Point offSetPoint = new Point(p.X + 1, p.Y - dragMaster.DragSize.Height / 2);
//
dragMaster.StartDrag(bmp, offSetPoint, DragDropEffects.Move);
//
object row = gvMain.GetRow(_DownHitInfo.RowHandle);
//
gcMain.DoDragDrop(row, DragDropEffects.Move);
//
DevExpress.Utils.DXMouseEventArgs.GetMouseArgs(e).Handled = true;
//
_DownHitInfo = null;
}
}
}
};
#endregion
#region , QueryContinueDrag
gcMain.QueryContinueDrag += delegate(object sender, QueryContinueDragEventArgs e)
{
switch (e.Action)
{
case DragAction.Continue:
//
Point offSetPoint = new Point(Cursor.Position.X + 1, Cursor.Position.Y - dragMaster.DragSize.Height / 2);
dragMaster.DoDrag(offSetPoint, DragDropEffects.Move, false);
break;
default:
//
_DragRowRect = Rectangle.Empty;
//
dragMaster.EndDrag();
break;
}
};
#endregion
#region
gvMain.CustomDrawRowIndicator += delegate(object sender, RowIndicatorCustomDrawEventArgs e)
{
if (_DragRowRect == Rectangle.Empty && _DownHitInfo != null && _DownHitInfo.RowHandle == e.RowHandle)
{
_DragRowRect = e.Bounds;
}
};
#endregion
}
/// <summary>
///
/// </summary>
/// <param name="hitInfo"></param>
/// <param name="gcMain"></param>
/// <param name="dragRowRect"></param>
/// <returns></returns>
private static Bitmap GetDragRowImage(GridControl gcMain, GridHitInfo hitInfo, Rectangle dragRowRect)
{
//
var bmp = DevImageCapturer.GetControlBitmap(gcMain, null
, dragRowRect.Width + 1, dragRowRect.Top
, gcMain.Width - dragRowRect.Width - 4, dragRowRect.Height - 1);
using (Graphics g = Graphics.FromImage(bmp))
{
var p1 = new Point(1, 1);
var p2 = new Point(bmp.Width - 1, 1);
var p3 = new Point(1, bmp.Height - 2);
var p4 = new Point(bmp.Width - 1, bmp.Height - 2);
using (Pen pen = new Pen(gcMain.ForeColor))
{
g.DrawLine(pen, p1, p2);
g.DrawLine(pen, p1, p3);
g.DrawLine(pen, p2, p4);
g.DrawLine(pen, p3, p4);
}
}
return bmp;
}
}
/// <summary>
///
/// </summary>
public partial class DragWindow : DevExpress.Utils.Win.TopFormBase
{
private Bitmap dragBitmap;
private bool dragging;
private Point hotSpot;
public static readonly Point InvisiblePoint = new Point(-100000, -100000);
public DragWindow()
{
hotSpot = Point.Empty;
dragging = false;
SetStyle(ControlStyles.Selectable, false);
this.Size = Size.Empty;
this.ShowInTaskbar = false;
Form prevActive = Form.ActiveForm;
InitializeComponent();
}
void ActivateForm(object sender, EventArgs e)
{
Form form = sender as Form;
if (form == null || !form.IsHandleCreated) return;
form.Activate();
}
public void MakeTopMost()
{
UpdateZOrder();
}
private void InitializeComponent()
{
this.StartPosition = FormStartPosition.Manual;
dragBitmap = null;
this.Enabled = false;
this.MinimumSize = Size.Empty;
this.Size = Size.Empty;
this.Location = InvisiblePoint;
this.Visible = false;
this.TabStop = false;
//this.Opacity = 0.7;// DevExpress.Utils.DragDrop.DragWindow.DefaultOpacity;
}
protected void InternalMoveBitmap(Point p)
{
//p.Offset(-hotSpot.X, -hotSpot.Y);
this.SuspendLayout();
this.Location = p;
this.ResumeLayout();
}
protected override void OnResize(System.EventArgs e)
{
base.OnResize(e);
}
public bool ShowDrag(Point p)
{
if (this.BackgroundImage == null) return false;
dragging = true;
Visible = true;
Refresh();
InternalMoveBitmap(p);
return true;
}
public bool MoveDrag(Point p)
{
if (!dragging) return false;
InternalMoveBitmap(p);
return true;
}
public bool HideDrag()
{
if (!dragging) return false;
Visible = false;
BackgroundImage = null;
dragging = false;
this.SuspendLayout();
this.Size = Size.Empty;
this.Location = InvisiblePoint;
this.ResumeLayout();
return true;
}
public Point HotSpot { get { return hotSpot; } set { hotSpot = value; } }
public Bitmap DragBitmap
{
get { return dragBitmap; }
set
{
this.BackgroundImage = value;
if (value == null)
{
HideDrag();
}
else
hotSpot = new Point(value.Size.Width / 2, value.Size.Height / 2);
dragBitmap = value;
Size = BackgroundImage.Size;
}
}
}
/// <summary>
///
/// </summary>
public class DevImageCapturer
{
[System.Runtime.InteropServices.DllImport("USER32.dll")]
internal static extern IntPtr GetDC(IntPtr dc);
[System.Runtime.InteropServices.DllImport("USER32.dll")]
internal static extern int ReleaseDC(IntPtr hWnd, IntPtr hDC);
[System.Runtime.InteropServices.DllImport("USER32.dll")]
internal static extern IntPtr GetDesktopWindow();
[System.Runtime.InteropServices.DllImport("gdi32.dll")]
internal static extern bool BitBlt(IntPtr hdcDest, int nXDest, int nYDest, int nWidth, int nHeight, IntPtr hdcSrc, int nXSrc, int nYSrc, uint dwRop);
[System.Runtime.InteropServices.DllImport("gdi32.dll")]
internal static extern IntPtr CreateCompatibleDC(IntPtr hdc);
[System.Runtime.InteropServices.DllImport("gdi32.dll")]
internal static extern IntPtr CreateCompatibleBitmap(IntPtr hdc, int nWidth, int nHeight);
[System.Runtime.InteropServices.DllImport("gdi32.dll")]
internal static extern bool DeleteObject(IntPtr hObject);
[System.Runtime.InteropServices.DllImport("gdi32.dll")]
internal static extern IntPtr SelectObject(IntPtr hdc, IntPtr obj);
[System.Runtime.InteropServices.DllImport("gdi32.dll")]
internal static extern IntPtr CreateSolidBrush(int color);
[System.Runtime.InteropServices.DllImport("gdi32.dll")]
internal static extern IntPtr CreatePatternBrush(IntPtr hBitmap);
/// <summary>
///
/// </summary>
/// <param name="control"> </param>
/// <param name="pattern"> </param>
/// <returns></returns>
public static Bitmap GetControlBitmap(Control control, Bitmap pattern)
{
int width = control.Width;
int height = control.Height;
if (control is Form)
{
width = control.ClientRectangle.Width;
height = control.ClientRectangle.Height;
}
IntPtr hdc = GetDC(control.Handle);
IntPtr compDC = CreateCompatibleDC(hdc);
IntPtr compHBmp = CreateCompatibleBitmap(hdc, width, height);
IntPtr prev = SelectObject(compDC, compHBmp);
IntPtr brush = IntPtr.Zero, prevBrush = IntPtr.Zero;
if (pattern != null)
{
brush = CreatePatternBrush(pattern.GetHbitmap());
prevBrush = SelectObject(compDC, brush);
}
Point pt = new Point(0, 0);
BitBlt(compDC, 0, 0, width, height, hdc, pt.X, pt.Y, 0x00C000CA);
SelectObject(compDC, prev);
if (prevBrush != IntPtr.Zero)
SelectObject(compDC, prevBrush);
ReleaseDC(control.Handle, hdc);
NativeMethods.DeleteDC(compDC);
Bitmap bmp = Bitmap.FromHbitmap(compHBmp);
DeleteObject(compHBmp);
if (brush != IntPtr.Zero)
DeleteObject(brush);
return bmp;
}
/// <summary>
///
/// </summary>
/// <param name="control"> </param>
/// <param name="pattern"> </param>
/// <param name="offSetX">X</param>
/// <param name="offSetY">Y</param>
/// <param name="width"> </param>
/// <param name="height"> </param>
/// <returns></returns>
public static Bitmap GetControlBitmap(Control control, Bitmap pattern, int offSetX = 0, int offSetY = 0, int width = 0, int height = 0)
{
width = width == 0 ? control.Width : width;
height = height == 0 ? control.Height : height;
if (control is Form)
{
width = control.ClientRectangle.Width;
height = control.ClientRectangle.Height;
}
IntPtr hdc = GetDC(control.Handle);
IntPtr compDC = CreateCompatibleDC(hdc);
IntPtr compHBmp = CreateCompatibleBitmap(hdc, width, height);
IntPtr prev = SelectObject(compDC, compHBmp);
IntPtr brush = IntPtr.Zero, prevBrush = IntPtr.Zero;
if (pattern != null)
{
brush = CreatePatternBrush(pattern.GetHbitmap());
prevBrush = SelectObject(compDC, brush);
}
Point pt = new Point(offSetX, offSetY);
BitBlt(compDC, 0, 0, width, height, hdc, pt.X, pt.Y, 0x00C000CA);
SelectObject(compDC, prev);
if (prevBrush != IntPtr.Zero)
SelectObject(compDC, prevBrush);
ReleaseDC(control.Handle, hdc);
NativeMethods.DeleteDC(compDC);
Bitmap bmp = Bitmap.FromHbitmap(compHBmp);
DeleteObject(compHBmp);
if (brush != IntPtr.Zero)
DeleteObject(brush);
return bmp;
}
}
public class DragMaster
{
[ThreadStatic]
static DragWindow dragWindow;
bool dragInProgress;
DragDropEffects effects;
DragDropEffects lastEffect;
static Cursor customizationCursor = null;
double _opacity = 0.7;
public double Opacity
{
get { return _opacity; }
set { _opacity = value; }
}
public DragMaster()
{
dragInProgress = false;
lastEffect = effects = DragDropEffects.None;
}
DragWindow DragWindow
{
get
{
if (dragWindow == null) dragWindow = new DragWindow() { Opacity = this.Opacity };
return dragWindow;
}
}
public DragDropEffects LastEffect
{
get { return lastEffect; }
}
public bool DragInProgress
{
get { return dragInProgress; }
}
/// <summary>
///
/// </summary>
public Size DragSize
{
get
{
if (DragWindow.DragBitmap == null) return Size.Empty;
return DragWindow.DragBitmap.Size;
}
}
/// <summary>
///
/// </summary>
/// <param name="bmp"></param>
/// <param name="startPoint"></param>
/// <param name="effects"></param>
public void StartDrag(Bitmap bmp, Point startPoint, DragDropEffects effects)
{
StopDrag();
dragInProgress = true;
this.effects = effects;
lastEffect = effects;
DragWindow.MakeTopMost();
DragWindow.DragBitmap = bmp;
DragWindow.ShowDrag(startPoint);
SetDragCursor(effects);
}
/// <summary>
///
/// </summary>
protected void StopDrag()
{
dragInProgress = false;
lastEffect = effects = DragDropEffects.None;
DragWindow.HideDrag();
}
/// <summary>
///
/// </summary>
/// <param name="e"></param>
public void SetDragCursor(DragDropEffects e)
{
if (e == DragDropEffects.None)
Cursor.Current = CustomizationCursor;
else
Cursor.Current = Cursors.Default;
}
/// <summary>
///
/// </summary>
/// <param name="p"></param>
/// <param name="e"></param>
/// <param name="setCursor"></param>
public void DoDrag(Point p, DragDropEffects e, bool setCursor)
{
if (!dragInProgress) return;
lastEffect = e;
if (setCursor) SetDragCursor(e);
DragWindow.MoveDrag(p);
}
/// <summary>
///
/// </summary>
public void CancelDrag()
{
if (!dragInProgress) return;
StopDrag();
}
/// <summary>
///
/// </summary>
public void EndDrag()
{
if (!dragInProgress) return;
StopDrag();
}
/// <summary>
/// Cursor
/// </summary>
static Cursor CustomizationCursor
{
get
{
if (customizationCursor == null) customizationCursor = ResourceImageHelper.CreateCursorFromResources("DevExpress.XtraTreeList.Images.customization.cur", typeof(DragMaster).Assembly);
return customizationCursor;
}
}
}
본 고 에서 말 한 것 이 여러분 의 C\#프로 그래 밍 에 도움 이 되 기 를 바 랍 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
WebView2를 Visual Studio 2017 Express에서 사용할 수 있을 때까지Evergreen .Net Framework SDK 4.8 VisualStudio2017에서 NuGet을 사용하기 때문에 패키지 관리 방법을 packages.config 대신 PackageReference를 사용해야...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.