【问题标题】:C++ WM_LBUTTONDOWN not triggering when using WM_NCHITTEST使用 WM_NCHITTEST 时未触发 C++ WM_LBUTTONDOWN
【发布时间】:2020-01-16 11:03:52
【问题描述】:

我正在使用 win32 创建一个带有自定义标题栏和边框的窗口。我的问题是,当我使用 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 时会收到。

【问题讨论】:

  • 这里需要DefWindowProc函数返回的返回值,或者有时返回HTCLIENTWM_LBUTTONDOWN 只会在 HTCLIENTWM_NCHITTEST 返回但你永远不会返回时出现

标签: c++ windows winapi click window


【解决方案1】:

来自WM_LBUTTONDOWN的消息

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

将此与WM_NCLBUTTONDOWN 消息进行比较

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

但是窗口的哪一部分是客户区?确定这个存在WM_NCHITTEST消息:

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

仅当您返回HTCLIENT 以响应WM_NCHITTEST - 您在客户区。只有在这种情况下你才会得到WM_LBUTTONDOWN

但你永远不会返回 HTCLIENT 以响应 WM_NCHITTEST - 你总是返回 0,这意味着 HTNOWHERE

所以改为返回 HTNOWHERE 你需要调用 DefWindowProc 并返回它的值:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-19
    相关资源
    最近更新 更多