禁用 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
}
我需要防止在 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
}