关于滚动条

来源:互联网 发布:windows server 97 编辑:程序博客网 时间:2024/06/05 19:14

    最近在做个MFC应用程序,学了不少东西,把学到的写下来,一是与大家分享,另外以后忘了的话还可以来看看,温习一下。

    先说说这两天搞的关于滚动条的操作吧!

 

    写之前说明一下,这个例子是将一个文本文件在屏幕上显示出来,其中m_vecFileBuf中存放的是被显示文件的内容,每行作为一条记录,m_LongLine是该文件中最长一行的字符数,StartDraw()函数就是画图写字部分了。m_iCurLine,m_iCurCol分别是当前行数和列数。

 

    1.定义CScrollBar对象

       CScrollBar m_verScroll;        //垂直滚动条

       CScrollBar m_horScroll;        //水平滚动条

      这里定义了两个滚动条对象,一个垂直滚动条,一个水平滚动条

 

    2. 使用Create方法创建滚动条

       //获取区域坐标

      CRect rectClient;
      GetClientRect( &rectClient );

      //创建滚动条,分别在区域右侧和下方显示垂直滚动条和水平滚动条
      UINT nIDver = IDC_VERTSCROLL;
      UINT nIDhor = IDC_HORZSCROLL;
      m_verScroll.Create( SBS_VERT |SBS_LEFTALIGN ,
        CRect(rectClient.right-15, rectClient.top, rectClient.right, rectClient.bottom-15), this, nIDver);   
      m_horScroll.Create( SBS_HORZ |SBS_TOPALIGN ,
        CRect(rectClient.left, rectClient.bottom-15, rectClient.right-15, rectClient.bottom), this, nIDhor);

 

    3.设置滚动条信息

       //设置垂直滚动条信息
    SCROLLINFO   sif; 
    sif.cbSize = sizeof(SCROLLINFO); 
    sif.fMask = SIF_RANGE|SIF_PAGE; 
    sif.nMin = 0; 
    sif.nMax = m_vecFileBuf.size(); 
    sif.nPage = rectClient.Height()/16; 
    m_verScroll.SetScrollInfo(&sif);

    //设置水平滚动条信息
    SCROLLINFO   sifhor; 
    sifhor.cbSize = sizeof(SCROLLINFO); 
    sifhor.fMask = SIF_RANGE |SIF_PAGE; 
    sifhor.nMin = 0; 
    sifhor.nMax = m_LongLine/5+1;
    sifhor.nPage = rectClient.Width()/40;    //5个字符,每个字符8个像素 
    m_horScroll.SetScrollInfo(&sifhor);

 

    4. 显示滚动条

      m_verScroll.ShowScrollBar();
      m_horScroll.ShowScrollBar();

 

    5. 创建完成开始操作

       5.1 垂直滚动条

          OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
         {
          switch(nSBCode)
         {
           //向上滚动一行
            case SB_LINEUP:
            {
                m_iCurLine --;
                if( m_iCurLine < 0 )
                {
                    m_iCurLine = 0;
                }
                StartDraw();
            }
            break;
           //向下滚动一行
           case SB_LINEDOWN:
            {
                m_iCurLine ++;
                if( m_iCurLine >= (int)m_vecFileBuf.size() )
                {
                    m_iCurLine = 0;
                }
                StartDraw();               
            }
            break;
           //向前翻页
           case SB_PAGEUP:
            {
                //获取当前区域
                CRect rc;
                GetClientRect(&rc);

                m_iCurLine -= rc.Height()/16;
                if ( m_iCurLine < 0 )
                {
                    m_iCurLine = 0;
                }
                StartDraw();
            }
            break;
           //向后翻页
           case SB_PAGEDOWN:
            {
                CRect rc;
                GetClientRect( &rc );

                m_iCurLine += rc.Height()/16;
                if ( m_iCurLine >= (int)m_vecFileBuf.size() )
                {
                    m_iCurLine = 0;
                }
                StartDraw();
            }
            break;
           //拖动滚动框到指定位置,当前位置在nPos中指定
           case SB_THUMBTRACK:
            {
                m_iCurLine = nPos;
                if ( m_iCurLine >= (int)m_vecFileBuf.size() )
                {
                    m_iCurLine = 0;
                }
                StartDraw();
            }
            break;
           //滚动到一个绝对位置,当前位置在nPos中指定
           case SB_THUMBPOSITION:
            {
            }
            break;
          default:
            break;
       }
   
        //设置滑块位置
        m_verScroll.SetScrollPos( m_iCurLine, TRUE );

        CDialog::OnVScroll( nSBCode, nPos, pScrollBar );
       }

 

    5.2 水平滚动条

       OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
      {
         switch(nSBCode)
        {
        //左移一列(5个字符)
        case SB_LINELEFT:
        {
            m_iCurCol --;
            if( m_iCurCol < 0 )
            {
                m_iCurCol = 0;
            }
            StartDraw();
        }
        break;
       //右移一列
       case SB_LINERIGHT:
        {
            m_iCurCol ++;
            if( m_iCurCol >= m_LongLine/5+1 )
            {
                m_iCurCol = 0;
            }
            StartDraw();       
        }
        break;
       //左移一页(4列)
       case SB_PAGEUP:
        {
            m_iCurCol -=4;
            if( m_iCurCol < 0 )
            {
                m_iCurCol = 0;
            }
            StartDraw();
        }
        break;
       //右移一页
       case SB_PAGEDOWN:
        {
            m_iCurCol +=4;
            if( m_iCurCol >= m_LongLine/5+1 )
            {
                m_iCurCol = 0;
            }
            StartDraw();
        }
        break;
       case SB_THUMBTRACK:
        {
            m_iCurCol = nPos;
            if ( m_iCurCol >= m_LongLine/5+1 )
            {
                m_iCurCol = 0;
            }
            StartDraw();
        }
        break;
      default:
        break;
     }

      //设置滑块位置
       m_horScroll.SetScrollPos(m_iCurCol, TRUE);

       CDialog::OnHScroll(nSBCode, nPos, pScrollBar);
     }

 

    先写这么多吧,我也只是看了些许皮毛,有更多问题再慢慢讨论。

 

原创粉丝点击