.NET开发

本类阅读TOP10

·NHibernate快速指南(翻译)
·vs.net 2005中文版下载地址收藏
·【小技巧】一个判断session是否过期的小技巧
·VB/ASP 调用 SQL Server 的存储过程
·?dos下编译.net程序找不到csc.exe文件
·通过Web Services上传和下载文件
·学习笔记(补)《.NET框架程序设计(修订版)》--目录
·VB.NET实现DirectDraw9 (2) 动画
·VB.NET实现DirectDraw9 (1) 托管的DDraw
·建站框架规范书之——文件命名

分类导航
VC语言Delphi
VB语言ASP
PerlJava
Script数据库
其他语言游戏开发
文件格式网站制作
软件工程.NET开发
在运行时使用鼠标移动控件和改变控件的大小

作者:未知 来源:月光软件站 加入时间:2005-2-28 月光软件站

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

 

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

}




相关文章

相关软件