关于SetCapture和GetCapture

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/LaoWu_/article/details/6839345
正常情况下,鼠标指针位于哪个窗口区域内,鼠标消息就自动发给哪个窗口。如果调用了SetCapture,之后无论鼠标的位置在哪,鼠标消息都发给指定的这个窗口,直到调用ReleaseCapture或者调用SetCapture设置另一个窗口为止。
很多时候,窗口或控件在鼠标按下后,需要知道鼠标移动和放开的情况,例如按钮在鼠标按下后会变为“按下”状态,鼠标移出按钮区域时“弹起”,所以按钮控件需要在鼠标按下时SetCapture,鼠标放开后ReleaseCapture。
GetCapture只是检查一下当前是哪个窗口捕获了鼠标,通常不需要调用。
展开阅读全文

关于 CWnd::SetCapture 的问题

01-17

书上说,调用这个函数后,不管鼠标在什么地方都可以收到鼠标消息。rnrn但是,MSDN 在 CWnd::SetCapture 部分有这么句话:While mouse input is captured, no WM_NCHITTEST or WM_SETCURSOR messages are sent to the active window.rn这里又说收不到 WM_NCHITTEST 或 WM_SETCRUSORrnrn运行我下面的程序,程序一启动,鼠标光标居然成了沙漏型。鼠标移动的时候也有输出,这应该说明收到了 WN_NCHITTEST。程序只有在释放鼠标以后才能最大化、最小化。换句话说,如果不执行 ReleaseCapture 就不让鼠标有单击功能,但是却可以由鼠标移动功能rnrn[code=C/C++]rn#includernrnclass CMainWindow : public CFrameWndrnrnpublic:rn CMainWindow();rnprotected:rn afx_msg void OnMouseMove(UINT nFlags,CPoint point );rn afx_msg void OnLButtonDown( UINT nFlags, CPoint point );rn afx_msg LRESULT OnNcHitTest( CPoint point );rn afx_msg BOOL OnSetCursor( CWnd* pWnd, UINT nHitTest, UINT message );rnrn DECLARE_MESSAGE_MAP()rn;rnrnrn#include "CMainWindow.h"rnrnBEGIN_MESSAGE_MAP(CMainWindow,CFrameWnd)rn ON_WM_MOUSEMOVE()rn ON_WM_LBUTTONDOWN()rn ON_WM_NCHITTEST()rn ON_WM_SETCURSOR()rnEND_MESSAGE_MAP()rnCMainWindow::CMainWindow()rnrn Create(NULL,L"");rn SetCapture();rnrnvoid CMainWindow::OnMouseMove(UINT nFlags,CPoint point)rnrn TRACE(L"x=%d\ty=%d\n",point.x,point.y);rn CFrameWnd::OnMouseMove(nFlags,point);rnrnrnvoid CMainWindow::OnLButtonDown( UINT nFlags, CPoint point )rnrn ::ReleaseCapture();rnrnrnBOOL CMainWindow::OnSetCursor( CWnd* pWnd, UINT nHitTest, UINT message )rnrn TRACE(L"OnSetCursor\n");rn return CFrameWnd::OnSetCursor(pWnd, nHitTest, message);rnrnrnLRESULT CMainWindow::OnNcHitTest( CPoint point )rnrn TRACE(L"OnNcHitTest\n");rn return CFrameWnd::OnNcHitTest(point);rnrnrn[/code] 论坛

没有更多推荐了,返回首页