在运行时使用鼠标移动控件和改变控件的大小
2010-09-17 11:26
507 查看
在运行时使用鼠标移动控件和改变控件的大小
我写了一个类,使用它可以通过鼠标自由移动所有放到窗体上的控件,也可以自由的改变其大小。这个类只可以处理窗体上的控件,如果你有兴趣,可以补充一点代码,使得这个类可以处理更复杂的情形,比如,在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(); } } }
如何使用这个类
假设窗体上有两个控件listBox1和toolBar1,你可以在适当的时机(一般在窗体的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);
}
相关文章推荐
- 在运行时使用鼠标移动控件和改变控件的大小
- 在运行时使用鼠标移动控件和改变控件的大小
- 在运行时通过鼠标拖动移动控件位置及改变控件的大小
- java实现控件的移动及使用鼠标改变控件大小
- 在运行时通过鼠标拖动移动控件位置及改变控件的大小
- 在运行时通过鼠标拖动移动控件位置及改变控件的大小
- Winform鼠标拖动改变控件大小、移动控件位置
- (转)C#如何在运行时通过鼠标拖动改变控件的大小
- C#如何在运行时通过鼠标拖动改变控件的大小
- .net,C#如何在运行时通过鼠标拖动改变控件的大小
- 运行时改变控件大小运行时移动控件MINICAR版
- 使用鼠标拖曳的方式移动、更改panel控件的大小
- C#运行时鼠标移动控件 - 调用Windows API(ReleaseCapture)
- VC隐藏、显示、移动、改变大小控件
- WPF:从WPF Diagram Designer Part 1学习控件模板、移动、改变大小和旋转
- 运行时动态移动控件的位置和改变控件的尺寸
- 使用ASP.NET AJAX Control Toolkit中的ReorderList控件实现用鼠标拖动改变条目顺序
- vb.net中运行时动态改变控件大小
- 在运行时通过鼠标拖动移动控件位置(c#)
- c# winform 一个可以用鼠标改变控件位置和大小的类,调用即可