VC编程小技巧之滚动条

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

创建一个基于CScrollviewSDI 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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值