ScrollWndbase.cpp
上传用户:lds876
上传日期:2013-05-25
资源大小:567k
文件大小:5k
源码类别:

P2P编程

开发平台:

Visual C++

  1. // ScrollWndbase.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "testbt.h"
  5. #include "ScrollWndbase.h"
  6. #ifdef _DEBUG
  7. #define new DEBUG_NEW
  8. #undef THIS_FILE
  9. static char THIS_FILE[] = __FILE__;
  10. #endif
  11. #define SB_LINEDOWN_WHEEL 10
  12. #define SB_LINEUP_WHEEL 11
  13. /////////////////////////////////////////////////////////////////////////////
  14. // CScrollWndbase
  15. CScrollWndbase::CScrollWndbase(const CRect rc)
  16. {
  17. m_ptTopLeft = CPoint(0, 0);
  18. m_rect = rc;
  19. m_curRect = CRect(0, 0, 0, 0);
  20. }
  21. CScrollWndbase::~CScrollWndbase()
  22. {
  23. }
  24. BEGIN_MESSAGE_MAP(CScrollWndbase, CWnd)
  25. //{{AFX_MSG_MAP(CScrollWndbase)
  26. ON_WM_HSCROLL()
  27. ON_WM_VSCROLL()
  28. ON_WM_SIZE()
  29. ON_WM_MOUSEWHEEL()
  30. //}}AFX_MSG_MAP
  31. END_MESSAGE_MAP()
  32. /////////////////////////////////////////////////////////////////////////////
  33. // CScrollWndbase message handlers
  34. void CScrollWndbase::ResetPos() 
  35. {
  36. OnVScroll(SB_THUMBPOSITION, 0, 0);
  37. OnHScroll(SB_THUMBPOSITION, 0, 0);
  38. }
  39. CPoint CScrollWndbase::GetTopLeft() const 
  40. {
  41. return m_ptTopLeft;
  42. }
  43. CRect CScrollWndbase::GetRect() const 
  44. {
  45. return m_rect;
  46. }
  47. void CScrollWndbase::OnScrollEx()
  48. {
  49. }
  50. void CScrollWndbase::OnSize(UINT nType, int cx, int cy) 
  51. {
  52. CWnd::OnSize(nType, cx, cy);
  53. m_curRect = CRect(0, 0, cx, cy);
  54. int nScrollMax;
  55. if (cy < m_rect.Height())
  56. {
  57.      nScrollMax = m_rect.Height(); //- cy;
  58. }
  59. else
  60.      nScrollMax = 0;
  61. long newpos = m_ptTopLeft.y;
  62. if (newpos > (m_rect.Height() - cy))
  63. {
  64. newpos = m_rect.Height() - cy;
  65. if (newpos < 0) newpos = 0;
  66. // ScrollWindow(0, newpos);
  67. }
  68. SCROLLINFO si;
  69. si.cbSize = sizeof(SCROLLINFO);
  70. si.fMask = SIF_ALL; // SIF_ALL = SIF_PAGE | SIF_RANGE | SIF_POS;
  71. si.nMin = 0;
  72. si.nMax = nScrollMax;
  73. si.nPage = cy;
  74. si.nPos = 0;
  75. SetScrollInfo(SB_VERT, &si, TRUE); 
  76. if (cx < m_rect.Width())
  77. {
  78.      nScrollMax = m_rect.Width();// - cx;
  79. }
  80. else
  81.      nScrollMax = 0;
  82. si.cbSize = sizeof(SCROLLINFO);
  83. si.fMask = SIF_ALL; // SIF_ALL = SIF_PAGE | SIF_RANGE | SIF_POS;
  84. si.nMin = 0;
  85. si.nMax = nScrollMax;
  86. si.nPage = cx;
  87. si.nPos = 0;
  88. SetScrollInfo(SB_HORZ, &si, TRUE);
  89. m_ptTopLeft = CPoint(0, 0);
  90. OnScrollEx();
  91. }
  92. void CScrollWndbase::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) 
  93. {
  94. int nDelta;
  95. int nMaxPos = m_rect.Width() - m_curRect.Width();
  96. if (nMaxPos <= 0) return;
  97. switch (nSBCode)
  98. {
  99. case SB_LINEDOWN:
  100. if (m_ptTopLeft.x >= nMaxPos)
  101. return;
  102. nDelta = min(nMaxPos/10, nMaxPos - m_ptTopLeft.x);
  103. break;
  104. case SB_LINEUP:
  105. if (m_ptTopLeft.x <= 0)
  106. return;
  107. nDelta = -min(nMaxPos/10, m_ptTopLeft.x);
  108. break;
  109. case SB_PAGEDOWN:
  110. if (m_ptTopLeft.x >= nMaxPos)
  111. return;
  112. nDelta = min(m_curRect.Width(), nMaxPos-m_ptTopLeft.x);
  113. break;
  114. case SB_PAGEUP:
  115. if (m_ptTopLeft.x <= 0)
  116. return;
  117. nDelta = -min(m_curRect.Width(), m_ptTopLeft.x);
  118. break;
  119. case SB_THUMBPOSITION:
  120. nDelta = (int)nPos - m_ptTopLeft.x;
  121. break;
  122. case SB_THUMBTRACK:
  123. nDelta = (int)nPos - m_ptTopLeft.x;
  124. break;
  125. default:
  126. return;
  127. }
  128. m_ptTopLeft.x += nDelta;
  129. SetScrollPos(SB_HORZ, m_ptTopLeft.x, TRUE);
  130. OnScrollEx();
  131. CWnd::OnHScroll(nSBCode, nPos, pScrollBar);
  132. }
  133. void CScrollWndbase::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) 
  134. {
  135. int nDelta;
  136. int nMaxPos = m_rect.Height() - m_curRect.Height();
  137. if (nMaxPos <= 0) return;
  138. switch (nSBCode)
  139. {
  140. case SB_LINEDOWN_WHEEL :
  141. {
  142. if (m_ptTopLeft.y >= nMaxPos)
  143. return;
  144. if ((nMaxPos - m_ptTopLeft.y) < 0)
  145. {
  146. assert(false);
  147. return;
  148. }
  149. nDelta = min(30, nMaxPos - m_ptTopLeft.y); 
  150. }
  151. break;
  152. case SB_LINEUP_WHEEL:
  153. if (m_ptTopLeft.y <= 0)
  154. return;
  155. nDelta = -min(30, m_ptTopLeft.y);
  156. break;
  157. case SB_LINEDOWN:
  158. if (m_ptTopLeft.y >= nMaxPos)
  159. return;
  160. nDelta = min(nMaxPos/10, nMaxPos - m_ptTopLeft.y);
  161. break;
  162. case SB_LINEUP:
  163. if (m_ptTopLeft.y <= 0)
  164. return;
  165. nDelta = -min(nMaxPos/10, m_ptTopLeft.y);
  166. break;
  167. case SB_PAGEDOWN:
  168. if (m_ptTopLeft.y >= nMaxPos)
  169. return;
  170. nDelta = min(m_curRect.Height(), nMaxPos - m_ptTopLeft.y);
  171. break;
  172. case SB_PAGEUP:
  173. if (m_ptTopLeft.y <= 0)
  174. return;
  175. nDelta = -min(m_curRect.Height(), m_ptTopLeft.y);
  176. break;
  177. case SB_THUMBPOSITION:
  178. nDelta = (int)nPos - m_ptTopLeft.y;
  179. break;
  180. case SB_THUMBTRACK:
  181. nDelta = (int)nPos - m_ptTopLeft.y;
  182. break;
  183. default:
  184. return;
  185. }
  186. m_ptTopLeft.y += nDelta;
  187. SetScrollPos(SB_VERT, m_ptTopLeft.y,TRUE);
  188. OnScrollEx();
  189. CWnd::OnVScroll(nSBCode, nPos, pScrollBar);
  190. }
  191. BOOL CScrollWndbase::OnMouseWheel(UINT nFlags, short zDelta, CPoint pt) 
  192. {
  193. OnVScroll(zDelta > 0 ? SB_LINEUP_WHEEL : SB_LINEDOWN_WHEEL , 0, 0);
  194. return CWnd::OnMouseWheel(nFlags, zDelta, pt);
  195. }