C++ C++;使用WM_LBUTTONDOWN时未触发WM_LBUTTONDOWN

C++ C++;使用WM_LBUTTONDOWN时未触发WM_LBUTTONDOWN,c++,windows,winapi,click,window,C++,Windows,Winapi,Click,Window,我正在使用win32创建一个带有自定义标题栏和边框的窗口。我的问题是,当我使用WM\u NCHITTESTWM\u LBUTTONDOWN时,单击事件不会触发。当我不使用WM\u NCHITTEST时,我收到点击事件。我没有得到任何错误 我已尝试删除WM\u nchitest中的代码,因此我只返回0。我已经尝试过删除WM\u NCHITTEST,然后WM\u LBUTTONDOWN工作,但我需要两者都工作 //Declaring before switch int x, y; RECT rect

我正在使用win32创建一个带有自定义标题栏和边框的窗口。我的问题是,当我使用
WM\u NCHITTEST
WM\u LBUTTONDOWN
时,单击事件不会触发。当我不使用
WM\u NCHITTEST
时,我收到点击事件。我没有得到任何错误

我已尝试删除
WM\u nchitest
中的代码,因此我只
返回0
。我已经尝试过删除WM\u NCHITTEST,然后WM\u 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...
//在切换之前声明
int x,y;
RECT-RECT;
int iTitlebarY=20;
案例WM_NCHITTEST:{
GetWindowRect(hwnd和&rect);
x=获取x_LPARAM(LPARAM);
y=获取y LPARAM(LPARAM);
如果(y来自消息

当用户在光标移动时按下鼠标左键时发布 在窗口的客户端区域中

将此与消息进行比较

当用户在光标移动时按下鼠标左键时发布 在窗口的非客户端区域内

但是windows的哪个部分是客户端区域?要确定此存在消息:

发送到窗口以确定窗口的哪个部分 对应于特定的屏幕坐标

只有当您返回
HTCLIENT
以响应
WM\u-NCHITTEST
时,您才可以在客户端区域进行操作。只有在这种情况下,您才能获得
WM\u-LBUTTONDOWN

但是您永远不会返回
HTCLIENT
来响应
WM\u NCHITTEST
——您总是返回0,这意味着
HTNOWHERE

因此,您需要调用
DefWindowProc
并返回它的值:

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

或者您自己以某种方式检测您的案例中的客户端区域,并在光标位于窗口的客户端区域时返回
HTCLIENT
,您需要在此处使用
DefWindowProc
函数返回值,或者在某个时间返回
HTCLIENT
WM_LBUTTONDOWN
仅在
HTCLIENT
返回时使用M_NCHITTEST
但您永远不会返回它