SetScrollRange

本文详细介绍了SetScrollRange函数的功能及用法,包括如何通过该函数设置滚动条的最大最小值,参数详解及其返回值意义。此外,还提供了注意事项,如如何正确地隐藏滚动条等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

函数功能:该函数设置所指定滚动条位置的最大最小值。
  函数原型:BOOL SetScrollRange(HWND hWnd,int nBar,int nMinPos,int nMaxPos,BOOL bRedraw);
  参数:
  hWnd:滚动条控制或带有标准滚动条窗体的句柄,由nBar参数值确定。
  nBar:指定滚动条将被设置。这个参数可以是下面值,含义如下:
  SB_CTL:设置滚动条控制的范围。而参数hwnd必须是滚动条控制的句柄。
  SB_HORZ:设置窗体上标准水平滚动翻页盒的范围。
  SB_VERT:设置窗体上标准垂直滚动翻页盒的范围。
  nMinPos:指定滚动位置的最小值。
  nMaxPos:指定滚动位置的最大值。
  bRedraw:指定滚动条是否被重画以反映变化。如果这个参数为TRUE,滚动条将被重化;如果为FALSE则不被重画。
  返回值:如果函数运行成功,返回值为非零;如果函数运行失败,返回值为零。若想获得更多的错误信息,请调用GetLastError函数。
  注意:可以使用setScrollRange函数把nMinPos和nMaxPos设置为一样的值从而隐藏起滚动条。在处理滚动条消息时,应用程序可以不用调用函数SetScrollRange来隐藏滚动条。新的应用程序使用函数ShowScrollBar来隐藏滚动条。
  如果调用函数SetScrollPos之后马上调用函数SetScrollRange,则SetScrollPos中的bRedraw参数一定为零,以防止滚动条被画两次。
  标准滚动条的缺省范围时0到100。滚动条控制的缺省值为NULL(参数nMinPos和nMaxPos的值均为零)。两个范围值之间的不同之处在于由参数nMinPos和nMaxPos指定的值不能超过MAXLONG的值。
  因为说明滚动条位置的消息WM_HSCROLL和 WM_VSCROLL只能为16位数据,那些只依赖于说明位置数据消息的应用程序在函数SetScrollRange的参数nMaxPos中有一个实际最大值65,535。但是,因为函数SetScrolllnfo,SetScrollPos, SetScrollRange,GetScrolllnfo,GetScrollPos,和GetScrollRange都支持32位的滚动条位置数据,所以有一个解决16位WM_HSCROLL和WM_VSCROLL消息阻碍的途径,请参见函数GetScrolllnfo的有关技术说明。
  速查:Windows NT 3.1、Windows CE 2.0以上,头文件:winuser.h;库文件:user32.lib。
``` m_idTopLeftCell.row = -1; if (!m_bAllowDraw || !::IsWindow(GetSafeHwnd())) return; CRect rect; // This would have caused OnSize event - Brian //EnableScrollBars(SB_BOTH, FALSE); GetClientRect(rect); if (rect.left == rect.right || rect.top == rect.bottom) return; if (IsVisibleVScroll()) rect.right += GetSystemMetrics(SM_CXVSCROLL) + GetSystemMetrics(SM_CXBORDER); if (IsVisibleHScroll()) rect.bottom += GetSystemMetrics(SM_CYHSCROLL) + GetSystemMetrics(SM_CYBORDER); rect.left += GetFixedColumnWidth(); rect.top += GetFixedRowHeight(); if (rect.left >= rect.right || rect.top >= rect.bottom) { EnableScrollBarCtrl(SB_BOTH, FALSE); return; } CRect VisibleRect(GetFixedColumnWidth(), GetFixedRowHeight(), rect.right, rect.bottom); CRect VirtualRect(GetFixedColumnWidth(), GetFixedRowHeight(), GetVirtualWidth(), GetVirtualHeight()); // Removed to fix single row scrollbar problem (Pontus Goffe) // CCellRange visibleCells = GetUnobstructedNonFixedCellRange(); // if (!IsValid(visibleCells)) return; //TRACE(_T("Visible: %d x %d, Virtual %d x %d. H %d, V %d\n"), // VisibleRect.Width(), VisibleRect.Height(), // VirtualRect.Width(), VirtualRect.Height(), // IsVisibleHScroll(), IsVisibleVScroll()); // If vertical scroll bar, horizontal space is reduced if (VisibleRect.Height() < VirtualRect.Height()) VisibleRect.right -= ::GetSystemMetrics(SM_CXVSCROLL); // If horz scroll bar, vert space is reduced if (VisibleRect.Width() < VirtualRect.Width()) VisibleRect.bottom -= ::GetSystemMetrics(SM_CYHSCROLL); // Recheck vertical scroll bar //if (VisibleRect.Height() < VirtualRect.Height()) // VisibleRect.right -= ::GetSystemMetrics(SM_CXVSCROLL); if (VisibleRect.Height() < VirtualRect.Height()) { EnableScrollBars(SB_VERT, TRUE); m_nVScrollMax = VirtualRect.Height() - 1; } else { EnableScrollBars(SB_VERT, FALSE); m_nVScrollMax = 0; } if (VisibleRect.Width() < VirtualRect.Width()) { EnableScrollBars(SB_HORZ, TRUE); m_nHScrollMax = VirtualRect.Width() - 1; } else { EnableScrollBars(SB_HORZ, FALSE); m_nHScrollMax = 0; } ASSERT(m_nVScrollMax < INT_MAX && m_nHScrollMax < INT_MAX); // This should be fine /* Old code - CJM SCROLLINFO si; si.cbSize = sizeof(SCROLLINFO); si.fMask = SIF_PAGE; si.nPage = (m_nHScrollMax>0)? VisibleRect.Width() : 0; SetScrollInfo(SB_HORZ, &si, FALSE); si.nPage = (m_nVScrollMax>0)? VisibleRect.Height() : 0; SetScrollInfo(SB_VERT, &si, FALSE); SetScrollRange(SB_VERT, 0, m_nVScrollMax, TRUE); SetScrollRange(SB_HORZ, 0, m_nHScrollMax, TRUE); */ // New code - Paul Runstedler SCROLLINFO si; si.cbSize = sizeof(SCROLLINFO); si.fMask = SIF_PAGE | SIF_RANGE; si.nPage = (m_nHScrollMax>0)? VisibleRect.Width() : 0; si.nMin = 0; si.nMax = m_nHScrollMax; SetScrollInfo(SB_HORZ, &si, TRUE); si.fMask |= SIF_DISABLENOSCROLL; si.nPage = (m_nVScrollMax>0)? VisibleRect.Height() : 0; si.nMin = 0; si.nMax = m_nVScrollMax; SetScrollInfo(SB_VERT, &si, TRUE);```分析这段代码
03-26
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值