改变控件的位置

在释放鼠标按钮后可能会希望改变源控件的位置。为把控件移动到鼠标的新位置处,应对任何已被允许拖动的控件使用 Move 方法。

在窗体上将控件拖放到任意不被其它控件占据的位置,此时就可将控件重新定位。为说明这一点,应启动一个新的 Visual Basic 工程,在窗体上添加 Image 控件并设置 Picture 属性,从而将图标或位图分配给 Image 控件,然后将 Image 控件的 DragMode 属性改成 1-Automatic。

将以下过程添加到窗体的 DragDrop 事件中:

Private Sub Form_DragDrop (Source As Control, _
      X As Single, Y As Single)
   Source.Move X, Y
End Sub

此代码并未完全按照意图产生预期效果,因为它将控件的左上角放在鼠标位置。下列代码则将控件的中央放在鼠标位置:

Private Sub Form_DragDrop (Source As Control, _
      X As Single, Y As Single)
   Source.Move (X - Source.Width / 2), _
      (Y - Source.Height / 2)
End Sub

当 DragIcon 属性的设置值不是缺省值(灰色矩形)时,代码的工作状态最佳。当使用灰色矩形时,用户往往希望将控件准确地移入灰色矩形的最终位置。为此,应记录鼠标在源控件中的初始位置。然后将此位置值作为移动控件时的偏移量来使用。

记录鼠标的起始位置:

  1. 指定手工拖动控件。

  2. 声名两个窗体级变量 DragXDragY

  3. 当 MouseDown 事件发生时打开拖动状态。

  4. xy 的值存储在此事件的窗体级变量中。

下例说明如何为名为 Image1 的 image 控件产生拖动动作。在设计时应将控件的 DragMode 属性设置为 0-Manual。声名部分包括窗体级变量 DragXDragY,这两个变量将鼠标在 Image 控件中的起始位置记录下来:

Dim DragX As Single, DragY As Single

控件的 MouseDown 和 MouseUp 过程分别执行打开拖动状态和放下控件的操作。此外,MouseDown 过程还将拖动开始时鼠标在控件中的位置记录下来:

Private Sub Image1_MouseDown (Button As Integer, _
      Shift As Integer, X As Single, Y As Single)
   Image1.Drag 1
   DragX = X
   DragY = Y
End Sub

Form_DragDrop 过程确实移动了控件。为简化此例,假设 Image1 是窗体上的唯一控件,因而目标只是窗体本身。Form_DragDrop 过程用 DragXDragX 偏移量将控件再定位:

Private Sub Form_DragDrop (Source As Control, _
      X As Single, Y As Single)
   Source.Move (X - DragX), (Y - DragY)
End Sub

注意,本例假定 Image1 和窗体的坐标系统使用相同的单位。若不相同,则应进行单位转换。

详细信息 关于坐标系统的详细信息,请参阅“语言参考”的“使用文本和图形”和“ScaleMode 属性”。