使用WM_NCHITTEST时捕捉鼠标左键问题

时间:2019-05-26 03:47:12

标签: c winapi

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时如何正确获取鼠标左键的状态?

1 个答案:

答案 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_NCLBUTTONDOWNWM_NCLBUTTONUP的文档称它们会立即触发。忘记您的InvalidateRect通话非常容易,因此无需为您重新绘制屏幕,​​因此显示速度很慢。