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”键,效果不错吧! 供大家参考!!!!!! [此贴子已经被作者于2003-10-25 2:17:50编辑过]
|