以下是转自他人的SCROLLINFO的一些信息
在刚开始使用SCROLLINFO结构时感觉很不顺手,尤其其中的成员fMask理解不太深刻,经过查询资料才理解一二。
在使用滚动条功能时,如果要设置它的范围和位置可以用以前的函数,例如:SetScrollRange()、 SetScrollPos()、GetScrollRange()、GetScrollPos()等,但目前通常使用SetScrollInfo()与 GetScrollInfo(),使用这两个函数就要用到SCROLLINFO结构。
可以先定义一个SCROLLINFO结构变量si,用&si作为以上两个函数的参数。同BeginPaint()中的&ps、GetTextMetrics()中的&tm等,这些结构都是通过这些函数被填充各域或取得各域的值。BeginPaint是填充ps的各域的值,GetTextMetrics是取得tm结构各域的值,而 SetScrollInfo()与GetScrollInfo()分别填充和取得。
无论是Set还是Get,都得先设置si结构的第一个域的值,即赋给cbSize结构的大小。之后根据设置的fMask域的值进行Set或Get,当Set时,需要根据fMask的值将相关的域填充后再调用 SetScrollInfo(),这样si结构就被Set成功。当Get时,直接调用GetScrollInfo(),具体能使用哪些域的值是根据所设置的fMask域的值定的。
如果要设置滚动条的范围和页面大小时,可编写以下代码:
si.cbSize = sizeof (SCROLLINFO) ; si.cbMask = SIF_RANGE | SIF_PAGE ; si.nMin = 0 ; si.nMax = NUMLINES - 1 ; si.nPage = cyClient / cyChar ; SetScrollInfo (hwnd, SB_VERT, &si, TRUE) ;
而若要用到滚动条的位置时,可以这样使用:
先si.cbSize = sizeof (si) ; si.fMask = SIF_ALL ; // 表示Get后将使用si结构的位置、页面大小等量 GetScrollInfo (hwnd, SB_VERT, &si)然后就可直接使用si.nPos、si.nPage、si.nTrackPos等量,这些量就是从si结构中通过Get函数获得的,
成员说明:
cbSize: SCROLLINFO结构长度字节数,该值在设置和查询参数时都必须填写。fMask: 指定结构中的哪些成员是有效,该值共有如下5种选择,可以选择多种用“OR”组合起来,该值在设置和查询参数时都必须填写。SIF_ALL :整个结构都有效SIF_DISABLENOSCROLL:该值仅在设定参数时使用,视控件参数设定的需要来对本结构的成员进行取舍。SIF_PAGE :nPage成员有效SIF_POS :nPos成员有效SIF_RANGE :nMin和nMax成员有效nMin:滚动范围最小值nMax:滚动范围最大值nPage:页尺寸,用来确定比例滚动框的大小nPos:滚动框的位置nTrackPos:拖动时滚动框的位置,该参数只能查询,不能设置。
下面代买是给白板的属性面板做滚动条代码:
1、CWBFunctionAttributeDlg.h定义
SCROLLINFO m_si;//声明一个滚动条
void CWBFunctionAttributeDlg::OnSize(UINT nType, int cx, int cy)
{ CDialog::OnSize(nType, cx, cy);// TODO: 在此处添加消息处理程序代码
CRect FuncDlgRt; g_pWhiteBoardView->GetWBFunctionDlg()->GetClientRect(FuncDlgRt); CRect attrDlgRect; GetClientRect(attrDlgRect); //滚动条的信息设置 m_si.cbSize = sizeof (SCROLLINFO); m_si.fMask = SIF_ALL; m_si.nMin = 0; m_si.nMax =600;m_si.nPage = 200; //滚动条一整页的高度,在不同的长短
m_si.nPos = 0; SetScrollInfo(SB_VERT,&m_si,1); ShowScrollBar(SB_VERT,TRUE); if (FuncDlgRt.Height() > 500) { ShowScrollBar(SB_VERT,FALSE); } }1 void CWBFunctionAttributeDlg::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) 2 { 3 // TODO: 在此添加消息处理程序代码和/或调用默认值 4 SCROLLINFO scrollinfo; 5 GetScrollInfo(SB_VERT,&scrollinfo,SIF_ALL); 6 switch (nSBCode) 7 { 8 case SB_BOTTOM: 9 ScrollWindow(0,(scrollinfo.nPos-scrollinfo.nMax)); 10 UpdateWindow(); 11 scrollinfo.nPos = scrollinfo.nMax; 12 SetScrollInfo(SB_VERT,&scrollinfo,SIF_ALL); 13 break; 14 case SB_TOP: 15 ScrollWindow(0,(scrollinfo.nPos-scrollinfo.nMin)); 16 UpdateWindow(); 17 scrollinfo.nPos = scrollinfo.nMin; 18 SetScrollInfo(SB_VERT,&scrollinfo,SIF_ALL); 19 break; 20 case SB_LINEUP: 21 { 22 if (scrollinfo.nPos - scrollinfo.nMin == 0) 23 { 24 break; 25 } 26 else if (scrollinfo.nPos - scrollinfo.nMin < 20) 27 { 28 ScrollWindow(0,(scrollinfo.nPos - scrollinfo.nMin)); 29 scrollinfo.nPos = scrollinfo.nMin; 30 SetScrollInfo(SB_VERT,&scrollinfo,SIF_ALL); 31 break; 32 } 33 else if (scrollinfo.nPos - scrollinfo.nMin >= 20) 34 { 35 scrollinfo.nPos -= 20; 36 ScrollWindow(0,20); 37 UpdateWindow(); 38 SetScrollInfo(SB_VERT,&scrollinfo,SIF_ALL); 39 break; 40 } 41 //m_bLineDown = TRUE; 42 //scrollinfo.nPos -= 20; 43 //if (scrollinfo.nPos= 20) 70 { 71 scrollinfo.nPos += 20; 72 ScrollWindow(0,-20); 73 UpdateWindow(); 74 SetScrollInfo(SB_VERT,&scrollinfo,SIF_ALL); 75 break; 76 } 77 else if (scrollinfo.nMax - scrollinfo.nPos - scrollinfo.nPage < 20) 78 { 79 ScrollWindow(0,-(scrollinfo.nMax - scrollinfo.nPos) ); 80 UpdateWindow(); 81 scrollinfo.nPos = scrollinfo.nMax; 82 SetScrollInfo(SB_VERT,&scrollinfo,SIF_ALL); 83 break; 84 } 85 } 86 //case SB_PAGEUP: 87 // { 88 // m_bLineDown = TRUE; 89 // UINT a = scrollinfo.nPos; 90 // scrollinfo.nPos -= scrollinfo.nPage; 91 // if (scrollinfo.nPos (int)(scrollinfo.nMax - scrollinfo.nPage)) 113 // { 114 // int offset = 0;115 // offset = scrollinfo.nMax - scrollinfo.nPos ;116 // scrollinfo.nPos = scrollinfo.nMax;117 // SetScrollInfo(SB_VERT,&scrollinfo,SIF_ALL); 118 // ScrollWindow(0,-offset); 119 // UpdateWindow();120 // break; 121 // }122 // else123 // {124 // SetScrollInfo(SB_VERT,&scrollinfo,SIF_ALL); 125 // ScrollWindow(0,-((int)scrollinfo.nPage));126 // UpdateWindow();127 // break; 128 // } 129 // }130 case SB_ENDSCROLL: 131 break; 132 case SB_THUMBPOSITION: 133 break; 134 case SB_THUMBTRACK: 135 { 136 //校准137 int offset = (int)nPos -(int)scrollinfo.nPos;138 if (offset > 0)//向下移动139 {140 //if ( (nPos + scrollinfo.nPage) > scrollinfo.nMax )//越过最大值141 //{142 // offset = (scrollinfo.nMax -scrollinfo.nPage + 1) - scrollinfo.nPos;143 //}144 ScrollWindow(0,-offset); 145 UpdateWindow();146 scrollinfo.nPos = scrollinfo.nPos + offset; 147 SetScrollInfo(SB_VERT,&scrollinfo,SIF_ALL);148 }149 else if (offset < 0)150 {151 //if (nPos < scrollinfo.nMin)152 //{153 // offset = scrollinfo.nMin - scrollinfo.nPos;154 //}155 ScrollWindow(0,-offset); 156 UpdateWindow();157 scrollinfo.nPos = scrollinfo.nPos + offset; 158 SetScrollInfo(SB_VERT,&scrollinfo,SIF_ALL);159 } 160 break; 161 }162 }163 CDialog::OnVScroll(nSBCode, nPos, pScrollBar);164 }