禁用 Win32 中某些项目的光标更改为 SizeWE header

Disable cursor changing to SizeWE for some items in Win32 header

我需要防止在 Win32 header 控件中调整某些项目的大小。处理 HDN_BEGINTRACK 通知消息并取消它没有问题 - 问题出在指示项目可以调整大小的光标中。例如,如果无法调整第一项的大小,我会看到:

,但我更愿意看到这个:

我可以通过抑制 WM_SETCURSOR 消息来忽略光标更改,但问题是如何知道 header 项 WM_SETCURSOR 是为生成的。我可以使用 HDM_HITTEST 消息检测 WM_MOUSEMOVE 中鼠标指针下的项目,但是 WM_MOUSEMOVE 仅在 WM_SETCURSOR 之后才发送到 window 过程。我分析了 Win32 header 控件的所有通知消息,它​​似乎没有等效于在 WM_SETCURSOR.[=13 之前发送到 window 过程的 MouseEnter 事件=]

有什么解决这个问题的想法吗?

您需要 sub-class header 控件(如果您还没有的话)。

在sub-class中拦截WM_SETCURSOR消息,用GetMessagePos()获取鼠标坐标。这些是屏幕坐标,因此您需要将它们转换为客户端坐标以进行 header 控件命中测试。

// in the window sub-class
if (uMsg == WM_SETCURSOR)
{
    DWORD dwPos = GetMessagePos();
    HDHITTESTINFO hti;
    hti.pt.x = GET_X_LPARAM(dwPos);
    hti.pt.y = GET_Y_LPARAM(dwPos);
    ScreenToClient(hWnd, &hti.pt);
    SendMessage(hWnd, HDM_HITTEST, 0, reinterpret_cast<LPARAM>(&hti));

    if (...) // test for items we want to block
    {
        SetCursor(LoadCursor(0, IDC_ARROW));
        return TRUE;
    }

    // pass through to regular WndProc
}