给白板属性窗口设置滚动条

以下是转自他人的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<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  }
View Code
原文地址:https://www.cnblogs.com/lisuyun/p/3446623.html