有个vb问题怎样都看不明白,为什么可以实现鼠标拖动窗口位置的?

PrivateConstHTCAPTION=2PrivateConstWM_NCLBUTTONDOWN=&HA1PrivateSubForm_MouseDown(Butt... Private Const HTCAPTION = 2
Private Const WM_NCLBUTTONDOWN = &HA1
Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
If Button = 1 Then
Dim ReturnVal As Long
Xs = ReleaseCapture()
ReturnVal = SendMessage(hWnd, WM_NCLBUTTONDOWN, HTCAPTION, 0) '返回值
End If
End Sub
展开
 我来答
lidajiangzw
2012-02-28 · TA获得超过903个赞
知道小有建树答主
回答量:774
采纳率:0%
帮助的人:718万
展开全部
Form_MouseDown 这是 窗体客户区域的 鼠标按下单击事件
Xs = ReleaseCapture() 释放 客户区域的 鼠标捕获,为什么要释放,就是因为下面这个消息是发送给 非客户区域,(非客户区域处理的消息中有按着鼠标不动拖动窗口的处理过程)就当把鼠标点击发送给 标题栏,这时候 处理点击标题栏的过程中要重新 捕获 鼠标(SetCapture),不释放 form 的捕获,这个标题栏的过程中就不能捕获鼠标,
SendMessage(hWnd, WM_NCLBUTTONDOWN, HTCAPTION, 0) 发送给非客户端点击信息

简单点就是 form 要释放鼠标的捕获,然后标题栏的过程中才能 使用setcapture 捕获鼠标,捕获鼠标后,鼠标移动的所有消息将传给 捕获鼠标的 那个控件的(就是标题栏的处理函数) 过程中,不然 只会把 鼠标的消息传给 form 的过程中, form 和标题栏 不是同一个控件,是2个独立的类创建的 窗体,就当2个窗体,只是这2个窗体是一个进程中的
追问
表示不懂……标题栏处理函数?标题栏处理函数是怎样的?把消息发给标题栏与非客户区又有什么关系?
追答
只有鼠标 按到 标题栏 才会拖动窗口,按住标题栏 会发送 消息 WM_NCLBUTTONDOWN 给该窗口,这个时候 窗口过程处理这个消息,知道 这是按住鼠标 拖动 窗口 的消息,就开始 捕获 鼠标,准备移动窗口 ,你移动 鼠标就开始移动窗口。
其实就是给窗口发送假消息,发送的消息说你 鼠标是 按住的 标题栏,不是form区域
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式