对于Win32标头中的某些项,禁用光标更改为SizeWE

时间:2015-10-29 16:27:01

标签: winapi header cursor mouseenter

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

enter image description here

,但我更愿意看到这个:

enter image description here

我可以通过抑制WM_SETCURSOR消息来忽略游标更改,但问题是如何知道生成的标题项WM_SETCURSOR。我可以使用HDM_HITTEST消息在WM_MOUSEMOVE中检测鼠标指针下的项目,但WM_MOUSEMOVE仅在WM_SETCURSOR之后发送到窗口过程。我分析了Win32标头控件的所有通知消息,看起来,它没有相当于在WM_SETCURSOR之前发送到窗口过程的MouseEnter事件。

任何想法如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

如果尚未对标题控件进行子类化,则需要对其进行子类化。

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

// 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
}