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


    以下是转自他人的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
  • 相关阅读:
    luogu P1340 兽径管理
    luogu P2828 Switching on the Lights(开关灯)
    luogu P1462 通往奥格瑞玛的道路
    codevs 2596 售货员的难题
    luogu P1145 约瑟夫
    luogu P1395 会议
    luogu P1041 传染病控制
    luogu P1198 [JSOI2008]最大数
    codevs 1191 数轴染色
    [POJ1082]Calendar Game
  • 原文地址:https://www.cnblogs.com/lisuyun/p/3446623.html
Copyright © 2020-2023  润新知