天天看點

積累的VC程式設計小技巧之滾動條

建立一個基于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); 

}

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;

                     ScrollToPosition(EndPoint);

                     InvalidateRect(NULL,TRUE);

                     break;

              case VK_RIGHT:

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

                           EndPoint.x = EndPoint.x + 10;

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

                           EndPoint.x = EndPoint.x;

              case VK_UP:

                     if( point.y > 10)

                           EndPoint.y = EndPoint.y - 10;

                           EndPoint.y = 0;

              case VK_DOWN:

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

                           EndPoint.y = EndPoint.y + 10;

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

              default:

              }

       }

       return FALSE;

// 通過正負号判斷是向上還是向下滾動

if(zDelta==120) 

向上滾動

if(zDelta==-120)

向下滾動

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

       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.y = 0;

       if(zDelta==-120)

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

                     EndPoint.y = EndPoint.y + 20;

                     EndPoint.y = EndPoint.y;

       ScrollToPosition(EndPoint);

       InvalidateRect(NULL,TRUE);

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

ModifyStyle(0,WS_VSCROLL);

我的問題是當我用滑鼠滾動分割視窗時,視口滾動都很正常,但用鍵盤時,卻什麼也沒有發生.

在你的視圖繼承類中加入如下兩個函數,假定該類為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);

                case VK_LEFT:

                        OnHScroll(SB_LINELEFT,0,NULL);

                case VK_RIGHT:

                        OnHScroll(SB_LINERIGHT,0,NULL);

                case VK_HOME:

                        OnHScroll(SB_LEFT,0,NULL);

                case VK_END:

                        OnHScroll(SB_RIGHT,0,NULL);

                case VK_PRIOR:

                        OnVScroll(SB_PAGEUP,0,NULL);

                case VK_NEXT:

                        OnVScroll(SB_PAGEDOWN,0,NULL);

                default:

                        return FALSE; // not for us

                             // and let the default class

                             // process it.

                }

   return TRUE;

繼續閱讀