SkinVerticleScrollbar.cpp
上传用户:sgmlaoniu
上传日期:2022-06-15
资源大小:28k
文件大小:8k
源码类别:

ListView/ListBox

开发平台:

Visual C++

  1. // SkinVerticleScrollbar.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "SkinList.h"
  5. #include "SkinVerticleScrollbar.h"
  6. #ifdef _DEBUG
  7. #define new DEBUG_NEW
  8. #undef THIS_FILE
  9. static char THIS_FILE[] = __FILE__;
  10. #endif
  11. /////////////////////////////////////////////////////////////////////////////
  12. // CSkinVerticleScrollbar
  13. CSkinVerticleScrollbar::CSkinVerticleScrollbar()
  14. {
  15. bMouseDown = false;
  16. bMouseDownArrowUp = false;
  17. bMouseDownArrowDown = false;
  18. bDragging = false;
  19. nThumbTop = 36;
  20. dbThumbInterval = 0.000000;
  21. pList = NULL;
  22. }
  23. CSkinVerticleScrollbar::~CSkinVerticleScrollbar()
  24. {
  25. }
  26. BEGIN_MESSAGE_MAP(CSkinVerticleScrollbar, CStatic)
  27. //{{AFX_MSG_MAP(CSkinVerticleScrollbar)
  28. ON_WM_ERASEBKGND()
  29. ON_WM_LBUTTONDOWN()
  30. ON_WM_LBUTTONUP()
  31. ON_WM_MOUSEMOVE()
  32. ON_WM_PAINT()
  33. ON_WM_TIMER()
  34. //}}AFX_MSG_MAP
  35. END_MESSAGE_MAP()
  36. /////////////////////////////////////////////////////////////////////////////
  37. // CSkinVerticleScrollbar message handlers
  38. BOOL CSkinVerticleScrollbar::OnEraseBkgnd(CDC* pDC) 
  39. {
  40. return CStatic::OnEraseBkgnd(pDC);
  41. }
  42. void CSkinVerticleScrollbar::OnLButtonDown(UINT nFlags, CPoint point) 
  43. {
  44. SetCapture();
  45. CRect clientRect;
  46. GetClientRect(&clientRect);
  47. int nHeight = clientRect.Height() - 37;
  48. CRect rectUpArrow(0,11,12,37);
  49. CRect rectDownArrow(0,nHeight,12,nHeight+26);
  50. CRect rectThumb(0,nThumbTop,12,nThumbTop+26);
  51. if(rectThumb.PtInRect(point))
  52. {
  53. bMouseDown = true;
  54. }
  55. if(rectDownArrow.PtInRect(point))
  56. {
  57. bMouseDownArrowDown = true;
  58. SetTimer(2,250,NULL);
  59. }
  60. if(rectUpArrow.PtInRect(point))
  61. {
  62. bMouseDownArrowUp = true;
  63. SetTimer(2,250,NULL);
  64. }
  65. CStatic::OnLButtonDown(nFlags, point);
  66. }
  67. void CSkinVerticleScrollbar::OnLButtonUp(UINT nFlags, CPoint point) 
  68. {
  69. UpdateThumbPosition();
  70. KillTimer(1);
  71. ReleaseCapture();
  72. bool bInChannel = true;
  73. CRect clientRect;
  74. GetClientRect(&clientRect);
  75. int nHeight = clientRect.Height() - 37;
  76. CRect rectUpArrow(0,11,12,37);
  77. CRect rectDownArrow(0,nHeight,12,nHeight+26);
  78. CRect rectThumb(0,nThumbTop,12,nThumbTop+26);
  79. if(rectUpArrow.PtInRect(point) && bMouseDownArrowUp)
  80. {
  81. ScrollUp();
  82. bInChannel = false;
  83. }
  84. if(rectDownArrow.PtInRect(point) && bMouseDownArrowDown)
  85. {
  86. ScrollDown();
  87. bInChannel = false;
  88. }
  89. if(rectThumb.PtInRect(point))
  90. {
  91. bInChannel = false;
  92. }
  93. if(bInChannel == true && !bMouseDown)
  94. {
  95. if(point.y > nThumbTop)
  96. {
  97. PageDown();
  98. }
  99. else
  100. {
  101. PageUp();
  102. }
  103. }
  104. bMouseDown = false;
  105. bDragging = false;
  106. bMouseDownArrowUp = false;
  107. bMouseDownArrowDown = false;
  108. CStatic::OnLButtonUp(nFlags, point);
  109. }
  110. void CSkinVerticleScrollbar::OnMouseMove(UINT nFlags, CPoint point) 
  111. {
  112. CRect clientRect;
  113. GetClientRect(&clientRect);
  114. if(bMouseDown)
  115. {
  116. nThumbTop = point.y-13; //-13 so mouse is in middle of thumb
  117. double nMax = pList->GetScrollLimit(SB_VERT);
  118. int nPos = pList->GetScrollPos(SB_VERT);
  119. double nHeight = clientRect.Height()-98;
  120. double nVar = nMax;
  121. dbThumbInterval = nHeight/nVar;
  122. //figure out how many times to scroll total from top
  123. //then minus the current position from it
  124. int nScrollTimes = (int)((nThumbTop-36)/dbThumbInterval)-nPos;
  125. //grab the row height dynamically
  126. //so if the font size or type changes
  127. //our scroll will still work properly
  128. CRect itemrect;
  129. pList->GetItemRect(0,&itemrect, LVIR_BOUNDS);
  130. CSize size;
  131. size.cx = 0;
  132. size.cy = nScrollTimes*itemrect.Height();
  133. pList->Scroll(size);
  134. LimitThumbPosition();
  135. Draw();
  136. }
  137. CStatic::OnMouseMove(nFlags, point);
  138. }
  139. void CSkinVerticleScrollbar::OnPaint() 
  140. {
  141. CPaintDC dc(this); 
  142. Draw();
  143. }
  144. void CSkinVerticleScrollbar::OnTimer(UINT nIDEvent) 
  145. {
  146. if(nIDEvent == 1)
  147. {
  148. if(bMouseDownArrowDown)
  149. {
  150. ScrollDown();
  151. }
  152. if(bMouseDownArrowUp)
  153. {
  154. ScrollUp();
  155. }
  156. }
  157. else if(nIDEvent == 2)
  158. {
  159. if(bMouseDownArrowDown)
  160. {
  161. KillTimer(2);
  162. SetTimer(1, 50, NULL);
  163. }
  164. if(bMouseDownArrowUp)
  165. {
  166. KillTimer(2);
  167. SetTimer(1, 50, NULL);
  168. }
  169. }
  170. CStatic::OnTimer(nIDEvent);
  171. }
  172. void CSkinVerticleScrollbar::PageDown()
  173. {
  174. pList->SendMessage(WM_VSCROLL, MAKELONG(SB_PAGEDOWN,0),NULL);
  175. UpdateThumbPosition();
  176. }
  177. void CSkinVerticleScrollbar::PageUp()
  178. {
  179. pList->SendMessage(WM_VSCROLL, MAKELONG(SB_PAGEUP,0),NULL);
  180. UpdateThumbPosition();
  181. }
  182. void CSkinVerticleScrollbar::ScrollUp()
  183. {
  184. pList->SendMessage(WM_VSCROLL, MAKELONG(SB_LINEUP,0),NULL);
  185. UpdateThumbPosition();
  186. }
  187. void CSkinVerticleScrollbar::ScrollDown()
  188. {
  189. pList->SendMessage(WM_VSCROLL, MAKELONG(SB_LINEDOWN,0),NULL);
  190. UpdateThumbPosition();
  191. }
  192. void CSkinVerticleScrollbar::UpdateThumbPosition()
  193. {
  194. CRect clientRect;
  195. GetClientRect(&clientRect);
  196. double nPos = pList->GetScrollPos(SB_VERT);
  197. double nMax = pList->GetScrollLimit(SB_VERT);
  198. double nHeight = (clientRect.Height()-98);
  199. double nVar = nMax;
  200. dbThumbInterval = nHeight/nVar;
  201. double nNewdbValue = (dbThumbInterval * nPos);
  202. int nNewValue = (int)nNewdbValue;
  203. nThumbTop = 36+nNewValue;
  204. LimitThumbPosition();
  205. Draw();
  206. }
  207. void CSkinVerticleScrollbar::Draw()
  208. {
  209. CClientDC dc(this);
  210. CRect clientRect;
  211. GetClientRect(&clientRect);
  212. CMemDC memDC(&dc, &clientRect);
  213. memDC.FillSolidRect(&clientRect,  RGB(74,82,107));
  214. CDC bitmapDC;
  215. bitmapDC.CreateCompatibleDC(&dc);
  216. CBitmap bitmap;
  217. bitmap.LoadBitmap(IDB_VERTICLE_SCROLLBAR_TOP);
  218. CBitmap* pOldBitmap = bitmapDC.SelectObject(&bitmap);
  219. memDC.BitBlt(clientRect.left,clientRect.top,12,11,&bitmapDC,0,0,SRCCOPY);
  220. bitmapDC.SelectObject(pOldBitmap);
  221. bitmap.DeleteObject();
  222. pOldBitmap = NULL;
  223. bitmap.LoadBitmap(IDB_VERTICLE_SCROLLBAR_UPARROW);
  224. pOldBitmap = bitmapDC.SelectObject(&bitmap);
  225. memDC.BitBlt(clientRect.left,clientRect.top+11,12,26,&bitmapDC,0,0,SRCCOPY);
  226. bitmapDC.SelectObject(pOldBitmap);
  227. bitmap.DeleteObject();
  228. pOldBitmap = NULL;
  229. //draw the background (span)
  230. bitmap.LoadBitmap(IDB_VERTICLE_SCROLLBAR_SPAN);
  231. pOldBitmap = bitmapDC.SelectObject(&bitmap);
  232. int nHeight = clientRect.Height() - 37;
  233. memDC.StretchBlt(clientRect.left, clientRect.top+37, 12,nHeight,&bitmapDC, 0,0, 12, 1, SRCCOPY);
  234. bitmapDC.SelectObject(pOldBitmap);
  235. bitmap.DeleteObject();
  236. pOldBitmap = NULL;
  237. //draw the down arrow of the scrollbar
  238. bitmap.LoadBitmap(IDB_VERTICLE_SCROLLBAR_DOWNARROW);
  239. pOldBitmap = bitmapDC.SelectObject(&bitmap);
  240. memDC.BitBlt(clientRect.left,nHeight,12,26,&bitmapDC,0,0,SRCCOPY);
  241. bitmapDC.SelectObject(pOldBitmap);
  242. bitmap.DeleteObject();
  243. pOldBitmap = NULL;
  244. //draw the down arrow of the scrollbar
  245. bitmap.LoadBitmap(IDB_VERTICLE_SCROLLBAR_BOTTOM);
  246. pOldBitmap = bitmapDC.SelectObject(&bitmap);
  247. memDC.BitBlt(clientRect.left+1,nHeight+26,11,11,&bitmapDC,0,0,SRCCOPY);
  248. bitmapDC.SelectObject(pOldBitmap);
  249. bitmap.DeleteObject();
  250. pOldBitmap = NULL;
  251. //If there is nothing to scroll then don't
  252. //show the thumb control otherwise show it
  253. if(pList->GetScrollLimit(SB_VERT) != 0)
  254. {
  255. //draw the thumb control
  256. bitmap.LoadBitmap(IDB_VERTICLE_SCROLLBAR_THUMB);
  257. pOldBitmap = bitmapDC.SelectObject(&bitmap);
  258. memDC.BitBlt(clientRect.left,clientRect.top+nThumbTop,12,26,&bitmapDC,0,0,SRCCOPY);
  259. bitmapDC.SelectObject(pOldBitmap);
  260. bitmap.DeleteObject();
  261. pOldBitmap = NULL;
  262. }
  263. }
  264. void CSkinVerticleScrollbar::LimitThumbPosition()
  265. {
  266. CRect clientRect;
  267. GetClientRect(&clientRect);
  268. if(nThumbTop+26 > (clientRect.Height()-37))
  269. {
  270. nThumbTop = clientRect.Height()-62;
  271. }
  272. if(nThumbTop < (clientRect.top+36))
  273. {
  274. nThumbTop = clientRect.top+36;
  275. }
  276. }