zoukankan      html  css  js  c++  java
  • WinForm实现窗体上控件的自由拖动

    说明:首先在窗体上放一个PictrueBox控件,命名为pb1,拖动完整代码如下:

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;

    namespace WinFormDrag
    {
        public partial class Form1 : Form
        {
            //鼠标按下坐标(control控件的相对坐标)
            Point mouseDownPoint = Point.Empty;
            //显示拖动效果的矩形
            Rectangle rect = Rectangle.Empty;
            //是否正在拖拽
            bool isDrag = false;

            public Form1()
            {
                InitializeComponent();
            }

            private void Form1_Paint(object sender, PaintEventArgs e)
            {
                if (rect != Rectangle.Empty)
                {
                    if (isDrag)
                    {//画一个和Control一样大小的黑框
                        e.Graphics.DrawRectangle(Pens.Black, rect);
                    }
                    else
                    {
                        e.Graphics.DrawRectangle(new Pen(this.BackColor), rect);
                    }
                }
            }

            /// <summary>
            /// 按下鼠标时
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            private void pb1_MouseDown(object sender, MouseEventArgs e)
            {
                if (e.Button == MouseButtons.Left)
                {
                    mouseDownPoint = e.Location;
                    //记录控件的大小
                    rect = pb1.Bounds;
                }
            }

            /// <summary>
            /// 移过时
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            private void pb1_MouseMove(object sender, MouseEventArgs e)
            {
                if (e.Button == MouseButtons.Left)
                {
                    isDrag = true;
                    //重新设置rect的位置,跟随鼠标移动
                    rect.Location = getPointToForm(new Point(e.Location.X - mouseDownPoint.X, e.Location.Y - mouseDownPoint.Y));
                    this.Refresh();

                }
            }

            /// <summary>
            /// 释放鼠标按钮时
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            private void pb1_MouseUp(object sender, MouseEventArgs e)
            {
                if (e.Button == MouseButtons.Left)
                {
                    if (isDrag)
                    {
                        isDrag = false;
                        //移动control到放开鼠标的地方
                        pb1.Location = rect.Location;
                        this.Refresh();
                    }
                    reset();
                }
            }

            //重置变量
            private void reset()
            {
                mouseDownPoint = Point.Empty;
                rect = Rectangle.Empty;
                isDrag = false;
            }

            //把相对与control控件的坐标,转换成相对于窗体的坐标。
            private Point getPointToForm(Point p)
            {
                return this.PointToClient(pb1.PointToScreen(p));
            }
        }
    }

  • 相关阅读:
    删除链表的倒数第N个节点
    SVN快速入门(TSVN)
    C# HttpWebRequest提交数据方式浅析
    简单的3个SQL视图搞定所有SqlServer数据库字典
    简单统计SQLSERVER用户数据表大小(包括记录总数和空间占用情况)
    详细讲解Android对自己的应用代码进行混淆加密防止反编译
    PHP之网络编程
    PHP之ThinkPHP模板标签操作
    PHP之ThinkPHP数据操作CURD
    关于数组的取极值和排序
  • 原文地址:https://www.cnblogs.com/liancs/p/3879316.html
Copyright © 2011-2022 走看看