请教关于windows滚动条最大长度的问题?
本帖最后由 scrrr888999 于 2013-01-26 15:49:41 编辑
case AfxSig_SCROLL_REFLECT:
{
// special case for WM_VSCROLL and WM_HSCROLL
ASSERT(message == WM_VSCROLL || message == WM_HSCROLL ||
message == WM_VSCROLL+WM_REFLECT_BASE || message == WM_HSCROLL+WM_REFLECT_BASE);
int nScrollCode = (short)LOWORD(wParam);
int nPos = (short)HIWORD(wParam);
if (lpEntry->nSig == AfxSig_SCROLL)
(this->*mmf.pfn_v_u_u_W)(nScrollCode, nPos,
CWnd::FromHandle(reinterpret_cast<HWND>(lParam)));
else
(this->*mmf.pfn_v_u_u)(nScrollCode, nPos);
}
break;
请重点看下红色部分代码,因为我的滚动条设置长度比较大,我设置为:min:0 max:37565。这样当我拖动滚动条往下移动时,只要消息参数wParam高两个字节超过0x8000时,及最高位为1时,这时:
int nPos = (short)HIWORD(wParam);
这句代码执行后 nPos = 0xffff8000, 及nPos的高两个字节全部变成0xffff了,这样直接导致我传出去值无限大出错,但是只要消息参数wParam高两个字节不超过0x8000时,nPos高两个字节为0x0000,即为正常的,谁能帮我看一下这个问题是什么原因?
再问下滚动条位置只有两个字节传输,这样岂不是滚动条最大长度不能超过65536?
举个例子吧
即 当 wParam = 0x83140005;
int nPos = (short)HIWORD(wParam);
经过这步代码 nPos = 0xffff8314;
而 当 wParam = 0x73140005;
int nPos = (short)HIWORD(wParam);
经过这步代码 nPos = 0x00007314;
第二个是正确的,为什么第一个会是 0xffff8314,而不是0x00008314呢?
滚动条
windows
------解决方案--------------------MSDN 说最大65536:
Because the messages that indicate scroll bar position, WM_HSCROLL and WM_VSCROLL, are limited to 16 bits of position data, applications that rely solely on those messages for position data have a practical maximum value of 65,535 for the SetScrollRange function's nMaxPos parameter.
别用short, 用unsigned short
------解决方案--------------------min:0 max:37565
这是按pixel 算的吧,
改成 按 item 算 如 listbox 一个 item 12 pixel。那就 小很多