2013-03-18 102 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消息中得到的鼠標點。