先说一下目前网络上流传的一种移动方法,这种方法的实现原理其实很简单,它是通过计算鼠标按下和放起的坐标差来确定移动后窗体的位置。首先在窗体的MouseDown事件中记录下移动前鼠标的位置,然后在MouseUp事件中也记录下鼠标的位置,通过计算这两个坐标的差值就可以确定窗体移动后的位置。这种方法的缺点是移动的时候跳跃感很明显,感觉比较别扭。 通过简单的API调用可以很好地实现无标题栏窗体的移动,可以不夸张地说没这种方法实现的效果比Microsoft做的还要好,而且实现也很简单,下面我们来看看这是怎么实现的。 使用的API函数Private Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long该函数可以获得鼠标在屏幕上的位置坐标,并把赋给一个POINTAPI类型变量。POINTAPI的定义如下Private Type POINTAPI X As Long Y As LongEnd Type 下面我们来实际的操作,首先建立一个标准EXE工程,把Form1的BorderStyle设为0-None,这样窗体的标题栏就没有了,进入窗体的代码界面输入下面的代码 '定义POINTAPI类型Private Type POINTAPI X As Long Y As LongEnd Type'API函数声明Private Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long'定义一个用于记录鼠标起始位置坐标的POINTAPI变量Dim scrPT As POINTAPI'在窗体的MouseDown事件中用API函数返回鼠标起始坐标Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single) If Button = 1 Then'判断是不是点击了左键 GetCursorPos scrPT'记录鼠标坐标 End IfEnd Sub '在每一次MouseMove事件中进行坐标处理Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single) If Button = 1 Then '定义一个用于记录鼠标新位置的POINTAPI变量 Dim pt As POINTAPI '获得新坐标 GetCursorPos pt '计算鼠标位移,相应的调整窗体位置 Me.Left = Me.Left + (pt.X - scrPT.X) * 15 Me.Top = Me.Top + (pt.Y - scrPT.Y) * 15 '把新坐标变量值赋给旧坐标变量 scrPT = pt '下一次事件触发,如此循环就可以事件窗体的平滑移动。 End If End Sub 欢迎大家留言讨论。 <完>

评论