使用自定义光标强制 WM_NCHITTEST 返回 HTCAPTION..?

4 c++ user-interface winapi message mouse-cursor

我创建了一个无边框窗口,它使用wndProc()强制WM_NCHITTEST casereturn 的函数HTCAPTION;,该函数允许用户拖动窗口,无论光标位于何处。
问题是我已经设置了自定义光标,但是使用上述方法,光标始终设置回IDC_ARROW
我该如何解决?

编辑:我也尝试过SetCursor()在 中使用WM_NCHITTEST case,但没有成功。

Han*_*ant 5

您可以使用 WM_SETCURSOR 消息来覆盖光标。lParam 的 LOWORD 指示命中测试代码,即您使用 WM_NCHITTEST 处理程序更改的代码。这效果很好:

static HCURSOR CustomCursor;

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)
    {
    case WM_NCHITTEST: {
        LRESULT result = DefWindowProc(hWnd, message, wParam, lParam);
        if (result == HTCLIENT) result = HTCAPTION;             
        return result;
    }
    case WM_SETCURSOR: 
        if (LOWORD(lParam) == HTCAPTION) {
            SetCursor(CustomCursor);
            return TRUE;
        }
        return DefWindowProc(hWnd, message, wParam, lParam);
    // etc...
}
Run Code Online (Sandbox Code Playgroud)

在窗口初始化中初始化 CustomCursor。说:

CustomCursor = LoadCursor(hInstance, MAKEINTRESOURCE(IDC_SIZEALL));
Run Code Online (Sandbox Code Playgroud)