case WM_NCHITTEST: {
LRESULT hit = DefWindowProc( hWnd, uMsg, wParam, lParam );
if ( hit == HTCLIENT ) {
hit = HTCAPTION;
SendNotifyMessageA( hWnd, WM_MOUSEMOVE, NULL, MAKELPARAM( LOWORD(lParam), HIWORD(lParam) ) );
pts.x = pts.y = 0;
ClientToScreen( hWnd, &pts );
SendNotifyMessageA( hWnd, WM_EXITSIZEMOVE, NULL,NULL );
return hit;
} } break;
case WM_NCLBUTTONDOWN: { LMB_Dyn[h2] = true; } break;
在尝试通过单击工作区(窗口中的任何位置)来移动窗口时,我正在使用此代码。这很好。
但是我在正确接收鼠标左键的状态时遇到问题,尽管这种代码有效,但问题是当我执行简单的单击而不是“单击并移动” LMB_Dyn
变量(鼠标左键)时有一些延迟(不会立即收到我按下鼠标按钮的通知。
在使用WM_NCHITTEST
时如何正确获取鼠标左键的状态?
答案 0 :(得分:2)
错误:} } break;
应该读为} return hit; }
但是,这里还有一些更根本的事情。 WM_NCHITTEST
并非要那样使用,而是可以使用当前鼠标位置以外的坐标来调用。这意味着您的SendNotifyMessageA
可以发送垃圾。
我看到您有一个WM_NCLBUTTONDOWN
处理程序。也许这就是您所需要的。或者,如果您要使窗口在其上的任何位置均可拖动,则应该像这样:
case WM_NCHITTEST: {
LRESULT hit = DefWindowProc( hWnd, uMsg, wParam, lParam );
if ( hit == HTCLIENT ) {
return HTCAPTION;
}
return hit;
}
WM_NCLBUTTONDOWN
和WM_NCLBUTTONUP
的文档称它们会立即触发。忘记您的InvalidateRect
通话非常容易,因此无需为您重新绘制屏幕,因此显示速度很慢。