我需要阻止调整Win32标头控件中某些项的大小。处理HDN_BEGINTRACK通知消息并取消它没问题 - 光标中的问题表明可以调整项目的大小。例如,如果第一项无法调整大小,我会看到:
,但我更愿意看到这个:
我可以通过抑制WM_SETCURSOR消息来忽略游标更改,但问题是如何知道生成的标题项WM_SETCURSOR。我可以使用HDM_HITTEST消息在WM_MOUSEMOVE中检测鼠标指针下的项目,但WM_MOUSEMOVE仅在WM_SETCURSOR之后发送到窗口过程。我分析了Win32标头控件的所有通知消息,看起来,它没有相当于在WM_SETCURSOR之前发送到窗口过程的MouseEnter事件。
任何想法如何解决这个问题?
答案 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
}