【问题标题】:Disable cursor changing to SizeWE for some items in Win32 header禁用 Win32 标头中某些项目的光标更改为 SizeWE
【发布时间】:2015-10-29 16:27:00
【问题描述】:

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

,但我更愿意看到这个:

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

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

【问题讨论】:

    标签: winapi header cursor mouseenter


    【解决方案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
    }
    

    【讨论】:

    • 我害怕这个 ;)。当然,我已经对控件进行了子类化,正如我所写的,我同时处理了 WM_SETCURSOR 和 WM_MOUSEMOVE。我在 WM_MOUSEMOVE 中使用几乎相同的代码来了解光标下的项目(类似于 MouseEnter/MouseLeave),正如我在您的回答后看到的那样,此功能将在 WM_SETCURSOR 中重复。你怎么看,我可以只在 WM_SETCURSOR 中确定当前的热门项目,并在 WM_MOUSEMOVE 中使用这个信息吗?
    • 而且我的测试表明在这段代码sn-p中没有必要使用SetCursor(LoadCursor(0, IDC_ARROW))。如果返回 TRUE,则光标保持为标准 IDC_ARROW,无需显式设置。
    • 根据MSDN的说法,WM_SETCURSOR在lParam的低位字中为我们提供了所谓的hit-test code。你知道它是什么吗?可以在我们的情况下使用它来简化编码吗?
    • WM_MOUSEMOVE 根本不应该参与其中。处理WM_SETCURSOR 将停止光标变化,处理HDN_BEGINTRACK 将阻止拖动发生。
    • 正如我所写的,我不仅为此使用 WM_MOUSEMOVE - 我还从其处理程序中为我们的标题项引发 MouseEnter/MouseLeave 事件。似乎,每次发送 WM_MOUSEMOVE 时都会发送 WM_SETCURSOR(尽管在它之前)。我们可以利用这个事实将所有这些逻辑移到 WM_SETCUSOR 的处理程序中吗?
    猜你喜欢
    • 1970-01-01
    • 2021-07-19
    • 1970-01-01
    • 1970-01-01
    • 2016-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多