Groovy—*—Johonny

用C#创建可拖动窗体

 

窗体的移动

  我们来观察鼠标在窗体内的位置和窗体的移动,很容易可以发现:在窗体被拖动的过程中,鼠标在窗体内的相对位置是始终不变的!那么,我们只要检测到鼠标在屏幕中的移动并修改窗体的位置就可以达到拖动窗体的目的!
  我们知道,在鼠标消息/事件处理中,只能得到鼠标相对于窗体的位置。那么,如何知道鼠标在屏幕中的位置呢?这里又要提到一个类:System.Windows.Forms.Control类。也许你会很吃惊:这不是所有控件的基类么?呵呵~是这样di。不过,尽管是这样,Control类却没有像其他广泛使用的基类那样被声明为抽象类,而且它提供了一个静态属性:MousePosition,通过这个属性可以得到鼠标相对于屏幕的位置。有关Control类的信息可以在.NET Framework文档目录“.NET Framework SDK -> 参考 -> 类库 -> System.Windows.Forms -> Control 类”处找到(注:这里的超链接只在您安装了.NET Framework 1.1简体中文版并且安装了配套文档时才有效)。

  知道了如何获取这些信息之后,制作移动窗体实际上就成了一个很简单的问题了。基本过程是这样的:首先,在鼠标(左键或一个你喜欢的键)按下时,记录鼠标位置;由于在移动的过程中,鼠标的屏幕坐标发生变化但窗体相对坐标不变,我们可以推算出窗体位置的变化为(假设mousePosition具有System.Drawing.Point类型,表示鼠标在窗体中的相对坐标):


  // 示例代码1
  Form.Top = Control.MousePosition.Y - mousePosition.Y;
  Form.Left = Control.MousePosition.X - mousePosition.X;

  这样还不行,因为我们的mousePosition表示的是鼠标在窗体用户区内的相对坐标,但在移动窗体的时候还要考虑窗体标题栏和边框的尺寸。在上面的基础上,我们将代码修正为:


  // 示例代码2
  Form.Top = Control.MousePosition.Y - mousePosition.Y
  - SystemInformation.FrameBorderSize.Height - SystemInformation.CaptionHeight;
  Form.Left = Control.MousePosition.Y - mousePosition.Y
  - SystemInformation.FrameBorderSize.Width;

  也就是说,在高度上(纵坐标)要减去标题栏的高度和边框的高度,而在宽度上(横坐标)要减去边框的宽度。然而,当制作一个既没有标题栏也没有边框的可拖动窗体时,使用“示例代码1”所示的代码就可以了。

  上面的代码只是一个示范性代码。具体的操作如下:

  首先,为窗体添加一个私有域:


  private System.Drawing.Point mousePoint;

  然后,为窗体添加鼠标按下事件处理方法(我这里是MainForm_MouseDown,别忘了将该方法链接到MainForm.MouseDown事件,这不用多说了吧?):


  private void MainForm_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e) {
  if(e.Button == MouseButtons.Left) {
  this.mousePosition.X = e.X;
  this.mousePosition.Y = e.Y;
  }
  }

  在这里注意对鼠标按键进行筛选。

  接下来,为窗体添加鼠标移动事件处理方法(我这里是MainForm_MouseMove):


  private void MainForm_MouseMove(object sender, System.Windows.Forms.MouseEventArgs e) {
  if(e.Button == MouseButtons.Left) {
  Form.Top = Control.MousePosition.Y - mousePosition.Y
  - SystemInformation.FrameBorderSize.Height - SystemInformation.CaptionHeight;
  Form.Left = Control.MousePosition.Y - mousePosition.Y
  - SystemInformation.FrameBorderSize.Width;
  }
  }

posted on 2009-04-03 13:26 JOHONNY 阅读(129) 评论(0)  编辑 收藏 引用 所属分类: C Sharp

只有注册用户登录后才能发表评论。