好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

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

本文实例讲述了C# 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));

     }

   }

}

希望本文所述对大家C#程序设计有所帮助。

dy("nrwz");

查看更多关于C# WinForm实现窗体上控件自由拖动功能示例的详细内容...

  阅读:45次