我从CtrlView派生了一个CXTabView,功能类似Property Sheet的那种,一个View里面有好几个页面。但该视图没有滚动条,我在Create()里面添加了Style |= WS_VSCROLL|WS_HSCROLL. 运行后出现了滚动条,但是滚动条压根就滚动不了,在此View里面无法收到滚动消息, 添加了WM_VSCROLL和WM_HSCROLL的消息处理函数也就无法运行,怎么回事啊?

解决方案 »

  1.   

    这个似乎还挺麻烦的!
    好象要添不少东西.建议ScrollView派生,要添加控件的话,再上面嵌个子窗口好了!
      

  2.   

    CFormView上面放Tab不行么
    在Tab上放滚动条也可以
      

  3.   

    http://blog.csdn.net/mynamelj/archive/2006/10/09/1327652.aspx
      

  4.   

    谢谢各位阿,继续关注阿!
      这个CXTabView是从CCtrlView派生的呀,它的基类就是CView,不是CFormView啊,和楼上 风之羽翼 说的这个很相似 。 
        我已经在这个基础上写了很多代码了,暂时不会考虑重新用ScrollView来做了。就是希望我加上滚动条以后,能拖动那个滚动条就行,我再自己处理WM_VSCROLL和WM_HSCROLL消息滚动界面就OK了,问题就是加上了滚动条后它压根就拖不了滚动条。
        同样的做法用CView,就可以拖动滚动条(但是窗口也是不能滚动),会收到WM_VSCROLL和WM_HSCROLL消息,我就是希望能够达到这种效果就行了。
       高手指点指点阿!
      

  5.   

    假设滚动条的范围都是0到100;
    void CXTabView::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) 
    {
        // TODO: Add your message handler code here and/or call default
        int nPrevPos = GetScrollPos(SB_HORZ);
        switch(nSBCode) 
        {
        case SB_LEFT:           //   Scroll to far left.
            nPrevPos = 0;
         break;
        case SB_ENDSCROLL:      //   End scroll.
         break;
        case SB_LINELEFT:       //   Scroll left.
            nPrevPos -= 1;
            break;
        case SB_LINERIGHT:      //   Scroll right.
            nPrevPos += 1;
            break;
        case SB_PAGELEFT:       //   Scroll one page left.
            nPrevPos -= 10;
            break;
        case SB_PAGERIGHT:      //   Scroll one page right.
            nPrevPos += 10;
            break;
        case SB_RIGHT:          //   Scroll to far right.
            nPrevPos = 100;
            break;
        case SB_THUMBPOSITION:  //   Scroll to absolute position. The current position is specified by the nPos parameter.
            nPrevPos = nPos;
            break;
        case SB_THUMBTRACK:     //   Drag scroll box to specified position. The current position is specified by the nPos parameter.
            nPrevPos = nPos;
            break;
        default :
            break;
        }    SetScrollPos(SB_HORZ, nPrevPos);
        CCtrlView::OnHScroll(nSBCode, nPos, pScrollBar);
    }void CXTabView::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) 
    {
        // TODO: Add your message handler code here and/or call default
        int nPrevPos = GetScrollPos(SB_VERT);
        switch(nSBCode)
        {
        case SB_BOTTOM:         //   Scroll to bottom.
            nPrevPos = 100;
            break;
        case SB_ENDSCROLL:      //   End scroll.
            break;
        case SB_LINEDOWN:       //   Scroll one line down.
            nPrevPos += 1;
            break;
        case SB_LINEUP:         //   Scroll one line up.
            nPrevPos -= 1;
            break;
        case SB_PAGEDOWN:       //   Scroll one page down.
            nPrevPos += 10;
            break;
        case SB_PAGEUP:         //   Scroll one page up.
            nPrevPos -= 10;
            break;
        case SB_THUMBPOSITION:  //   Scroll to the absolute position. The current position is provided in nPos.
            nPrevPos = nPos;
            break;
        case SB_THUMBTRACK:     //   Drag scroll box to specified position. The current position is provided in nPos.
            nPrevPos = nPos;
            break;
        case SB_TOP:            //   Scroll to top.
            nPrevPos = 0;
            break;
        default:
            break;
        }    SetScrollPos(SB_VERT, nPrevPos);
        CCtrlView::OnVScroll(nSBCode, nPos, pScrollBar);
    }
    可以调节数字改变滚动条滚动的速度!
    然后,根据滚动条的位置,来调节窗体的滚动效果,可以用MoveWindow来移动子窗体,或者,OnPaint来移动自绘部分。
      

  6.   

    你要根据内容设置view的scrollrange,不然窗口默认是未超过显示范围,因此没有滚动条出现,你可以通过SetScrollRange来设置窗口的滚范围
      

  7.   

    你在CXTabView::OnInitialUpdate()之中加入
    SetScrollSizes( MM_TEXT, CSize(2000,2000) );
    滚动条应该可以滚动了
    CSize的具体大小可以根据你程序的需求动态调整