欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2023-12-01 11:49:40
本文实例讲述了c# winform实现窗体上控件*拖动功能。分享给大家供大家参考,具体如下: 说明:首先在窗体上放一个pictruebox控件,命名为pb1,拖动完整代...

本文实例讲述了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#相关内容感兴趣的读者可查看本站专题:《winform控件用法总结》、《c#窗体操作技巧汇总》、《c#数据结构与算法教程》、《c#常见控件用法教程》、《c#面向对象程序设计入门教程》及《c#程序设计之线程使用技巧总结

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