我正在使用win32创建带有自定义titlbar和边框的窗口。我的问题是,当我使用WM_NCHITTEST时,WM_LBUTTONDOWN不会在单击事件时触发。不使用WM_NCHITTEST时会收到单击事件。我没有任何错误。

我试图删除WM_NCHITTEST中的代码,所以我只删除return 0。我试过删除WM_NCHITTEST,然后WM_LBUTTONDOWN可以工作,但我都需要工作。

//Declaring before switch
int x, y;
RECT rect;
int iTitlebarY = 20;

case WM_NCHITTEST: {
        GetWindowRect(hwnd, &rect);

        x = GET_X_LPARAM(lParam);
        y = GET_Y_LPARAM(lParam);

        if (y <= rect.top + iTitlebarY) {
            return HTCAPTION;
        }
        //Some more code for resizing...

        return 0;
        }

    case WM_LBUTTONDOWN:
        //Never gets triggered
        //Do something...

我希望我能收到鼠标单击的声音,因为当我不使用WM_NCHITTEST时会这样做。

最佳答案

来自 WM_LBUTTONDOWN 消息



将此与 WM_NCLBUTTONDOWN 消息进行比较



但是Windows的哪一部分是客户区域?确定是否存在 WM_NCHITTEST 消息:



仅当您返回HTCLIENT以响应WM_NCHITTEST时-您在客户区域中。只有在这种情况下,您才得到WM_LBUTTONDOWN
但是您永远不会返回HTCLIENT来响应WM_NCHITTEST-您总是返回0,这意味着HTNOWHERE
因此,您需要调用HTNOWHERE并返回其值,而不是返回DefWindowProc:

//return HTNOWHERE;
return DefWindowProc(hWnd, Msg, wParam, lParam);

或您自己以某种方式检测到您的客户区是什么,并在光标位于窗口的客户区中时返回HTCLIENT

10-07 15:34