VB中实现“无标题”窗体的移动

软件世界

在一些流行的应用软件中,均采用了无标题栏的窗体设计,显得时尚美观。在VB中,只要将“caption”属性设为空即可实现。不过问题随之而来:一旦窗体栏消失,怎样实现窗体的移动呢?笔者经过推敲总结出如下代码,现与大家共享:
首先,新建“工程1”,将Form1的“Caption”属性设为空,在窗体的通用声明区中加入如下代码:
Private Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long '获取鼠标位置
Private Type POINTAPI
x As Long
y As Long
End Type
Dim zb As POINTAPI 'zb是存放坐标的变量
Dim cx As Integer
Dim cy As Integer
Dim moveit As Boolean
注:以上的GetCursorPos API函数及POINTAPI类型可由VB自带的“API浏览器”中得到。
窗体代码如下:
Private Sub Form_MouseDown(Button As Integer, Shift As Integer, x As Single, y As Single)
moveit = True '按下鼠标,进入可移动状态。
cx = x 'cx记录下鼠标此时在窗体中的横坐标。
cy = y 'cy记录下鼠标此时在窗体中的纵坐标。
End Sub
Private Sub Form_MouseUp(Button As Integer, Shift As Integer, x As Single, y As Single)
moveit = False '鼠标弹起,移动结束。
End Sub
Private Sub Form_MouseMove(Button As Integer, Shift As Integer, x As Single, y As Single)
If moveit = True Then
GetCursorPos z '得到鼠标的位置
Form1.Move z.x * 15 - cx - 65, z.y * 15 - cy - 350 '这行代码是核心!由于VB中的缺省坐标单位是“Twips”,而用GetCursorPos得到的坐标是以“Pixel”为单位的。所以应将“z.x”,“z.y”转化为以“Twips”为单位的数值,“15(以分辨率为800*600为准)”就是Screen.Width与Screen.TwipsPerPixelX或(Screen.Height与Screen.TwipsPerPixelY)的比值,若屏幕使用其他的分辨率可依此类推。减去cx与cy为了使窗体从原地开始移动(大家可以去掉cx与cy,再看一看结果就明白了)。由于窗体的标题栏(虽然消失但移动还是以它为准)与边框有一定的高度和宽度,会造成开始移动时的窗体定位不精确,笔者反复实践发现以上算法最合适。
End If
End Sub
按下“F5”键,效果不错吧!