C# 拖动控件 不闪

如何让控件支持拖动(不是拖放)呢?很简单的

只需要处理鼠标按下、移动、释放三个消息就可以了,按下时开始记录鼠标位置,移动时计算鼠标移动距离,重设控件位置,鼠标释放时结束拖动

下面这段代码可以直接应用于任何控件,参数Control是所有控件的基类,因此可以应用于任何控件

m_OnDrag标示是否在拖动中

m_LastPoint记录上一次鼠标的位置

这里面没有使用事件参数提供的鼠标位置,因为这个值飘得厉害,会闪,用Cursor.Position就不会闪

PointToClient用来把屏幕坐标换算成客户区位置

    class DragControl
    {
        static public bool m_OnDrag = false;
        static private Point m_LastPoint = new Point();
        static public void EnableDrag(Control control)
        {
            //添加事件处理程序
            control.MouseDown += new MouseEventHandler(MouseDown);
            control.MouseMove += new MouseEventHandler(MouseMove);
            control.MouseUp += new MouseEventHandler(MouseUp);
        }
        static private void MouseDown(object sender, MouseEventArgs e)
        {
            Control control = (Control)sender;
            Point newpoint = control.Parent.PointToClient(Cursor.Position);

            m_LastPoint = newpoint;
            m_OnDrag = true;
        }
        static private void MouseMove(object sender, MouseEventArgs e)
        {
            if (m_OnDrag)
            {
                Control control = (Control)sender;
                Point newpoint=control.Parent.PointToClient(Cursor.Position);
                
               Point tmp=new Point(control.Location);//这几句临时写的,未经测试(因为原来的代码涉及到别的内容) 
         tmp.X
+= newpoint.X - m_LastPoint.X; tmp.Y += newpoint.Y - m_LastPoint.Y;
         control.Location=tmp;
m_LastPoint = newpoint; } } static private void MouseUp(object sender, MouseEventArgs e) { m_OnDrag = false; }
}
原文地址:https://www.cnblogs.com/shadowpigg/p/14025333.html