主要是设计控件的MouseDown、MouseLeave、MouseMove事件。一步步来吧:
1、定义一个枚举类型,描述光标状态

private enum EnumMousePointPosition

{

MouseSizeNone = 0, //'无

MouseSizeRight = 1, //'拉伸右边框

MouseSizeLeft = 2, //'拉伸左边框

MouseSizeBottom = 3, //'拉伸下边框

MouseSizeTop = 4, //'拉伸上边框

MouseSizeTopLeft = 5, //'拉伸左上角

MouseSizeTopRight = 6, //'拉伸右上角

MouseSizeBottomLeft = 7, //'拉伸左下角

MouseSizeBottomRight= 8, //'拉伸右下角

MouseDrag = 9 // '鼠标拖动

}

2、定义几个变量

const int Band = 5;

const int MinWidth=10;

const int MinHeight=10;

private EnumMousePointPosition m_MousePointPosition;

private Point p,p1;

3、定义自己的MyMouseDown事件

private void MyMouseDown(object sender,System.Windows.Forms.MouseEventArgs e)

{

p.X=e.X;

p.Y=e.Y;

p1.X=e.X;

p1.Y=e.Y;

}

4、定义自己的MyMouseLeave事件

private void MyMouseLeave(object sender, System.EventArgs e)

{

m_MousePointPosition = EnumMousePointPosition.MouseSizeNone;

this.Cursor=Cursors.Arrow;

}

5、设计一个函数,确定光标在控件不同位置的样式

private EnumMousePointPosition MousePointPosition(Size size,System.Windows.Forms.MouseEventArgs e)

{

if ((e.X >= -1 * Band) | (e.X <= size.Width) | (e.Y >= -1 * Band) | (e.Y <= size.Height))

{

if (e.X < Band)

{

if (e.Y < Band) {return EnumMousePointPosition.MouseSizeTopLeft;}

else

{

if (e.Y > -1 * Band + size.Height)

{return EnumMousePointPosition.MouseSizeBottomLeft;}

else

{return EnumMousePointPosition.MouseSizeLeft;}

}

}

else

{

if (e.X > -1 * Band + size.Width)

{

if (e.Y < Band)

{return EnumMousePointPosition.MouseSizeTopRight;}

else

{

if (e.Y > -1 * Band + size.Height)

{return EnumMousePointPosition.MouseSizeBottomRight;}

else

{return EnumMousePointPosition.MouseSizeRight;}

}

}

else

{

if (e.Y < Band)

{return EnumMousePointPosition.MouseSizeTop;}

else

{

if (e.Y > -1 * Band + size.Height)

{return EnumMousePointPosition.MouseSizeBottom;}

else

{return EnumMousePointPosition.MouseDrag;}

}

}

}

}

else

{return EnumMousePointPosition.MouseSizeNone;}

}

6、定义自己的MyMouseMove事件,在这个事件里,会使用上面设计的函数

private void MyMouseMove(object sender,System.Windows.Forms.MouseEventArgs e)

{

Control lCtrl =(sender as Control);

if (e.Button==MouseButtons.Left)

{

switch (m_MousePointPosition)

{

case EnumMousePointPosition.MouseDrag:

lCtrl.Left =lCtrl.Left+ e.X - p.X;

lCtrl.Top =lCtrl.Top+ e.Y - p.Y;

break;

case EnumMousePointPosition.MouseSizeBottom:

lCtrl.Height = lCtrl.Height + e.Y - p1.Y;

p1.X=e.X;

p1.Y=e.Y; //'记录光标拖动的当前点

break;

case EnumMousePointPosition.MouseSizeBottomRight:

lCtrl.Width = lCtrl.Width + e.X - p1.X;

lCtrl.Height = lCtrl.Height + e.Y - p1.Y;

p1.X=e.X;

p1.Y=e.Y; //'记录光标拖动的当前点

break;

case EnumMousePointPosition.MouseSizeRight:

lCtrl.Width = lCtrl.Width + e.X - p1.X;

// lCtrl.Height = lCtrl.Height + e.Y - p1.Y;

p1.X=e.X;

p1.Y=e.Y; //'记录光标拖动的当前点

break;

case EnumMousePointPosition.MouseSizeTop:

lCtrl.Top = lCtrl.Top + (e.Y - p.Y);

lCtrl.Height = lCtrl.Height - (e.Y - p.Y);

break;

case EnumMousePointPosition.MouseSizeLeft:

lCtrl.Left = lCtrl.Left + e.X - p.X;

lCtrl.Width = lCtrl.Width - (e.X - p.X);

break;

case EnumMousePointPosition.MouseSizeBottomLeft:

lCtrl.Left = lCtrl.Left + e.X - p.X;

lCtrl.Width = lCtrl.Width - (e.X - p.X);

lCtrl.Height = lCtrl.Height+ e.Y - p1.Y;

p1.X=e.X;

p1.Y=e.Y; //'记录光标拖动的当前点

break;

case EnumMousePointPosition.MouseSizeTopRight:

lCtrl.Top = lCtrl.Top + (e.Y - p.Y);

lCtrl.Width = lCtrl.Width + (e.X - p1.X);

lCtrl.Height = lCtrl.Height - (e.Y - p.Y);

p1.X=e.X;

p1.Y=e.Y; //'记录光标拖动的当前点

break;

case EnumMousePointPosition.MouseSizeTopLeft:

lCtrl.Left = lCtrl.Left + e.X - p.X;

lCtrl.Top = lCtrl.Top + (e.Y - p.Y);

lCtrl.Width = lCtrl.Width - (e.X - p.X);

lCtrl.Height = lCtrl.Height - (e.Y - p.Y);

break;

default:

break;

}

if (lCtrl.Width<MinWidth) lCtrl.Width=MinWidth;

if (lCtrl.Height<MinHeight) lCtrl.Height=MinHeight;

}

else

{

m_MousePointPosition = MousePointPosition(lCtrl.Size, e); //'判断光标的位置状态

switch (m_MousePointPosition) //'改变光标

{

case EnumMousePointPosition.MouseSizeNone:

this.Cursor = Cursors.Arrow; //'箭头

break;

case EnumMousePointPosition.MouseDrag:

this.Cursor = Cursors.SizeAll; //'四方向

break;

case EnumMousePointPosition.MouseSizeBottom:

this.Cursor = Cursors.SizeNS; //'南北

break;

case EnumMousePointPosition.MouseSizeTop:

this.Cursor = Cursors.SizeNS; //'南北

break;

case EnumMousePointPosition.MouseSizeLeft:

this.Cursor = Cursors.SizeWE; //'东西

break;

case EnumMousePointPosition.MouseSizeRight:

this.Cursor = Cursors.SizeWE; //'东西

break;

case EnumMousePointPosition.MouseSizeBottomLeft:

this.Cursor = Cursors.SizeNESW; //'东北到南西

break;

case EnumMousePointPosition.MouseSizeBottomRight:

this.Cursor = Cursors.SizeNWSE; //'东南到西北

break;

case EnumMousePointPosition.MouseSizeTopLeft:

this.Cursor = Cursors.SizeNWSE; //'东南到西北

break;

case EnumMousePointPosition.MouseSizeTopRight:

this.Cursor = Cursors.SizeNESW; //'东北到南西

break;

default:

break;

}

}

}

7、制作一个初始化过程,将界面panel1上的所有控件都绑定MyMouseDown、MyMouseLeave、MyMouseMove事件,记得在Form初始化或者Form_Load时先执行它。

private void initProperty()

{

for(int i = 0; i < this.panel1.Controls.Count; i++)

{

this.panel1.Controls[i].MouseDown+= new System.Windows.Forms.MouseEventHandler(MyMouseDown);

this.panel1.Controls[i].MouseLeave+= new System.EventHandler(MyMouseLeave);

this.panel1.Controls[i].MouseMove += new System.Windows.Forms.MouseEventHandler(MyMouseMove);

}

}

以上就是C# WinForm实现控件拖动几个步骤,希望对你有所帮助。

C# WinForm实现控件拖动实例介绍的更多相关文章

  1. DevExpress XtraScheduler日程管理控件应用实例(2)-- 深入理解数据存储

    DevExpress年终击穿底价,单套授权低至67折!查看详情>>> 在上篇随笔<DevExpress XtraScheduler日程管理控件应用实例(1)-- 基本使用> ...

  2. 在DevExpress程序中使用Winform分页控件直接录入数据并保存

    一般情况下,我们都倾向于使用一个组织比较好的独立界面来录入或者展示相关的数据,这样处理比较规范,也方便显示比较复杂的数据.不过在一些情况下,我们也可能需要直接在GridView表格上直接录入或者修改数 ...

  3. [转载]WPF控件拖动

    这篇博文总结下WPF中的拖动,文章内容主要包括: 1.拖动窗口 2.拖动控件 Using Visual Studio 2.1thumb控件 2.2Drag.Drop(不连续,没有中间动画) 2.3拖动 ...

  4. MFC按钮、列表控件应用实例(一)

    需求:实现张三.李四.王五 3 人的课程选择,并将选课结果提交到列表框中显示. 实现过程: 1.建立对话框mfc工程. 2.添加控件 tab 顺序 控 件 类 型 控件 ID1 Button IDC_ ...

  5. winform基础控件总结

    转自:http://www.cnblogs.com/top5/archive/2010/04/29/1724039.html 基础 - 常用控件 C# WinForm开发系列 - CheckBox/B ...

  6. NTKO在线office控件使用实例

    目录 1. NTKO在线office控件使用实例 1.1. 基础介绍 1.2. 基本原理 1.3. 实例 1.3.1. 打开.保存部分代码 1.3.2. 动态设值 1. NTKO在线office控件使 ...

  7. winform窗体控件(全)

    回顾跟补充下除了昨天那常用6个其他的winform窗体控件作用 1:Button:按钮 (1)AutoSize:如果是True的情况下,内容将会撑开:False的话会另起一行 (2)Enabled: ...

  8. C#实现WinForm DataGridView控件支持叠加数据绑定

    我们都知道WinForm DataGridView控件支持数据绑定,使用方法很简单,只需将DataSource属性指定到相应的数据源即可,但需注意数据源必须支持IListSource类型,这里说的是支 ...

  9. winform基本控件----按钮

    这次来引用一个我们上课时候老师给的一个实验内容,来说一下winform程序设计中的按钮控件的使用.下面是我们老师给的实验内容. 实验目的: 掌握Winform的开发环境. 掌握窗体的创建和基本方法. ...

随机推荐

  1. 推荐一个国外的vps

    也是我遇到过的最廉价的国外的vps,稳定性还不错,用到如今没问题.唯一的缺点就是适合大的企业型的vps卖完了.... ..中文服务,中文界面. 能够用来FQ啊神马的. http://www.hi-vp ...

  2. Java基础 Day14 泛型

    //为什么要使用泛型 //1.解决元素存储的安全性的问题 //2.解决获取元素时,须要类型转换的问题 //未使用泛型 package org.tizen.test; import java.util. ...

  3. MySQL 性能监控 4 大指标

    [编者按]本文作者为 John Matson,主要介绍 mysql 性能监控应该关注的 4 大指标. 文章系国内 ITOM 管理平台 OneAPM 编译呈现.    MySQL 是什么? MySQL  ...

  4. CCS5 建立SYS/BIOS工程时报错“cannot find file "./configPkg/linker.cmd" bios”的解决方法

    CCS5 建立SYS/BIOS工程时报错“cannot find file "./configPkg/linker.cmd" bios”的解决方法 报错 #10008-D cann ...

  5. php.ini 中开启短标签 <?=$?>

    制参数: short_open_tag = On如果设置为Off,则不能正常解析类似于这样形式的php文件:<?phpinfo()?> 而只能解析<?phpphpinfo()?> ...

  6. 建索引让SQL飞起来

    今天帮助看了一个哥们的数据库,帮他抓了一下等待事件,刚好有一个sql在等待事件中,顺便看看 监控等待事件 select a.SID, a.EVENT, b.OSUSER, b.username, b. ...

  7. python中HTMLParser简单理解

    找一个网页,例如https://www.python.org/events/python-events/,用浏览器查看源码并复制,然后尝试解析一下HTML,输出Python官网发布的会议时间.名称和地 ...

  8. Entity Framework 配置

    Entity Framework的核心 – EDM(Entity Data Model) EDM概述 实体数据模型,简称EDM,由三个概念组成.概念模型由概念架构定义语言文件 (.csdl)来定义,映 ...

  9. JAVA问问

    一.java中的类和方法 java是面向对象的 类就可以看做一个对象 属性是这个对象拥有什么 方法是这个对象可以做什么 Eg: 类:Person 属性:eyes mouth 方法:eat 解释: Pe ...

  10. php入门实现留言板

    首先由一个文本文档read.txt liulan.html <!doctype html> <html lang="en"> <head> &l ...