以下是转自他人的SCROLLINFO的一些信息
在刚开始使用SCROLLINFO结构时感觉很不顺手,尤其其中的成员fMask理解不太深刻,经过查询资料才理解一二。
在使用滚动条功能时,如果要设置它的范围和位置可以用以前的函数,例如:SetScrollRange()、 SetScrollPos()、GetScrollRange()、GetScrollPos()等,但目前通常使用SetScrollInfo()与 GetScrollInfo(),使用这两个函数就要用到SCROLLINFO结构。
如果要设置滚动条的范围和页面大小时,可编写以下代码:
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<scrollinfo.nMin) 44 //{ 45 // if (m_bLineUp) 46 // { 47 // ScrollWindow(0,(20 * 5 + scrollinfo.nPos)); 48 // UpdateWindow(); 49 // m_bLineUp = FALSE; 50 // } 51 // scrollinfo.nPos = scrollinfo.nMin; 52 // SetScrollInfo(SB_VERT,&scrollinfo,SIF_ALL); 53 // break; 54 //} 55 //else 56 //{ 57 // SetScrollInfo(SB_VERT,&scrollinfo,SIF_ALL); 58 // ScrollWindow(0,20 * 5); 59 // UpdateWindow(); 60 // break; 61 //} 62 } 63 case SB_LINEDOWN: 64 { 65 if ((scrollinfo.nMax - (int)(scrollinfo.nPos + scrollinfo.nPage)) <= 0) 66 { 67 break; 68 } 69 else if ((scrollinfo.nMax - (int)(scrollinfo.nPos + scrollinfo.nPage)) >= 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<scrollinfo.nMin) 92 // { 93 // scrollinfo.nPos = scrollinfo.nMin; 94 // SetScrollInfo(SB_VERT,&scrollinfo,SIF_ALL); 95 // ScrollWindow(0,a); 96 // UpdateWindow(); 97 // break; 98 // } 99 // else 100 // { 101 // SetScrollInfo(SB_VERT,&scrollinfo,SIF_ALL); 102 // ScrollWindow(0,scrollinfo.nPage); 103 // UpdateWindow(); 104 // break; 105 // } 106 // } 107 //case SB_PAGEDOWN: 108 // { 109 // m_bLineUp = TRUE; 110 // UINT a = scrollinfo.nPos; 111 // scrollinfo.nPos += scrollinfo.nPage ; 112 // 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 // else 123 // { 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 }