ScrollDlg.cpp 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229
  1. // ScrollDlg.cpp : 实现文件
  2. //
  3. #include "stdafx.h"
  4. #include "ScrollDlg.h"
  5. #include "resource.h"
  6. // CScrollDlg 对话框
  7. IMPLEMENT_DYNAMIC(CScrollDlg, CDlgControlItem)
  8. CScrollDlg::CScrollDlg(CWnd* pParent /*=NULL*/)
  9. : CDlgControlItem(IDD_SCROLL, pParent)
  10. {
  11. m_nCurrentPos = 0;
  12. }
  13. CScrollDlg::~CScrollDlg()
  14. {
  15. }
  16. void CScrollDlg::DoDataExchange(CDataExchange* pDX)
  17. {
  18. CDlgControlItem::DoDataExchange(pDX);
  19. DDX_Control(pDX,IDC_SCROLLBAR1,m_ScrollBar1);
  20. DDX_Control(pDX,IDC_SCROLLBAR2,m_ScrollBar2);
  21. }
  22. BEGIN_MESSAGE_MAP(CScrollDlg, CDlgControlItem)
  23. ON_WM_HSCROLL()
  24. ON_WM_VSCROLL()
  25. ON_BN_CLICKED(IDC_BUTTON1,Start)
  26. ON_BN_CLICKED(IDC_BUTTON14,Stop)
  27. ON_WM_TIMER()
  28. ON_WM_DESTROY()
  29. END_MESSAGE_MAP()
  30. BOOL CScrollDlg::OnInitDialog()
  31. {
  32. CDlgControlItem::OnInitDialog();
  33. SCROLLINFO info;
  34. info.cbSize = sizeof(SCROLLINFO);
  35. info.fMask = SIF_ALL;
  36. info.nMin = 0;
  37. info.nMax = 100;
  38. info.nPage = 50;
  39. info.nPos = 0;
  40. m_ScrollBar1.SetScrollInfo(&info);
  41. m_ScrollBar2.SetScrollRange(0,50);
  42. m_ScrollBar2.SetScrollPos(20);
  43. //创建滚动条,并且假设滚动条要显示3倍客户区大小
  44. CRect rcClient;
  45. GetClientRect(&rcClient);
  46. //设置滚动条
  47. SCROLLINFO ScrollInfo;
  48. ScrollInfo.cbSize=sizeof(SCROLLINFO);
  49. ScrollInfo.fMask=SIF_RANGE|SIF_PAGE|SIF_POS;
  50. ScrollInfo.nMin=0;
  51. ScrollInfo.nMax=rcClient.Height()*3;
  52. ScrollInfo.nPage=rcClient.Height();
  53. ScrollInfo.nPos=m_nCurrentPos;
  54. SetScrollInfo(SB_VERT,&ScrollInfo,TRUE);
  55. SetScrollImage(this,TEXT("Res\\Scroll\\SKIN_SCROLL.bmp"));
  56. return TRUE;
  57. }
  58. void CScrollDlg::OnHScroll( UINT nSBCode, UINT nPos, CScrollBar* pScrollBar )
  59. {
  60. int nMin,nMax,nCurpos;
  61. pScrollBar->GetScrollRange(&nMin,&nMax);
  62. nCurpos=pScrollBar->GetScrollPos();
  63. switch(nSBCode)
  64. {
  65. case SB_LINELEFT:
  66. nCurpos-=5;break;
  67. case SB_LINERIGHT:
  68. nCurpos+=5;break;
  69. case SB_THUMBTRACK:
  70. nCurpos=nPos;break;
  71. }
  72. if(nCurpos>nMax) nCurpos=nMax;
  73. else if(nCurpos<nMin) nCurpos=nMin;
  74. pScrollBar->SetScrollPos(nCurpos);
  75. CDlgControlItem::OnHScroll(nSBCode, nPos, pScrollBar);
  76. }
  77. void CScrollDlg::OnVScroll( UINT nSBCode, UINT nPos, CScrollBar* pScrollBar )
  78. {
  79. if ( pScrollBar == NULL )
  80. {
  81. //获取参数
  82. RECT rcClient;
  83. int iLastPos=m_nCurrentPos;
  84. GetClientRect(&rcClient);
  85. //移动坐标
  86. switch (nSBCode)
  87. {
  88. case SB_TOP:
  89. {
  90. m_nCurrentPos=0;
  91. break;
  92. }
  93. case SB_BOTTOM:
  94. {
  95. m_nCurrentPos=rcClient.bottom*3;
  96. break;
  97. }
  98. case SB_LINEUP:
  99. {
  100. m_nCurrentPos-=10;
  101. break;
  102. }
  103. case SB_PAGEUP:
  104. {
  105. m_nCurrentPos-=rcClient.bottom;
  106. break;
  107. }
  108. case SB_LINEDOWN:
  109. {
  110. m_nCurrentPos+=10;
  111. break;
  112. }
  113. case SB_PAGEDOWN:
  114. {
  115. m_nCurrentPos+=rcClient.bottom;
  116. break;
  117. }
  118. case SB_THUMBTRACK:
  119. {
  120. m_nCurrentPos=nPos;
  121. break;
  122. }
  123. }
  124. //调整位置
  125. SetFocus();
  126. m_nCurrentPos=__min(m_nCurrentPos,rcClient.bottom*3-rcClient.bottom);
  127. if (m_nCurrentPos<0) m_nCurrentPos=0;
  128. if (iLastPos!=m_nCurrentPos)
  129. {
  130. SetScrollPos(SB_VERT,m_nCurrentPos);
  131. ScrollWindow(0,iLastPos-m_nCurrentPos,NULL,NULL);
  132. }
  133. }
  134. else
  135. {
  136. int nMin,nMax,nCurpos;
  137. pScrollBar->GetScrollRange(&nMin,&nMax);
  138. nCurpos=pScrollBar->GetScrollPos();
  139. switch(nSBCode)
  140. {
  141. case SB_LINEUP:
  142. nCurpos-=5;break;
  143. case SB_LINEDOWN:
  144. nCurpos+=5;break;
  145. case SB_THUMBTRACK:
  146. nCurpos=nPos;break;
  147. }
  148. if(nCurpos>nMax) nCurpos=nMax;
  149. else if(nCurpos<nMin) nCurpos=nMin;
  150. pScrollBar->SetScrollPos(nCurpos);
  151. }
  152. CDlgControlItem::OnVScroll(nSBCode, nPos, pScrollBar);
  153. }
  154. void CScrollDlg::Start()
  155. {
  156. SetTimer(0,100,NULL);
  157. }
  158. void CScrollDlg::Stop()
  159. {
  160. KillTimer(0);
  161. }
  162. void CScrollDlg::OnTimer( UINT_PTR nIDEvent )
  163. {
  164. if ( nIDEvent == 0 )
  165. {
  166. static int nVScroll=0;
  167. static int nHScroll=0;
  168. int nMaxVScroll=0,nMinVScroll=0;
  169. int nMaxHScroll=0,nMinHScroll=0;
  170. m_ScrollBar2.GetScrollRange(&nMinVScroll,&nMaxVScroll);
  171. SCROLLINFO info;
  172. m_ScrollBar1.GetScrollInfo(&info,SIF_ALL);
  173. nHScroll = info.nPos;
  174. nMinHScroll = info.nMin;
  175. nMaxHScroll = info.nMax;
  176. nVScroll = m_ScrollBar2.GetScrollPos();
  177. if( nHScroll+info.nPage >= nMaxHScroll ) nHScroll = 0;else nHScroll+=10;
  178. if( nVScroll >= nMaxVScroll ) nVScroll = 0;else nVScroll+=10;
  179. m_ScrollBar1.SetScrollPos(nHScroll);
  180. m_ScrollBar2.SetScrollPos(nVScroll);
  181. }
  182. }
  183. void CScrollDlg::OnDestroy()
  184. {
  185. RemoveScorll();
  186. }
  187. // CScrollDlg 消息处理程序