我知道这是一个非常古老的东西,但我为此感到不知所措。有人知道为什么会这样吗?
说,通过WM_NCHITTEST
-> WM_NCLBUTTONDOWN
-> WM_SYSCOMMAND
-> WM_HSCROLL
或WM_VSCROLL
传播滚动条鼠标单击通知时,此链中的所有参数似乎都遵循文档,但 SC_HSCROLL
的SC_VSCROLL
和WM_SYSCOMMAND
除外。因此,如果我这样做:
//From within WndProc
if(message == WM_SYSCOMMAND)
{
UINT uiCmd = wParam & 0xFFF0;
if(uiCmd == SC_HSCROLL)
{
TRACE(L"Horiz scroll\n");
}
else if(uiCmd == SC_VSCROLL)
{
TRACE(L"Vertical scroll\n");
}
}
我似乎收到有关水平的垂直通知,反之亦然。
这是Spy ++的证明。如果单击此向下箭头:
这些是窗口收到的通知:
除
SC_HSCROLL
外,其他所有方法均正确。 WTF? 最佳答案
如果在调试器下查找__int64 OnDwpNcLButtonDown(CThhemeWnd*, THEME_MSG*)
,则可见下一个代码:
wParam = HTVSCROLL != HitTest ? SC_VSCROLL : SC_HSCROLL;
SendMessage(*, WM_SYSCOMMAND, (wParam | HitTest), *)
从这一点发送的带有
WM_SYSCOMMAND
或SC_VSCROLL
的SC_HSCROLL
,但是明显的代码包含逻辑错误-SC_VSCROLL
和SC_HSCROLL
混淆了。正确的代码必须是
wParam = HTVSCROLL == HitTest ? SC_VSCROLL : SC_HSCROLL;
也
在这里可见,在四个低位位,我们从
WM_NCLBUTTONDOWN
消息命中了测试代码,这是从 WM_NCHITTEST
消息返回的0xf087
-这是SC_HSCROLL | HTVSCROLL
,当在hscroll上我们得到0xf076
,它是SC_VSCROLL | HTHSCROLL
这只是
uxtheme.OnDwpNcLButtonDown
中的Windows错误