MyException - 我的异常网
当前位置:我的异常网» VC/MFC » 请问关于windows滚动条最大长度的有关问题

请问关于windows滚动条最大长度的有关问题

www.MyException.Cn  网友分享于:2013-02-21  浏览:12次
请教关于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。那就 小很多

文章评论

软件开发程序错误异常ExceptionCopyright © 2009-2015 MyException 版权所有