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#程序设计之线程使用技巧总结

原文地址:https://www.cnblogs.com/grj001/p/12224194.html