none
word中的滚动条和标尺按钮 RRS feed

  • 问题

  • word中的滚动条和标尺按钮,如图,滚动条上边的那个显示尺子的图标和下面的前一页、下一页以及选择浏览对象图标,是button吗?不是button,那是什么?C++程序中如何实现这样的滚动条?
    2013年8月13日 2:52

答案

  • 那我在程序中只能自绘滚动视图了,标尺、滚动条和导航栏这些图标?实现起来比较麻烦哦

    这三个控件实现起来不难,难的是滚动视图,你需要关联视图和滚动条,主要是如何在视图和滚动条之间映射比例的问题。

    应该有第三方的控件可以直接使用,可能要付费。免费的话,你可以去某些源码网站找找。

    2013年8月13日 3:19
  • 你好:
    在MFC中,滚动条(CScrollBar)控件可以实现你想要的功能。这边给你找到了一个有用的链接:

    http://hi.baidu.com/3582077/item/bb76bb564dc8589609be1721

    你也可以参考这个例子:
    创建滚动条

    SCROLLINFO info;
    ZeroMemory( &info, sizeof(SCROLLINFO) );
    GetScrollInfo( SB_VERT, &info );
    info.cbSize = sizeof(SCROLLINFO);
    info.fMask = SIF_ALL;
    info.nMin = 0; 
    info.nMax = m_vFileItem.size()*100; 
    info.nPage =y1-30;
    info.nPos  = 0;
    SetScrollInfo( SB_VERT, &info, TRUE );
    m_bVScroll=true;   //在Onsize中使用

    滚动条消息处理

    void CFileTransDlg::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
    {
     // TODO: 在此添加消息处理程序代码和/或调用默认值 
     int nDelta;
     int nMaxPos = m_vFileItem.size()*100;
     switch (nSBCode)
     {
     case SB_LINEDOWN:
         if(m_nScrollPos + m_nCurHeight>= nMaxPos)
        return;
      nDelta = min(max(nMaxPos/20,5),nMaxPos-m_nScrollPos);
      break;
     case SB_LINEUP:
      if (m_nScrollPos <= 0)
       return;
      nDelta = -min(max(nMaxPos/20,5),m_nScrollPos);
      break;
     case SB_PAGEDOWN:
      if (m_nScrollPos >= nMaxPos)
       return;
      nDelta = min(max(nMaxPos/10,5),nMaxPos-m_nScrollPos);
      break;
     case SB_THUMBTRACK:
     case SB_THUMBPOSITION:
      nDelta = (int)nPos - m_nScrollPos;
      break;
     case SB_PAGEUP:
      if (m_nScrollPos <= 0)
       return;
      nDelta = -min(max(nMaxPos/10,5),m_nScrollPos);
      break; 
         default:
      return;
     } 
      m_nScrollPos += nDelta;
     SetScrollPos(SB_VERT,m_nScrollPos,TRUE);
     ScrollWindow(0,-nDelta);
      CDialog::OnVScroll(nSBCode, nPos, pScrollBar);
    }

    OnSize 消息处理

    void CFileTransDlg::OnSize(UINT nType, int cx, int cy)
    {
     CDialog::OnSize(nType, cx, cy);
     // TODO: 在此处添加消息处理程序代码
        m_nCurHeight = cy;
     if(m_bVScroll)
     {
      SCROLLINFO info;
      ZeroMemory( &info, sizeof(SCROLLINFO) );
      GetScrollInfo( SB_VERT, &info );
      info.cbSize = sizeof(SCROLLINFO);
      info.fMask = SIF_ALL;
      info.nMin = 0;
      info.nMax = m_vFileItem.size()*100;
      info.nPage =cy-30;
      info.nPos  = 0;
      SetScrollInfo( SB_VERT, &info, TRUE );  
     }  
    }
    


    Sunny Cao
    MSDN Community Support | Feedback to us
    Develop and promote your apps in Windows Store
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2013年8月14日 4:29
    版主

全部回复

  • 可以是BUTTON,也可以不是。

    具体来讲,你提到的滚动条上下的两个控件都是:MsoCommandBar,通过自绘制呈现出多种样式和实现多种功能。

    所以这是三个控件的组合:MsoCommandBar(标尺),NUIScrobar(滚动条),MsoCommandBar(导航栏)。

    实现的方式,就是需要你自绘制,需要你自绘滚动视图。

    2013年8月13日 2:58
  • 那我在程序中只能自绘滚动视图了,标尺、滚动条和导航栏这些图标?实现起来比较麻烦哦
    2013年8月13日 3:15
  • 那我在程序中只能自绘滚动视图了,标尺、滚动条和导航栏这些图标?实现起来比较麻烦哦

    这三个控件实现起来不难,难的是滚动视图,你需要关联视图和滚动条,主要是如何在视图和滚动条之间映射比例的问题。

    应该有第三方的控件可以直接使用,可能要付费。免费的话,你可以去某些源码网站找找。

    2013年8月13日 3:19
  • 你好:
    在MFC中,滚动条(CScrollBar)控件可以实现你想要的功能。这边给你找到了一个有用的链接:

    http://hi.baidu.com/3582077/item/bb76bb564dc8589609be1721

    你也可以参考这个例子:
    创建滚动条

    SCROLLINFO info;
    ZeroMemory( &info, sizeof(SCROLLINFO) );
    GetScrollInfo( SB_VERT, &info );
    info.cbSize = sizeof(SCROLLINFO);
    info.fMask = SIF_ALL;
    info.nMin = 0; 
    info.nMax = m_vFileItem.size()*100; 
    info.nPage =y1-30;
    info.nPos  = 0;
    SetScrollInfo( SB_VERT, &info, TRUE );
    m_bVScroll=true;   //在Onsize中使用

    滚动条消息处理

    void CFileTransDlg::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
    {
     // TODO: 在此添加消息处理程序代码和/或调用默认值 
     int nDelta;
     int nMaxPos = m_vFileItem.size()*100;
     switch (nSBCode)
     {
     case SB_LINEDOWN:
         if(m_nScrollPos + m_nCurHeight>= nMaxPos)
        return;
      nDelta = min(max(nMaxPos/20,5),nMaxPos-m_nScrollPos);
      break;
     case SB_LINEUP:
      if (m_nScrollPos <= 0)
       return;
      nDelta = -min(max(nMaxPos/20,5),m_nScrollPos);
      break;
     case SB_PAGEDOWN:
      if (m_nScrollPos >= nMaxPos)
       return;
      nDelta = min(max(nMaxPos/10,5),nMaxPos-m_nScrollPos);
      break;
     case SB_THUMBTRACK:
     case SB_THUMBPOSITION:
      nDelta = (int)nPos - m_nScrollPos;
      break;
     case SB_PAGEUP:
      if (m_nScrollPos <= 0)
       return;
      nDelta = -min(max(nMaxPos/10,5),m_nScrollPos);
      break; 
         default:
      return;
     } 
      m_nScrollPos += nDelta;
     SetScrollPos(SB_VERT,m_nScrollPos,TRUE);
     ScrollWindow(0,-nDelta);
      CDialog::OnVScroll(nSBCode, nPos, pScrollBar);
    }

    OnSize 消息处理

    void CFileTransDlg::OnSize(UINT nType, int cx, int cy)
    {
     CDialog::OnSize(nType, cx, cy);
     // TODO: 在此处添加消息处理程序代码
        m_nCurHeight = cy;
     if(m_bVScroll)
     {
      SCROLLINFO info;
      ZeroMemory( &info, sizeof(SCROLLINFO) );
      GetScrollInfo( SB_VERT, &info );
      info.cbSize = sizeof(SCROLLINFO);
      info.fMask = SIF_ALL;
      info.nMin = 0;
      info.nMax = m_vFileItem.size()*100;
      info.nPage =cy-30;
      info.nPos  = 0;
      SetScrollInfo( SB_VERT, &info, TRUE );  
     }  
    }
    


    Sunny Cao
    MSDN Community Support | Feedback to us
    Develop and promote your apps in Windows Store
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2013年8月14日 4:29
    版主