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));
            }
        }
    }

  • 相关阅读:
    hdu 5171(矩阵快速幂,递推)
    hdu 1316(大整数)
    hdu 5170(数学)
    hdu 5167(dfs)
    hdu 5166(水题)
    hdu 5720(贪心+区间合并)
    BestCoder 2nd Anniversary的前两题
    hdu 3065(AC自动机)
    2.3绘制构造线与射线
    查找ARP攻击源
  • 原文地址:https://www.cnblogs.com/liancs/p/3879316.html
Copyright © 2011-2022 走看看