zoukankan      html  css  js  c++  java
  • C# WinForm实现窗体上控件自由拖动功能示例OK

    C# WinForm实现窗体上控件自由拖动功能示例

     更新时间:2017年07月06日 10:14:49   作者:a771948524    我要评论

    这篇文章主要介绍了C# WinForm实现窗体上控件自由拖动功能,涉及WinForm控件属性及事件响应相关操作技巧,需要的朋友可以参考下

    本文实例讲述了C# WinForm实现窗体上控件自由拖动功能。分享给大家供大家参考,具体如下:

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

    ?

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    22

    23

    24

    25

    26

    27

    28

    29

    30

    31

    32

    33

    34

    35

    36

    37

    38

    39

    40

    41

    42

    43

    44

    45

    46

    47

    48

    49

    50

    51

    52

    53

    54

    55

    56

    57

    58

    59

    60

    61

    62

    63

    64

    65

    66

    67

    68

    69

    70

    71

    72

    73

    74

    75

    76

    77

    78

    79

    80

    81

    82

    83

    84

    85

    86

    87

    88

    89

    90

    91

    92

    93

    94

    95

    96

    97

    98

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

        }

      }

    }

    更多关于C#相关内容感兴趣的读者可查看本站专题:《WinForm控件用法总结》、《C#窗体操作技巧汇总》、《C#数据结构与算法教程》、《C#常见控件用法教程》、《C#面向对象程序设计入门教程》及《C#程序设计之线程使用技巧总结

  • 相关阅读:
    配置文件
    ajax
    网线颜色排序
    cs程序添加初始化加载
    后台设置gridview不换行
    js 经典正则判断 一个字符串是否包含另一个字符串
    窗体关闭事件
    oracle根据视图删除表
    (字符串)哈希
    (字符串)哈希
  • 原文地址:https://www.cnblogs.com/grj001/p/12224195.html
Copyright © 2011-2022 走看看