有很多软件为了实现特殊的显示效果,采用非矩形的窗体,而这些窗体往往没有标题栏。想要移动一个没有标题栏的窗口是不那么容易的。下面我介绍两种在vb中采取不同原理的方法移动一个没有标题栏的窗口。
方法一
这种方法是在窗体的mousedown、mouseup和mousemove等事件的处理过程中添加代码,实现在鼠标左键按下后移动时,改变窗体的left和top属性,实现移动无标题栏的窗体。
进入vb,把窗体form1的borderstyle属性设置为0-none(无标题栏),再窗体上添加一个buttoncommand组件,用来关闭程序。代码如下:
privatetypepoint
xassingle
yassingle
endtype
dimformpaspoint
'记录窗体原始位置
dimmousepaspoint
'记录鼠标按下时的位置
dimmouselbuttondownasboolean
'记录鼠标左键是否按下
privatesubcommand1_click()
end'退出程序
endsub
privatesubform_mousedown(buttonasinteger,shiftasinteger,xassingle,yassingle)
formp.x=form1.left
'记下窗体原始坐标位置
formp.y=form1.top
mousep.x=x
'记下鼠标按下时的位置
mousep.y=y
ifbutton=1then
mouselbuttondown=true
'鼠标左键按下
endif
endsub
privatesubform_mousemove(buttonasinteger,shiftasinteger,xassingle,yassingle)
ifmouselbuttondownthen
form1.left=formp.x (x-mousep.x)'移动窗体
form1.top=formp.y (y-mousep.y)
endif
endsub
privatesubform_mouseup(buttonasinteger,shiftasinteger,xassingle,yassingle)
mouselbuttondown=false
'鼠标左键弹起
endsub
上述方法不是很完善,制作出的窗体被拖动时,窗体会随鼠标的移动而移动。而在默认的windows设置中拖动窗体时,被拖动的窗体不会随窗体的移动而移动,随窗体移动的仅是一个与窗体形状、大小一样的虚框,只有释放鼠标后,窗体才会移动到释放鼠标时虚框的所在处。要实现这种效果,请看第二种方法。
方法二
这种方法通过消息的发送实现移动无标题窗体。当鼠标按下、移动或释放时,将鼠标在窗体上按下的消息(消息值为htcaption)发出,就可以拖动窗体了。代码如下:
privatedeclarefunctionreleasecapturelib"user32"()aslong
privatedeclarefunctionsendmessagelib"user32"alias"sendmessagea"(byvalhwndaslong,
byvalwmsgaslong,byvalwparamaslong,lparamasany)aslong
privateconstwm_nclbuttondown=&&ha1
privateconsthtcaption=2
'以上api函数和常数的声明可在vb自带的“api浏览器”中找到
privatesubform_mousedown(buttonasinteger,shiftasinteger,xassingle,yassingle)
'在窗体的mousedown事件中添加以下代码
ifbutton=1then
callreleasecapture
callsendmessage(hwnd,wm_nclbuttondown,htcaption,0)
endif
endsub
privatesubcommand1_click()
end '退出程序
endsub
这种方法实现起来比第一种方法更容易,只有几行代码,并且没有那么多的变量,窗体被拖动时与普通窗体一样,只有一个虚框随鼠标的移动而移动,当释放鼠标时窗体才移动到相应的位置。用到了两个api函数。
以上程序在vb6.0和windows98se下调试通过。
->