在运行时使用鼠标移动控件和改变控件的大小

原创 2003年03月15日 10:17:00

在运行时使用鼠标移动控件和改变控件的大小

 

我写了一个类,使用它可以通过鼠标自由移动所有放到窗体上的控件,也可以自由的改变其大小。这个类只可以处理窗体上的控件,如果你有兴趣,可以补充一点代码,使得这个类可以处理更复杂的情形,比如,在Panel控件上的控件。

类代码

public class Resize

       {

              bool IsMoving=false;

              int ctrlLastWidth=0;

              int ctrlLastHeight=0;

              int ctrlWidth;

              int ctrlHeight;

              int ctrlLeft;

              int ctrlTop;

              int cursorL;

              int cursorT;

              int ctrlLastLeft;

              int ctrlLastTop;

              int Htap;

              int Wtap;

              bool ctrlIsResizing=false;

              System.Drawing.Rectangle ctrlRectangle = new System.Drawing.Rectangle();

              private Control ctrl;

              private Form frm;

              public Resize(Control c,Form frm)

              {

                     ctrl=c;

                     this.frm=frm;

                     this.Htap=this.frm.Height-this.frm.ClientRectangle.Height;

                     this.Wtap=this.frm.Width-this.frm.ClientRectangle.Width;

                     ctrl.MouseDown+=new MouseEventHandler(MouseDown);

                     ctrl.MouseMove+=new MouseEventHandler(MouseMove);

                     ctrl.MouseUp+=new MouseEventHandler(MouseUp);

              }

              private void MouseMove(object sender,MouseEventArgs e)

              {

                     if (frm==null)

                            return;

                     if (e.Button==MouseButtons.Left)

                     {

                            if(this.IsMoving)

                            {

                                   if (ctrlLastLeft == 0)

                                          ctrlLastLeft = ctrlLeft;

                                   if (ctrlLastTop==0)

                                          ctrlLastTop = ctrlTop;

                                   int locationX=(Cursor.Position.X-this.cursorL+this.frm.DesktopLocation.X+this.Wtap+this.ctrl.Location.X);

                                   int locationY=(Cursor.Position.Y-this.cursorT+this.frm.DesktopLocation.Y+this.Htap+this.ctrl.Location.Y);

                                   if(locationX<this.frm.DesktopLocation.X+this.Wtap)

                                          locationX=this.frm.DesktopLocation.X+this.Wtap;

                                   if(locationY<this.frm.DesktopLocation.Y+this.Htap)

                                          locationY=this.frm.DesktopLocation.Y+this.Htap;

                                   this.ctrlLeft=locationX;

                                   this.ctrlTop=locationY;

                                   ctrlRectangle.Location = new System.Drawing.Point(this.ctrlLastLeft,this.ctrlLastTop);

                                   ctrlRectangle.Size = new System.Drawing.Size(ctrlWidth,ctrlHeight);

                                   ControlPaint.DrawReversibleFrame(ctrlRectangle, Color.Empty, System.Windows.Forms.FrameStyle.Dashed);

                                   ctrlLastLeft = ctrlLeft;

                                   ctrlLastTop = ctrlTop;

                                   ctrlRectangle.Location = new System.Drawing.Point(ctrlLeft,ctrlTop);

                                   ctrlRectangle.Size = new System.Drawing.Size(ctrlWidth,ctrlHeight);

                                   ControlPaint.DrawReversibleFrame(ctrlRectangle, Color.Empty, System.Windows.Forms.FrameStyle.Dashed);

                                   return;

                            }

                            int sizeageX = (Cursor.Position.X-this.frm.DesktopLocation.X-this.Wtap-this.ctrl.Location.X);

                            int sizeageY = (Cursor.Position.Y-this.frm.DesktopLocation.Y-this.Htap-this.ctrl.Location.Y);

                            if (sizeageX < 2)

                                   sizeageX = 1;

                            if (sizeageY < 2)

                                   sizeageY = 1;

                            ctrlWidth = sizeageX;

                            ctrlHeight = sizeageY;

                            if (ctrlLastWidth == 0)

                                   ctrlLastWidth = ctrlWidth;

                            if (ctrlLastHeight==0)

                                   ctrlLastHeight = ctrlHeight;

                            if (ctrlIsResizing)

                            {

                                   ctrlRectangle.Location = new System.Drawing.Point(this.frm.DesktopLocation.X+this.ctrl.Left+this.Wtap,this.frm.DesktopLocation.Y+this.Htap+this.ctrl.Top);

                                   ctrlRectangle.Size = new System.Drawing.Size(ctrlLastWidth,ctrlLastHeight);

                            }

                            ctrlIsResizing = true;

                            ControlPaint.DrawReversibleFrame(ctrlRectangle, Color.Empty, System.Windows.Forms.FrameStyle.Dashed);

                            ctrlLastWidth = ctrlWidth;

                            ctrlLastHeight = ctrlHeight;

                            ctrlRectangle.Location = new System.Drawing.Point(this.frm.DesktopLocation.X+this.Wtap+this.ctrl.Left,this.frm.DesktopLocation.Y+this.Htap+this.ctrl.Top);

                            ctrlRectangle.Size = new System.Drawing.Size(ctrlWidth,ctrlHeight);

                            ControlPaint.DrawReversibleFrame(ctrlRectangle, Color.Empty, System.Windows.Forms.FrameStyle.Dashed);

                     }

              }

              private  void MouseDown(object sender,MouseEventArgs e)

              {

                     if (frm==null)

                            return;

                     if (e.X<this.ctrl.Width-10||e.Y<this.ctrl.Height-10)

                     {

                            this.IsMoving=true;

                            this.ctrlLeft=this.frm.DesktopLocation.X+this.Wtap+this.ctrl.Left;

                            this.ctrlTop=this.frm.DesktopLocation.Y+this.Htap+this.ctrl.Top;

                            this.cursorL=Cursor.Position.X;

                            this.cursorT=Cursor.Position.Y;

                            this.ctrlWidth=this.ctrl.Width;

                            this.ctrlHeight=this.ctrl.Height;

                     }

                     ctrlRectangle.Location = new System.Drawing.Point(this.ctrlLeft,this.ctrlTop);

                     ctrlRectangle.Size = new System.Drawing.Size(ctrlWidth,ctrlHeight);

                     ControlPaint.DrawReversibleFrame(ctrlRectangle, Color.Empty, System.Windows.Forms.FrameStyle.Dashed);

              }

              private void MouseUp(object sender,MouseEventArgs e)

              {

                     if (frm==null)

                            return;

                     ctrlIsResizing = false;

                     if (this.IsMoving)

                     {

                            ctrlRectangle.Location = new System.Drawing.Point(this.ctrlLeft,this.ctrlTop);

                            ctrlRectangle.Size = new System.Drawing.Size(ctrlWidth,ctrlHeight);

                            ControlPaint.DrawReversibleFrame(ctrlRectangle, Color.Empty, System.Windows.Forms.FrameStyle.Dashed);

                            this.ctrl.Left=this.ctrlLeft-this.frm.DesktopLocation.X-this.Wtap;

                            this.ctrl.Top=this.ctrlTop-this.frm.DesktopLocation.Y-this.Htap;

                            this.IsMoving=false;

                            this.ctrl.Refresh();

                            return;

                     }

                     ctrlRectangle.Location = new System.Drawing.Point(this.frm.DesktopLocation.X+this.Wtap+this.ctrl.Left,this.frm.DesktopLocation.Y+this.Htap+this.ctrl.Top);

                     ctrlRectangle.Size = new System.Drawing.Size(ctrlWidth,ctrlHeight);

                     ControlPaint.DrawReversibleFrame(ctrlRectangle, Color.Empty, System.Windows.Forms.FrameStyle.Dashed);

                     this.ctrl.Width = ctrlWidth;

                     this.ctrl.Height = ctrlHeight;

                     this.ctrl.Refresh();

              }

       }

 

}

如何使用这个类

假设窗体上有两个控件listBox1toolBar1,你可以在适当的时机(一般在窗体的Load事件中)加入下面的语句就可以了。

Resize r1=new  Resize(this.toolBar1,this);

Resize r4= new Resize(this.listBox1,this);

其他

你也可以添加一些方法,使得在需要的时候可以停止鼠标移动控件的功能,比如:

public void Stop()

{

ctrl.MouseDown- =new MouseEventHandler(MouseDown);

ctrl.MouseMove- =new MouseEventHandler(MouseMove);

ctrl.MouseUp- =new MouseEventHandler(MouseUp);

}

c# winform 一个可以用鼠标改变控件位置和大小的类,调用即可

using System;   using System.Collections.Generic;   using System.Text;   using System.ComponentMo...
  • SunCherryDream
  • SunCherryDream
  • 2014年03月11日 12:15
  • 1143

Winform鼠标拖动改变控件大小、移动控件位置

基本逻辑: 1、鼠标移动过程(未按下鼠标左键)进行边界检测,当移动到控件边界时(某范围内),改变显示的光标; 2、此时,若按下鼠标左键(也可是右键),记录鼠标的位置和控件的大小; 3、按下鼠标左键移动...
  • beibeisong
  • beibeisong
  • 2015年12月28日 15:26
  • 1549

C# 实现拖拉控件改变位置与大小

前言:   很多时候我们需要在运行时,动态地改变控件的位置以及大小,以获得更好的布局。比如说实际项目中的可自定义的报表、可自定义的单据等诸如此类。它们有个特点就是允许客户或者二次开发人员设计它们...
  • hugo20
  • hugo20
  • 2016年05月30日 00:30
  • 4061

DUILIB按钮随窗口变化而移动

前言:这几天一直在研究DUILIB,原以为DUILIB很好用很好学,随着软件的深入,发现DUILIB毕竟还是在初期阶段,关键问题在于资料太少,或许有一些大牛,但还没有看到他们的文章,希望大家都能分享自...
  • harvic880925
  • harvic880925
  • 2013年05月28日 10:04
  • 11065

Delphi实现控件的移动、改变大小

关键词:实现控件的移动、改变大小 实现控件的移动,改变大小(DELPHI实现) 主要使用Perform方法   function Perform(Msg: Cardinal; WPara...
  • delphi308
  • delphi308
  • 2013年08月08日 17:07
  • 663

C# WinForm控件的拖动和缩放的实现

转自:http://blog.csdn.net/joyhen/article/details/8572505 C# WinForm控件的拖动和缩放是个很有用的功能。实现起来其实很简单的,主要是设...
  • u012252959
  • u012252959
  • 2016年01月22日 17:23
  • 2439

VC中自动改变控件位置和大小的对话框类(转)

一个可以自动改变控件位置和大小的对话框类。从这个类继承的对话框类,只要在OnInitDialog()里写几行简单的代码,对话框上的控件就会随着对话框大小的改变而改变自己的位置和大小。    ...
  • xringm
  • xringm
  • 2016年09月12日 13:42
  • 783

如何实现控件随对话框大小变化而自动调整大小和位置

1. 处理对话框的WM_SIZE,然后用MoveWindow或者SetWindowPos来把对话框上面的控件重新调整新位置和大小。  2. 基本的做法就是响应WM_SIZE消息,并按照窗口大小比例来...
  • fanwenyuan_fwy
  • fanwenyuan_fwy
  • 2014年10月14日 18:26
  • 901

VS2013 MFC 对话框控件大小随窗口大小改变而改变

窗口大小改变后控件大小也随之改变在对话框头文件中定义头文件名称:项目名称Dlg.hPOINT Old;//存放对话框的宽和高。 对话框cpp中初始化cpp文件名称:项目名称Dlg.cpp 在OnIn...
  • why19940926
  • why19940926
  • 2016年12月30日 21:43
  • 1777

WinForm实现鼠标悬停显示控件

WinForm实现鼠标悬停显示控件 在某些需频繁操作的环节中,为提高效率、减少劳动,可以在操作细节上下功夫,以带来更好的用户体验。 今天介绍的鼠标悬停显示功能就是一例,看似仅仅节省了一次点击,...
  • qq_19980669
  • qq_19980669
  • 2015年06月16日 17:14
  • 1851
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:在运行时使用鼠标移动控件和改变控件的大小
举报原因:
原因补充:

(最多只允许输入30个字)