首页 > 代码库 > 积累的VC编程小技巧之滚动条

积累的VC编程小技巧之滚动条

1.设置滚动条的滚动大小

创建一个基于CScrollview的SDI Project(在第6步中选CScrollview) 
若你已创建了,这步可以省略。 
然后: 
改为如 
void CTestView::OnInitialUpdate() 

CScrollView::OnInitialUpdate(); 

CSize sizeTotal; 
// TODO: calculate the total size of this view 
sizeTotal.cx = 1024;  //改这两个 
sizeTotal.cy = 768;   // 
SetScrollSizes(MM_TEXT, sizeTotal); 
}

 

2.滚动条的控制

BOOL CDiagramShowView::PreTranslateMessage(MSG* pMsg)

{

       CFileTreeDoc* pDoc = (CFileTreeDoc*)GetDocument();

       CPoint point = GetScrollPosition();

      

       if(pMsg->message == WM_KEYDOWN)

       {

              switch(pMsg->wParam)

              {

              case VK_LEFT:

                     if( point.x > 10)

                     {

                           EndPoint.x = EndPoint.x - 10;

                           EndPoint.y = EndPoint.y;

                     }

                     else

                     {

                           EndPoint.x = 0;

                           EndPoint.y = EndPoint.y;

                     }

                     ScrollToPosition(EndPoint);

                     InvalidateRect(NULL,TRUE);

                     break;

              case VK_RIGHT:

                     if( point.x < pDoc->intDiagramColumnCount * pDoc->intColumnWidth - 10 )

                     {

                           EndPoint.x = EndPoint.x + 10;

                           EndPoint.y = EndPoint.y;

                     }

                     else

                     {

                           EndPoint.y = pDoc->intDiagramColumnCount * pDoc->intColumnWidth;

                           EndPoint.x = EndPoint.x;

                     }

                     ScrollToPosition(EndPoint);

                     InvalidateRect(NULL,TRUE);

                     break;

              case VK_UP:

                     if( point.y > 10)

                     {

                           EndPoint.y = EndPoint.y - 10;

                           EndPoint.x = EndPoint.x;

                     }

                     else

                     {

                           EndPoint.y = 0;

                           EndPoint.x = EndPoint.x;

                     }

                     ScrollToPosition(EndPoint);

                     InvalidateRect(NULL,TRUE);

                     break;

              case VK_DOWN:

                     if( point.y < pDoc->intDiagramRowCount * pDoc->intRowHeight - 10 )

                     {

                           EndPoint.y = EndPoint.y + 10;

                           EndPoint.x = EndPoint.x;

                     }

                     else

                     {

                           EndPoint.y = pDoc->intDiagramRowCount * pDoc->intRowHeight;

                           EndPoint.x = EndPoint.x;

                     }

                     ScrollToPosition(EndPoint);

                     InvalidateRect(NULL,TRUE);

                     break;

              default:

                     break;

              }

       }

       return FALSE;

}

 

 

// 通过正负号判断是向上还是向下滚动

if(zDelta==120) 

向上滚动
if(zDelta==-120)
向下滚动

 

BOOL CDiagramShowView::OnMouseWheel(UINT nFlags, short zDelta, CPoint pt)

{

       CFileTreeDoc* pDoc = (CFileTreeDoc*)GetDocument();

       CPoint point = GetScrollPosition();

      

       if(zDelta==120)

       {

              if( point.y >= 20 )

              {

                     EndPoint.x = point.x;

                     EndPoint.y = point.y;

                    

                     EndPoint.x = EndPoint.x;

                     EndPoint.y = EndPoint.y - 20;

              }

              else

              {

                     EndPoint.x = EndPoint.x;

                     EndPoint.y = 0;

              }

       }

      

       if(zDelta==-120)

       {

              if( point.y <= pDoc->intDiagramRowCount * pDoc->intRowHeight - 20 )

              {

                     EndPoint.x = point.x;

                     EndPoint.y = point.y;

                    

                     EndPoint.x = EndPoint.x;

                     EndPoint.y = EndPoint.y + 20;

              }

              else

              {

                     EndPoint.x = EndPoint.x;

                     EndPoint.y = EndPoint.y;

              }

       }

      

       ScrollToPosition(EndPoint);

       InvalidateRect(NULL,TRUE);

       return CScrollView::OnMouseWheel(nFlags, zDelta, pt);

}

 

3.给从CWnd派生的窗口添加滚动条

ModifyStyle(0,WS_VSCROLL);

 

4.如何用键盘滚动分割的视口

我的问题是当我用鼠标滚动分割窗口时,视口滚动都很正常,但用键盘时,却什么也没有发生.

在你的视图继承类中加入如下两个函数,假定该类为CScrollerView:

void CScrollerView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
        BOOL processed;
        for (unsigned int i=0;i< nRepCnt&&processed;i++)
                processed=KeyScroll(nChar);
        if (!processed)
           CScrollView::OnKeyDown(nChar, nRepCnt, nFlags);
}

BOOL CScrollerView::KeyScroll(UINT nChar)
{
        switch (nChar)
                {
                case VK_UP:
                        OnVScroll(SB_LINEUP,0,NULL);
                        break;
                case VK_DOWN:
                        OnVScroll(SB_LINEDOWN,0,NULL);
                        break;
                case VK_LEFT:
                        OnHScroll(SB_LINELEFT,0,NULL);
                        break;
                case VK_RIGHT:
                        OnHScroll(SB_LINERIGHT,0,NULL);
                        break;
                case VK_HOME:
                        OnHScroll(SB_LEFT,0,NULL);
                        break;
                case VK_END:
                        OnHScroll(SB_RIGHT,0,NULL);
                        break;
                case VK_PRIOR:
                        OnVScroll(SB_PAGEUP,0,NULL);
                        break;
                case VK_NEXT:
                        OnVScroll(SB_PAGEDOWN,0,NULL);
                        break;
                default:
                        return FALSE; // not for us
                             // and let the default class
                             // process it.
                }
   return TRUE;
}