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

软件世界

看了《电脑报》35期B11版刘轶先生关于用VB实现无标题窗体移动的文章,觉得文中介绍的方法不是很完善,根据文中方法,制作出的窗体被拖动时,窗体会随鼠标的移动而移动,而在默认的Windows设置中拖动窗体标题栏时,被拖动的窗体不会随鼠标的移动而移动,随鼠标移动的仅是一个形状、大小与窗体一致的虚框,只有释放鼠标后,窗体才会移动到释放鼠标时虚框的所在处。
其实我们可以很容易地实现这种方法,代码如下:
Private Declare Function ReleaseCapture Lib "user32" () As Long
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Private Const WM_NCLBUTTONDOWN = &HA1
Private Const HTCAPTION = 2
‘以上声明的API函数的常量均可在VB自带的“API文本浏览器”中取得。
Private Sub Form_MouseDown(Button As Integer,Shift As Integer,X As Single,Y As Single)
‘在窗体的MouseDown事件中加入以下代码。
If Button = 1 Then’判断是否鼠标的左键被按下
Call ReleaseCapture
Call SendMessage(hwnd,WM_NCLBUTTONDOWN,HTCAPTION,0)
End If
End Sub
上述方法实现起来比刘轶先生的方法更容易,仅几行代码,且也不再需要使用全局变量(我们应尽量减少使用全局变量),再者窗体被拖动时与普通窗体一样,仅一个虚框随鼠标的移动而移动,只有释放鼠标后,窗体才移动到相应位置。
注:通过“控制面板/显示/效果/拖动窗口时显示其内容”的设置可以决定拖动窗体时,窗体随鼠标的移动而移动或拖动时仅显示一个虚框,释放鼠标后,窗体才移动到相应的位置,Windows的默认设置为后者。使用上述代码的窗体同样会和其他窗体一样,根据Windows设置的不同而显示不同的拖动效果。