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

本文介绍了一个简单实用的类,该类允许用户在Windows窗体应用程序中通过鼠标自由地移动和调整控件大小。通过继承此类并应用到指定控件上,可以轻松实现交互式的控件布局调整。
在运行时使用鼠标移动控件和改变控件的大小 (转)[@more@]

在运行时使用鼠标移动控件和改变控件的大小XML:namespace prefix = o ns = "urn:schemas-microsoft-com:Office:office" />

 

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

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

      if(locationY

      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.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);

}


来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/10752043/viewspace-992955/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/10752043/viewspace-992955/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值