| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229 |
- // ScrollDlg.cpp : 实现文件
- //
- #include "stdafx.h"
- #include "ScrollDlg.h"
- #include "resource.h"
- // CScrollDlg 对话框
- IMPLEMENT_DYNAMIC(CScrollDlg, CDlgControlItem)
- CScrollDlg::CScrollDlg(CWnd* pParent /*=NULL*/)
- : CDlgControlItem(IDD_SCROLL, pParent)
- {
- m_nCurrentPos = 0;
- }
- CScrollDlg::~CScrollDlg()
- {
- }
- void CScrollDlg::DoDataExchange(CDataExchange* pDX)
- {
- CDlgControlItem::DoDataExchange(pDX);
- DDX_Control(pDX,IDC_SCROLLBAR1,m_ScrollBar1);
- DDX_Control(pDX,IDC_SCROLLBAR2,m_ScrollBar2);
- }
- BEGIN_MESSAGE_MAP(CScrollDlg, CDlgControlItem)
- ON_WM_HSCROLL()
- ON_WM_VSCROLL()
- ON_BN_CLICKED(IDC_BUTTON1,Start)
- ON_BN_CLICKED(IDC_BUTTON14,Stop)
- ON_WM_TIMER()
- ON_WM_DESTROY()
- END_MESSAGE_MAP()
- BOOL CScrollDlg::OnInitDialog()
- {
- CDlgControlItem::OnInitDialog();
-
- SCROLLINFO info;
- info.cbSize = sizeof(SCROLLINFO);
- info.fMask = SIF_ALL;
- info.nMin = 0;
- info.nMax = 100;
- info.nPage = 50;
- info.nPos = 0;
- m_ScrollBar1.SetScrollInfo(&info);
- m_ScrollBar2.SetScrollRange(0,50);
- m_ScrollBar2.SetScrollPos(20);
- //创建滚动条,并且假设滚动条要显示3倍客户区大小
- CRect rcClient;
- GetClientRect(&rcClient);
- //设置滚动条
- SCROLLINFO ScrollInfo;
- ScrollInfo.cbSize=sizeof(SCROLLINFO);
- ScrollInfo.fMask=SIF_RANGE|SIF_PAGE|SIF_POS;
- ScrollInfo.nMin=0;
- ScrollInfo.nMax=rcClient.Height()*3;
- ScrollInfo.nPage=rcClient.Height();
- ScrollInfo.nPos=m_nCurrentPos;
- SetScrollInfo(SB_VERT,&ScrollInfo,TRUE);
- SetScrollImage(this,TEXT("Res\\Scroll\\SKIN_SCROLL.bmp"));
- return TRUE;
- }
- void CScrollDlg::OnHScroll( UINT nSBCode, UINT nPos, CScrollBar* pScrollBar )
- {
- int nMin,nMax,nCurpos;
- pScrollBar->GetScrollRange(&nMin,&nMax);
- nCurpos=pScrollBar->GetScrollPos();
-
- switch(nSBCode)
- {
- case SB_LINELEFT:
- nCurpos-=5;break;
- case SB_LINERIGHT:
- nCurpos+=5;break;
- case SB_THUMBTRACK:
- nCurpos=nPos;break;
- }
-
- if(nCurpos>nMax) nCurpos=nMax;
- else if(nCurpos<nMin) nCurpos=nMin;
- pScrollBar->SetScrollPos(nCurpos);
- CDlgControlItem::OnHScroll(nSBCode, nPos, pScrollBar);
- }
- void CScrollDlg::OnVScroll( UINT nSBCode, UINT nPos, CScrollBar* pScrollBar )
- {
- if ( pScrollBar == NULL )
- {
- //获取参数
- RECT rcClient;
- int iLastPos=m_nCurrentPos;
- GetClientRect(&rcClient);
- //移动坐标
- switch (nSBCode)
- {
- case SB_TOP:
- {
- m_nCurrentPos=0;
- break;
- }
- case SB_BOTTOM:
- {
- m_nCurrentPos=rcClient.bottom*3;
- break;
- }
- case SB_LINEUP:
- {
- m_nCurrentPos-=10;
- break;
- }
- case SB_PAGEUP:
- {
- m_nCurrentPos-=rcClient.bottom;
- break;
- }
- case SB_LINEDOWN:
- {
- m_nCurrentPos+=10;
- break;
- }
- case SB_PAGEDOWN:
- {
- m_nCurrentPos+=rcClient.bottom;
- break;
- }
- case SB_THUMBTRACK:
- {
- m_nCurrentPos=nPos;
- break;
- }
- }
- //调整位置
- SetFocus();
- m_nCurrentPos=__min(m_nCurrentPos,rcClient.bottom*3-rcClient.bottom);
- if (m_nCurrentPos<0) m_nCurrentPos=0;
- if (iLastPos!=m_nCurrentPos)
- {
- SetScrollPos(SB_VERT,m_nCurrentPos);
- ScrollWindow(0,iLastPos-m_nCurrentPos,NULL,NULL);
- }
- }
- else
- {
- int nMin,nMax,nCurpos;
- pScrollBar->GetScrollRange(&nMin,&nMax);
- nCurpos=pScrollBar->GetScrollPos();
- switch(nSBCode)
- {
- case SB_LINEUP:
- nCurpos-=5;break;
- case SB_LINEDOWN:
- nCurpos+=5;break;
- case SB_THUMBTRACK:
- nCurpos=nPos;break;
- }
- if(nCurpos>nMax) nCurpos=nMax;
- else if(nCurpos<nMin) nCurpos=nMin;
- pScrollBar->SetScrollPos(nCurpos);
- }
- CDlgControlItem::OnVScroll(nSBCode, nPos, pScrollBar);
- }
- void CScrollDlg::Start()
- {
- SetTimer(0,100,NULL);
- }
- void CScrollDlg::Stop()
- {
- KillTimer(0);
- }
- void CScrollDlg::OnTimer( UINT_PTR nIDEvent )
- {
- if ( nIDEvent == 0 )
- {
- static int nVScroll=0;
- static int nHScroll=0;
- int nMaxVScroll=0,nMinVScroll=0;
- int nMaxHScroll=0,nMinHScroll=0;
- m_ScrollBar2.GetScrollRange(&nMinVScroll,&nMaxVScroll);
- SCROLLINFO info;
- m_ScrollBar1.GetScrollInfo(&info,SIF_ALL);
- nHScroll = info.nPos;
-
- nMinHScroll = info.nMin;
- nMaxHScroll = info.nMax;
- nVScroll = m_ScrollBar2.GetScrollPos();
- if( nHScroll+info.nPage >= nMaxHScroll ) nHScroll = 0;else nHScroll+=10;
- if( nVScroll >= nMaxVScroll ) nVScroll = 0;else nVScroll+=10;
- m_ScrollBar1.SetScrollPos(nHScroll);
- m_ScrollBar2.SetScrollPos(nVScroll);
- }
- }
- void CScrollDlg::OnDestroy()
- {
- RemoveScorll();
- }
- // CScrollDlg 消息处理程序
|