2013-03-18 124 views
-1

由于某些原因,使用SetCapture函数会导致PtInRect()函数无效!Setcapture导致PtInRect故障?

下面是一些代码:

POINT curmouse; 
RECT testrect = {0, 0, 200, 200}; 

WM_LBUTTONDOWN: 
if (MK_LBUTTONDOWN == true) 
SetCapture(hWnd); 
break; 

WM_MOUSEMOVE: 
curmouse.x = LOWORD(lParam); 
curmouse.y = HIWORD(lParam); 

WM_LBUTTONUP: 
if (PtInRect(&testrect , curmouse)) 
//Draw Image 

请注意:我没有拨打电话以释放WM_LBUTTONUP捕获。事实上,releasecapture从来没有被称为!

如果我没有调用setcapture,那么ptinrect在鼠标释放时按预期工作。

有人可以告诉我如何得到ptinrect与setcapture()被调用?

最重要的是,这个程序中有两个独立的窗口。第一个窗口名为bg_window,第二个窗口名为other_window。

+2

您将鼠标捕捉到哪个窗口?捕获鼠标时获得的坐标将与捕获鼠标的窗口的客户区相关。 – 2013-03-18 23:41:00

回答

2

您只在WM_MOUSEMOVE上初始化curmouse而不是WM_LBUTTONUP - 因此,当您实际获得按钮时,其中的值将是随机的。

+0

不应有任何理由不使用LPARAM中传递给[WM_LBUTTONUP]的光标坐标(http://msdn.microsoft.com/en-us/library/windows/desktop/ms645608(v = vs.85 )的.aspx)。 – 2013-03-18 23:10:50

+0

这是事情。当没有调用SetCapture()时,在WM_MOUSEMOVE工作中分配给curmouse的值,也就是说,程序认识到鼠标实际上在rect中释放(所以WM_LBUTTONUP上的curmouse中的值不是随机的)。但是,当调用SetCapture()时,程序不再识别鼠标在矩形中。 – 2013-03-18 23:16:39

+0

@ Mark,当调用SetCapture()时,发送到WM_LBUTTONUP上的lParam的鼠标坐标也不起作用。 – 2013-03-18 23:18:43

0

SetCapture()将鼠标消息限制到您传递句柄的窗口。除非您调用ReleaseCapture(),否则无法解释其他窗口上的鼠标消息。使用SetCapture()并从不调用ReleaseCapture()不是一种好的编程习惯。

如果您的房委会在另一个窗口PtInrect不会正常工作。 另外如果你想知道用户是否点击了矩形区域,你可以使用你在WM_LBUTTONDOWN消息中得到的鼠标点。