ScrollBarEx.cpp 30 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297
  1. #include "StdAfx.h"
  2. #include "ScrollBarEx.h"
  3. CScrollBarEx::CScrollBarEx(void)
  4. {
  5. m_hOwnerWnd = NULL;
  6. m_nCtrlId = 0;
  7. memset(&m_rcScrollBar, 0, sizeof(m_rcScrollBar));
  8. m_bHorizontal = TRUE;
  9. m_bVisible = TRUE;
  10. m_bEnabled = TRUE;
  11. m_nRange = 0;
  12. m_nScrollPos = 0;
  13. m_nLineSize = 8;
  14. memset(&m_ptLastMouse, 0, sizeof(m_ptLastMouse));
  15. m_nLastScrollPos = 0;
  16. m_nLastScrollOffset = 0;
  17. m_nScrollRepeatDelay = 0;
  18. m_dwUseTimerId = m_dwTimerId = 0;
  19. m_bMouseHover = FALSE;
  20. m_bCaptured = FALSE;
  21. m_bMouseTracking = FALSE;
  22. m_lpBgImgN = NULL;
  23. m_lpBgImgH = NULL;
  24. m_lpBgImgP = NULL;
  25. m_lpBgImgD = NULL;
  26. m_bShowLeftUpBtn = TRUE;
  27. memset(&m_rcLeftUpBtn, 0, sizeof(m_rcLeftUpBtn));
  28. m_dwLeftUpBtnState = 0;
  29. m_lpLeftUpBtnImgN = NULL;
  30. m_lpLeftUpBtnImgH = NULL;
  31. m_lpLeftUpBtnImgP = NULL;
  32. m_lpLeftUpBtnImgD = NULL;
  33. m_bShowRightDownBtn = TRUE;
  34. memset(&m_rcRightDownBtn, 0, sizeof(m_rcRightDownBtn));
  35. m_dwRightDownBtnState = 0;
  36. m_lpRightDownBtnImgN = NULL;
  37. m_lpRightDownBtnImgH = NULL;
  38. m_lpRightDownBtnImgP = NULL;
  39. m_lpRightDownBtnImgD = NULL;
  40. memset(&m_rcThumb, 0, sizeof(m_rcThumb));
  41. m_dwThumbState = 0;
  42. m_lpThumbImgN = NULL;
  43. m_lpThumbImgH = NULL;
  44. m_lpThumbImgP = NULL;
  45. m_lpThumbImgD = NULL;
  46. m_lpRailImgN = NULL;
  47. m_lpRailImgH = NULL;
  48. m_lpRailImgP = NULL;
  49. m_lpRailImgD = NULL;
  50. }
  51. CScrollBarEx::~CScrollBarEx(void)
  52. {
  53. }
  54. BOOL CScrollBarEx::SetBgNormalPic(LPCTSTR lpszFileName)
  55. {
  56. RenderEngine->RemoveImage(m_lpBgImgN);
  57. m_lpBgImgN = RenderEngine->GetImage(lpszFileName);
  58. return (m_lpBgImgN != NULL) ? TRUE : FALSE;
  59. }
  60. BOOL CScrollBarEx::SetBgHotPic(LPCTSTR lpszFileName)
  61. {
  62. RenderEngine->RemoveImage(m_lpBgImgH);
  63. m_lpBgImgH = RenderEngine->GetImage(lpszFileName);
  64. return (m_lpBgImgH != NULL) ? TRUE : FALSE;
  65. }
  66. BOOL CScrollBarEx::SetBgPushedPic(LPCTSTR lpszFileName)
  67. {
  68. RenderEngine->RemoveImage(m_lpBgImgP);
  69. m_lpBgImgP = RenderEngine->GetImage(lpszFileName);
  70. return (m_lpBgImgP != NULL) ? TRUE : FALSE;
  71. }
  72. BOOL CScrollBarEx::SetBgDisabledPic(LPCTSTR lpszFileName)
  73. {
  74. RenderEngine->RemoveImage(m_lpBgImgD);
  75. m_lpBgImgD = RenderEngine->GetImage(lpszFileName);
  76. return (m_lpBgImgD != NULL) ? TRUE : FALSE;
  77. }
  78. BOOL CScrollBarEx::GetShowLeftUpBtn()
  79. {
  80. return m_bShowLeftUpBtn;
  81. }
  82. void CScrollBarEx::SetShowLeftUpBtn(BOOL bShow)
  83. {
  84. m_bShowLeftUpBtn = bShow;
  85. CalcScrollBarData();
  86. }
  87. BOOL CScrollBarEx::SetLeftUpBtnNormalPic(LPCTSTR lpszFileName)
  88. {
  89. RenderEngine->RemoveImage(m_lpLeftUpBtnImgN);
  90. m_lpLeftUpBtnImgN = RenderEngine->GetImage(lpszFileName);
  91. return (m_lpLeftUpBtnImgN != NULL) ? TRUE : FALSE;
  92. }
  93. BOOL CScrollBarEx::SetLeftUpBtnHotPic(LPCTSTR lpszFileName)
  94. {
  95. RenderEngine->RemoveImage(m_lpLeftUpBtnImgH);
  96. m_lpLeftUpBtnImgH = RenderEngine->GetImage(lpszFileName);
  97. return (m_lpLeftUpBtnImgH != NULL) ? TRUE : FALSE;
  98. }
  99. BOOL CScrollBarEx::SetLeftUpBtnPushedPic(LPCTSTR lpszFileName)
  100. {
  101. RenderEngine->RemoveImage(m_lpLeftUpBtnImgP);
  102. m_lpLeftUpBtnImgP = RenderEngine->GetImage(lpszFileName);
  103. return (m_lpLeftUpBtnImgP != NULL) ? TRUE : FALSE;
  104. }
  105. BOOL CScrollBarEx::SetLeftUpBtnDisabledPic(LPCTSTR lpszFileName)
  106. {
  107. RenderEngine->RemoveImage(m_lpLeftUpBtnImgD);
  108. m_lpLeftUpBtnImgD = RenderEngine->GetImage(lpszFileName);
  109. return (m_lpLeftUpBtnImgD != NULL) ? TRUE : FALSE;
  110. }
  111. BOOL CScrollBarEx::GetShowRightDownBtn()
  112. {
  113. return m_bShowRightDownBtn;
  114. }
  115. void CScrollBarEx::SetShowRightDownBtn(BOOL bShow)
  116. {
  117. m_bShowRightDownBtn = bShow;
  118. CalcScrollBarData();
  119. }
  120. BOOL CScrollBarEx::SetRightDownBtnNormalPic(LPCTSTR lpszFileName)
  121. {
  122. RenderEngine->RemoveImage(m_lpRightDownBtnImgN);
  123. m_lpRightDownBtnImgN = RenderEngine->GetImage(lpszFileName);
  124. return (m_lpRightDownBtnImgN != NULL) ? TRUE : FALSE;
  125. }
  126. BOOL CScrollBarEx::SetRightDownBtnHotPic(LPCTSTR lpszFileName)
  127. {
  128. RenderEngine->RemoveImage(m_lpRightDownBtnImgH);
  129. m_lpRightDownBtnImgH = RenderEngine->GetImage(lpszFileName);
  130. return (m_lpRightDownBtnImgH != NULL) ? TRUE : FALSE;
  131. }
  132. BOOL CScrollBarEx::SetRightDownBtnPushedPic(LPCTSTR lpszFileName)
  133. {
  134. RenderEngine->RemoveImage(m_lpRightDownBtnImgP);
  135. m_lpRightDownBtnImgP = RenderEngine->GetImage(lpszFileName);
  136. return (m_lpRightDownBtnImgP != NULL) ? TRUE : FALSE;
  137. }
  138. BOOL CScrollBarEx::SetRightDownBtnDisabledPic(LPCTSTR lpszFileName)
  139. {
  140. RenderEngine->RemoveImage(m_lpRightDownBtnImgD);
  141. m_lpRightDownBtnImgD = RenderEngine->GetImage(lpszFileName);
  142. return (m_lpRightDownBtnImgD != NULL) ? TRUE : FALSE;
  143. }
  144. BOOL CScrollBarEx::SetThumbNormalPic(LPCTSTR lpszFileName, RECT * lpNinePart/* = NULL*/)
  145. {
  146. RenderEngine->RemoveImage(m_lpThumbImgN);
  147. m_lpThumbImgN = RenderEngine->GetImage(lpszFileName);
  148. if (m_lpThumbImgN != NULL && lpNinePart != NULL)
  149. m_lpThumbImgN->SetNinePart(lpNinePart);
  150. return (m_lpThumbImgN != NULL) ? TRUE : FALSE;
  151. }
  152. BOOL CScrollBarEx::SetThumbHotPic(LPCTSTR lpszFileName, RECT * lpNinePart/* = NULL*/)
  153. {
  154. RenderEngine->RemoveImage(m_lpThumbImgH);
  155. m_lpThumbImgH = RenderEngine->GetImage(lpszFileName);
  156. if (m_lpThumbImgH != NULL && lpNinePart != NULL)
  157. m_lpThumbImgH->SetNinePart(lpNinePart);
  158. return (m_lpThumbImgH != NULL) ? TRUE : FALSE;
  159. }
  160. BOOL CScrollBarEx::SetThumbPushedPic(LPCTSTR lpszFileName, RECT * lpNinePart/* = NULL*/)
  161. {
  162. RenderEngine->RemoveImage(m_lpThumbImgP);
  163. m_lpThumbImgP = RenderEngine->GetImage(lpszFileName);
  164. if (m_lpThumbImgP != NULL && lpNinePart != NULL)
  165. m_lpThumbImgP->SetNinePart(lpNinePart);
  166. return (m_lpThumbImgP != NULL) ? TRUE : FALSE;
  167. }
  168. BOOL CScrollBarEx::SetThumbDisabledPic(LPCTSTR lpszFileName, RECT * lpNinePart/* = NULL*/)
  169. {
  170. RenderEngine->RemoveImage(m_lpThumbImgD);
  171. m_lpThumbImgD = RenderEngine->GetImage(lpszFileName);
  172. if (m_lpThumbImgD != NULL && lpNinePart != NULL)
  173. m_lpThumbImgD->SetNinePart(lpNinePart);
  174. return (m_lpThumbImgD != NULL) ? TRUE : FALSE;
  175. }
  176. BOOL CScrollBarEx::SetRailNormalPic(LPCTSTR lpszFileName)
  177. {
  178. RenderEngine->RemoveImage(m_lpRailImgN);
  179. m_lpRailImgN = RenderEngine->GetImage(lpszFileName);
  180. return (m_lpRailImgN != NULL) ? TRUE : FALSE;
  181. }
  182. BOOL CScrollBarEx::SetRailHotPic(LPCTSTR lpszFileName)
  183. {
  184. RenderEngine->RemoveImage(m_lpRailImgH);
  185. m_lpRailImgH = RenderEngine->GetImage(lpszFileName);
  186. return (m_lpRailImgH != NULL) ? TRUE : FALSE;
  187. }
  188. BOOL CScrollBarEx::SetRailPushedPic(LPCTSTR lpszFileName)
  189. {
  190. RenderEngine->RemoveImage(m_lpRailImgP);
  191. m_lpRailImgP = RenderEngine->GetImage(lpszFileName);
  192. return (m_lpRailImgP != NULL) ? TRUE : FALSE;
  193. }
  194. BOOL CScrollBarEx::SetRailDisabledPic(LPCTSTR lpszFileName)
  195. {
  196. RenderEngine->RemoveImage(m_lpRailImgD);
  197. m_lpRailImgD = RenderEngine->GetImage(lpszFileName);
  198. return (m_lpRailImgD != NULL) ? TRUE : FALSE;
  199. }
  200. BOOL CScrollBarEx::Create(HWND hOwnerWnd, UINT nCtrlId, RECT * lpRect,
  201. DWORD dwUseTimerId, BOOL bHorizontal/* = TRUE*/, BOOL bVisible/* = TRUE*/)
  202. {
  203. m_hOwnerWnd = hOwnerWnd;
  204. m_nCtrlId = nCtrlId;
  205. if (lpRect != NULL)
  206. m_rcScrollBar = *lpRect;
  207. m_dwUseTimerId = dwUseTimerId;
  208. m_bHorizontal = bHorizontal;
  209. m_bVisible = bVisible;
  210. m_bEnabled = TRUE;
  211. return TRUE;
  212. }
  213. BOOL CScrollBarEx::Destroy()
  214. {
  215. RenderEngine->RemoveImage(m_lpBgImgN);
  216. RenderEngine->RemoveImage(m_lpBgImgH);
  217. RenderEngine->RemoveImage(m_lpBgImgP);
  218. RenderEngine->RemoveImage(m_lpBgImgD);
  219. RenderEngine->RemoveImage(m_lpLeftUpBtnImgN);
  220. RenderEngine->RemoveImage(m_lpLeftUpBtnImgH);
  221. RenderEngine->RemoveImage(m_lpLeftUpBtnImgP);
  222. RenderEngine->RemoveImage(m_lpLeftUpBtnImgD);
  223. RenderEngine->RemoveImage(m_lpRightDownBtnImgN);
  224. RenderEngine->RemoveImage(m_lpRightDownBtnImgH);
  225. RenderEngine->RemoveImage(m_lpRightDownBtnImgP);
  226. RenderEngine->RemoveImage(m_lpRightDownBtnImgD);
  227. RenderEngine->RemoveImage(m_lpThumbImgN);
  228. RenderEngine->RemoveImage(m_lpThumbImgH);
  229. RenderEngine->RemoveImage(m_lpThumbImgP);
  230. RenderEngine->RemoveImage(m_lpThumbImgD);
  231. RenderEngine->RemoveImage(m_lpRailImgN);
  232. RenderEngine->RemoveImage(m_lpRailImgH);
  233. RenderEngine->RemoveImage(m_lpRailImgP);
  234. RenderEngine->RemoveImage(m_lpRailImgD);
  235. m_hOwnerWnd = NULL;
  236. m_nCtrlId = 0;
  237. memset(&m_rcScrollBar, 0, sizeof(m_rcScrollBar));
  238. m_bHorizontal = TRUE;
  239. m_bVisible = TRUE;
  240. m_bEnabled = TRUE;
  241. m_nRange = 0;
  242. m_nScrollPos = 0;
  243. m_nLineSize = 8;
  244. memset(&m_ptLastMouse, 0, sizeof(m_ptLastMouse));
  245. m_nLastScrollPos = 0;
  246. m_nLastScrollOffset = 0;
  247. m_nScrollRepeatDelay = 0;
  248. m_dwUseTimerId = m_dwTimerId = 0;
  249. m_bMouseHover = FALSE;
  250. m_bCaptured = FALSE;
  251. m_bMouseTracking = FALSE;
  252. m_bShowLeftUpBtn = TRUE;
  253. memset(&m_rcLeftUpBtn, 0, sizeof(m_rcLeftUpBtn));
  254. m_dwLeftUpBtnState = 0;
  255. m_bShowRightDownBtn = TRUE;
  256. memset(&m_rcRightDownBtn, 0, sizeof(m_rcRightDownBtn));
  257. m_dwRightDownBtnState = 0;
  258. memset(&m_rcThumb, 0, sizeof(m_rcThumb));
  259. m_dwThumbState = 0;
  260. return TRUE;
  261. }
  262. void CScrollBarEx::SetOwnerWnd(HWND hWnd)
  263. {
  264. m_hOwnerWnd = hWnd;
  265. }
  266. HWND CScrollBarEx::GetOwnerWnd()
  267. {
  268. return m_hOwnerWnd;
  269. }
  270. void CScrollBarEx::SetCtrlId(UINT nCtrlId)
  271. {
  272. m_nCtrlId = nCtrlId;
  273. }
  274. UINT CScrollBarEx::GetCtrlId()
  275. {
  276. return m_nCtrlId;
  277. }
  278. void CScrollBarEx::SetRect(RECT * lpRect)
  279. {
  280. if (lpRect != NULL)
  281. m_rcScrollBar = *lpRect;
  282. CalcScrollBarData();
  283. }
  284. void CScrollBarEx::GetRect(RECT * lpRect)
  285. {
  286. if (lpRect != NULL)
  287. *lpRect = m_rcScrollBar;
  288. }
  289. BOOL CScrollBarEx::IsHorizontal()
  290. {
  291. return m_bHorizontal;
  292. }
  293. void CScrollBarEx::SetHorizontal(BOOL bHorizontal/* = TRUE*/)
  294. {
  295. if (m_bHorizontal == bHorizontal)
  296. return;
  297. m_bHorizontal = bHorizontal;
  298. Invalidate();
  299. }
  300. BOOL CScrollBarEx::IsVisible()
  301. {
  302. return m_bVisible;
  303. }
  304. void CScrollBarEx::SetVisible(BOOL bVisible/* = TRUE*/)
  305. {
  306. if (m_bVisible == bVisible)
  307. return;
  308. m_bVisible = bVisible;
  309. Invalidate();
  310. }
  311. BOOL CScrollBarEx::IsEnabled()
  312. {
  313. return m_bEnabled;
  314. }
  315. void CScrollBarEx::SetEnabled(BOOL bEnable/* = TRUE*/)
  316. {
  317. if (m_bEnabled == bEnable)
  318. return;
  319. m_bEnabled = bEnable;
  320. if (!m_bEnabled)
  321. {
  322. m_dwLeftUpBtnState = 0;
  323. m_dwRightDownBtnState = 0;
  324. m_dwThumbState = 0;
  325. }
  326. Invalidate();
  327. }
  328. int CScrollBarEx::GetScrollRange()
  329. {
  330. return m_nRange;
  331. }
  332. void CScrollBarEx::SetScrollRange(int nRange)
  333. {
  334. if (m_nRange == nRange)
  335. return;
  336. m_nRange = nRange;
  337. if (m_nRange < 0)
  338. m_nRange = 0;
  339. if (m_nScrollPos > m_nRange)
  340. m_nScrollPos = m_nRange;
  341. CalcScrollBarData();
  342. Invalidate();
  343. }
  344. int CScrollBarEx::GetScrollPos()
  345. {
  346. return m_nScrollPos;
  347. }
  348. void CScrollBarEx::SetScrollPos(int nPos)
  349. {
  350. if (m_nScrollPos == nPos)
  351. return;
  352. m_nScrollPos = nPos;
  353. if (m_nScrollPos < 0)
  354. m_nScrollPos = 0;
  355. if (m_nScrollPos > m_nRange)
  356. m_nScrollPos = m_nRange;
  357. CalcScrollBarData();
  358. Invalidate();
  359. }
  360. int CScrollBarEx::GetLineSize()
  361. {
  362. return m_nLineSize;
  363. }
  364. void CScrollBarEx::SetLineSize(int nSize)
  365. {
  366. m_nLineSize = nSize;
  367. }
  368. LRESULT CScrollBarEx::WindowProc(UINT uMsg, WPARAM wParam, LPARAM lParam)
  369. {
  370. BOOL bMsgHandled = FALSE;
  371. switch (uMsg)
  372. {
  373. // case WM_PAINT:
  374. // OnPaint((HDC)wParam);
  375. // break;
  376. case WM_LBUTTONDOWN:
  377. {
  378. CPoint point(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam));
  379. if (IsVisible() && IsEnabled() && ::PtInRect(&m_rcScrollBar, point))
  380. {
  381. OnLButtonDown((UINT)wParam, point);
  382. bMsgHandled = TRUE;
  383. }
  384. }
  385. break;
  386. case WM_LBUTTONUP:
  387. {
  388. if (IsVisible() && IsEnabled() && IsCaptured())
  389. {
  390. OnLButtonUp((UINT)wParam, CPoint(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam)));
  391. bMsgHandled = TRUE;
  392. }
  393. }
  394. break;
  395. case WM_MOUSEMOVE:
  396. {
  397. CPoint point = CPoint(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam));
  398. if (IsVisible() && IsEnabled() && (IsCaptured() || IsMouseTracking() || ::PtInRect(&m_rcScrollBar, point)))
  399. {
  400. OnMouseMove((UINT)wParam, point);
  401. bMsgHandled = TRUE;
  402. }
  403. }
  404. break;
  405. case WM_MOUSELEAVE:
  406. {
  407. if (IsMouseTracking())
  408. {
  409. OnMouseLeave();
  410. bMsgHandled = TRUE;
  411. }
  412. }
  413. break;
  414. case WM_TIMER:
  415. {
  416. UINT_PTR nIDEvent = (UINT_PTR)wParam;
  417. if (nIDEvent == m_dwTimerId)
  418. {
  419. OnTimer(nIDEvent);
  420. bMsgHandled = TRUE;
  421. }
  422. }
  423. break;
  424. }
  425. return bMsgHandled;
  426. }
  427. void CScrollBarEx::OnPaint(CDC*pDC)
  428. {
  429. if (!m_hOwnerWnd)
  430. return;
  431. DrawBg(pDC);
  432. DrawLeftUpBtn(pDC);
  433. DrawRightDownBtn(pDC);
  434. DrawThumb(pDC);
  435. DrawRail(pDC);
  436. }
  437. void CScrollBarEx::OnLButtonDown(UINT nFlags, CPoint point)
  438. {
  439. if (!IsVisible() || !IsEnabled() || !::PtInRect(&m_rcScrollBar, point))
  440. return;
  441. ::SetFocus(m_hOwnerWnd);
  442. SetCapture();
  443. m_nLastScrollOffset = 0;
  444. m_nScrollRepeatDelay = 0;
  445. m_dwTimerId = ::SetTimer(m_hOwnerWnd, m_dwUseTimerId, 50, NULL);
  446. if (::PtInRect(&m_rcLeftUpBtn, point)) // 左/上箭头
  447. {
  448. m_dwLeftUpBtnState |= UISTATE_PUSHED;
  449. if (!m_bHorizontal) // 垂直
  450. {
  451. if (::IsWindow(m_hOwnerWnd))
  452. ::SendMessage(m_hOwnerWnd, WM_VSCROLL, SB_LINEUP, m_nCtrlId);
  453. else
  454. SetScrollPos(m_nScrollPos - m_nLineSize);
  455. }
  456. else // 水平
  457. {
  458. if (::IsWindow(m_hOwnerWnd))
  459. ::SendMessage(m_hOwnerWnd, WM_HSCROLL, SB_LINELEFT, m_nCtrlId);
  460. else
  461. SetScrollPos(m_nScrollPos - m_nLineSize);
  462. }
  463. }
  464. else if (::PtInRect(&m_rcRightDownBtn, point)) // 右/下箭头
  465. {
  466. m_dwRightDownBtnState |= UISTATE_PUSHED;
  467. if (!m_bHorizontal)
  468. {
  469. if (::IsWindow(m_hOwnerWnd))
  470. ::SendMessage(m_hOwnerWnd, WM_VSCROLL, SB_LINEDOWN, m_nCtrlId);
  471. else
  472. SetScrollPos(m_nScrollPos + m_nLineSize);
  473. }
  474. else
  475. {
  476. if (::IsWindow(m_hOwnerWnd))
  477. ::SendMessage(m_hOwnerWnd, WM_HSCROLL, SB_LINERIGHT, m_nCtrlId);
  478. else
  479. SetScrollPos(m_nScrollPos + m_nLineSize);
  480. }
  481. }
  482. else if (::PtInRect(&m_rcThumb, point)) // 滑块
  483. {
  484. m_dwThumbState |= (UISTATE_CAPTURED | UISTATE_PUSHED);
  485. m_ptLastMouse = point;
  486. m_nLastScrollPos = m_nScrollPos;
  487. }
  488. else
  489. {
  490. if (!m_bHorizontal) // 垂直
  491. {
  492. if (point.y < m_rcThumb.top) // 上箭头和滑块之间区域
  493. {
  494. if (::IsWindow(m_hOwnerWnd))
  495. ::SendMessage(m_hOwnerWnd, WM_VSCROLL, SB_PAGEUP, m_nCtrlId);
  496. else
  497. SetScrollPos(m_nScrollPos + m_rcScrollBar.top - m_rcScrollBar.bottom);
  498. }
  499. else if (point.y > m_rcThumb.bottom) // 下箭头和滑块之间区域
  500. {
  501. if (::IsWindow(m_hOwnerWnd))
  502. ::SendMessage(m_hOwnerWnd, WM_VSCROLL, SB_PAGEDOWN, m_nCtrlId);
  503. else
  504. SetScrollPos(m_nScrollPos - m_rcScrollBar.top + m_rcScrollBar.bottom);
  505. }
  506. }
  507. else // 水平
  508. {
  509. if (point.x < m_rcThumb.left) // 左箭头和滑块之间区域
  510. {
  511. if (::IsWindow(m_hOwnerWnd))
  512. ::SendMessage(m_hOwnerWnd, WM_HSCROLL, SB_PAGELEFT, m_nCtrlId);
  513. else
  514. SetScrollPos(m_nScrollPos + m_rcScrollBar.left - m_rcScrollBar.right);
  515. }
  516. else if (point.x > m_rcThumb.right) // 右箭头和滑块之间区域
  517. {
  518. if (::IsWindow(m_hOwnerWnd))
  519. ::SendMessage(m_hOwnerWnd, WM_HSCROLL, SB_PAGERIGHT, m_nCtrlId);
  520. else
  521. SetScrollPos(m_nScrollPos - m_rcScrollBar.left + m_rcScrollBar.right);
  522. }
  523. }
  524. }
  525. }
  526. void CScrollBarEx::OnLButtonUp(UINT nFlags, CPoint point)
  527. {
  528. if (!IsVisible() || !IsEnabled()/* || !::PtInRect(&m_rcScrollBar, point)*/)
  529. return;
  530. ReleaseCapture();
  531. m_nScrollRepeatDelay = 0;
  532. m_nLastScrollOffset = 0;
  533. ::KillTimer(m_hOwnerWnd, m_dwTimerId);
  534. if ((m_dwThumbState & UISTATE_CAPTURED) != 0)
  535. {
  536. m_dwThumbState &= ~(UISTATE_CAPTURED | UISTATE_PUSHED);
  537. Invalidate();
  538. }
  539. else if((m_dwLeftUpBtnState & UISTATE_PUSHED) != 0)
  540. {
  541. m_dwLeftUpBtnState &= ~UISTATE_PUSHED;
  542. Invalidate();
  543. }
  544. else if((m_dwRightDownBtnState & UISTATE_PUSHED) != 0)
  545. {
  546. m_dwRightDownBtnState &= ~UISTATE_PUSHED;
  547. Invalidate();
  548. }
  549. }
  550. void CScrollBarEx::OnMouseMove(UINT nFlags, CPoint point)
  551. {
  552. if (!IsVisible() || !IsEnabled())
  553. return;
  554. // if (::PtInRect(&m_rcScrollBar, point))
  555. // {
  556. // if (!m_bMouseHover) // MouseEnter
  557. // m_bMouseHover = TRUE;
  558. // }
  559. // else
  560. // {
  561. // if (m_bMouseHover) // MouseLeave
  562. // m_bMouseHover = FALSE;
  563. // }
  564. if ((m_dwThumbState & UISTATE_CAPTURED) != 0)
  565. {
  566. if (!m_bHorizontal)
  567. {
  568. m_nLastScrollOffset = (point.y - m_ptLastMouse.y) * m_nRange / \
  569. (m_rcScrollBar.Height() - m_rcThumb.bottom + m_rcThumb.top - 2 * m_rcScrollBar.Width());
  570. }
  571. else
  572. {
  573. m_nLastScrollOffset = (point.x - m_ptLastMouse.x) * m_nRange / \
  574. (m_rcScrollBar.Width() - m_rcThumb.right + m_rcThumb.left - 2 * m_rcScrollBar.Height());
  575. }
  576. }
  577. if (::PtInRect(&m_rcScrollBar, point))
  578. {
  579. if (!m_bMouseHover) // MouseEnter
  580. {
  581. m_bMouseHover = TRUE;
  582. m_bMouseTracking = TRUE;
  583. StartTrackMouseLeave();
  584. }
  585. // if ((m_dwThumbState & UISTATE_CAPTURED) != 0)
  586. // {
  587. // if (!m_bHorizontal)
  588. // {
  589. // m_nLastScrollOffset = (point.y - m_ptLastMouse.y) * m_nRange / \
  590. // (m_rcScrollBar.bottom - m_rcScrollBar.top - m_rcThumb.bottom + m_rcThumb.top - 2 * m_rcScrollBar.Width());
  591. // wchar_t c[100];
  592. // wsprintf(c, _T("%d\n"), m_nLastScrollOffset);
  593. // ::OutputDebugString(c);
  594. // }
  595. // else
  596. // {
  597. // m_nLastScrollOffset = (point.x - m_ptLastMouse.x) * m_nRange / \
  598. // (m_rcScrollBar.right - m_rcScrollBar.left - m_rcThumb.right + m_rcThumb.left - 2 * m_rcScrollBar.Height());
  599. // }
  600. // }
  601. /*else */if ((m_dwLeftUpBtnState & UISTATE_PUSHED) != 0)
  602. {
  603. }
  604. else if ((m_dwRightDownBtnState & UISTATE_PUSHED) != 0)
  605. {
  606. }
  607. else
  608. {
  609. if (::PtInRect(&m_rcLeftUpBtn, point))
  610. {
  611. if ((m_dwLeftUpBtnState & UISTATE_HOT) == 0)
  612. {
  613. m_dwLeftUpBtnState |= UISTATE_HOT;
  614. m_dwRightDownBtnState &= ~UISTATE_HOT;
  615. m_dwThumbState &= ~UISTATE_HOT;
  616. Invalidate();
  617. }
  618. }
  619. else if (::PtInRect(&m_rcRightDownBtn, point))
  620. {
  621. if ((m_dwRightDownBtnState & UISTATE_HOT) == 0)
  622. {
  623. m_dwRightDownBtnState |= UISTATE_HOT;
  624. m_dwLeftUpBtnState &= ~UISTATE_HOT;
  625. m_dwThumbState &= ~UISTATE_HOT;
  626. Invalidate();
  627. }
  628. }
  629. else if (::PtInRect(&m_rcThumb, point))
  630. {
  631. if ((m_dwThumbState & UISTATE_HOT) == 0)
  632. {
  633. m_dwThumbState |= UISTATE_HOT;
  634. m_dwLeftUpBtnState &= ~UISTATE_HOT;
  635. m_dwRightDownBtnState &= ~UISTATE_HOT;
  636. Invalidate();
  637. }
  638. }
  639. else
  640. {
  641. if ((m_dwLeftUpBtnState & UISTATE_HOT) ||
  642. (m_dwRightDownBtnState & UISTATE_HOT) ||
  643. (m_dwThumbState & UISTATE_HOT))
  644. {
  645. m_dwLeftUpBtnState &= ~UISTATE_HOT;
  646. m_dwRightDownBtnState &= ~UISTATE_HOT;
  647. m_dwThumbState &= ~UISTATE_HOT;
  648. Invalidate();
  649. }
  650. }
  651. }
  652. }
  653. else
  654. {
  655. if (m_bMouseHover) // MouseLeave
  656. {
  657. m_bMouseHover = FALSE;
  658. m_bMouseTracking = FALSE;
  659. if ((m_dwLeftUpBtnState & UISTATE_HOT) ||
  660. (m_dwRightDownBtnState & UISTATE_HOT) ||
  661. (m_dwThumbState & UISTATE_HOT))
  662. {
  663. m_dwLeftUpBtnState &= ~UISTATE_HOT;
  664. m_dwRightDownBtnState &= ~UISTATE_HOT;
  665. m_dwThumbState &= ~UISTATE_HOT;
  666. Invalidate();
  667. }
  668. }
  669. }
  670. }
  671. void CScrollBarEx::OnMouseLeave()
  672. {
  673. if (!IsVisible() || !IsEnabled() || !m_bMouseHover)
  674. return;
  675. m_bMouseHover = FALSE;
  676. m_bMouseTracking = FALSE;
  677. if ((m_dwLeftUpBtnState & UISTATE_HOT) ||
  678. (m_dwRightDownBtnState & UISTATE_HOT) ||
  679. (m_dwThumbState & UISTATE_HOT))
  680. {
  681. m_dwLeftUpBtnState &= ~UISTATE_HOT;
  682. m_dwRightDownBtnState &= ~UISTATE_HOT;
  683. m_dwThumbState &= ~UISTATE_HOT;
  684. Invalidate();
  685. }
  686. }
  687. void CScrollBarEx::OnTimer(UINT_PTR nIDEvent)
  688. {
  689. if (nIDEvent == m_dwTimerId)
  690. {
  691. ++m_nScrollRepeatDelay;
  692. if ((m_dwThumbState & UISTATE_CAPTURED) != 0) // 拖动滑块
  693. {
  694. if (!m_bHorizontal) // 垂直
  695. {
  696. SetScrollPos(m_nLastScrollPos + m_nLastScrollOffset);
  697. if (::IsWindow(m_hOwnerWnd))
  698. ::SendMessage(m_hOwnerWnd, WM_VSCROLL, SB_THUMBTRACK, m_nCtrlId); // ?
  699. }
  700. else
  701. {
  702. SetScrollPos(m_nLastScrollPos + m_nLastScrollOffset);
  703. if (::IsWindow(m_hOwnerWnd))
  704. ::SendMessage(m_hOwnerWnd, WM_HSCROLL, SB_THUMBTRACK, m_nCtrlId); // ?
  705. }
  706. Invalidate();
  707. }
  708. else if((m_dwLeftUpBtnState & UISTATE_PUSHED) != 0) // 长按左/上箭头
  709. {
  710. if (m_nScrollRepeatDelay <= 5)
  711. return;
  712. if (!m_bHorizontal) // 垂直
  713. {
  714. if (::IsWindow(m_hOwnerWnd))
  715. ::SendMessage(m_hOwnerWnd, WM_VSCROLL, SB_LINEUP, m_nCtrlId);
  716. else
  717. SetScrollPos(m_nScrollPos - m_nLineSize);
  718. }
  719. else // 水平
  720. {
  721. if (::IsWindow(m_hOwnerWnd))
  722. ::SendMessage(m_hOwnerWnd, WM_HSCROLL, SB_LINELEFT, m_nCtrlId);
  723. else
  724. SetScrollPos(m_nScrollPos - m_nLineSize);
  725. }
  726. }
  727. else if((m_dwRightDownBtnState & UISTATE_PUSHED) != 0) // 长按右/下箭头
  728. {
  729. if (m_nScrollRepeatDelay <= 5)
  730. return;
  731. if (!m_bHorizontal)
  732. {
  733. if (::IsWindow(m_hOwnerWnd))
  734. ::SendMessage(m_hOwnerWnd, WM_VSCROLL, SB_LINEDOWN, m_nCtrlId);
  735. else
  736. SetScrollPos(m_nScrollPos + m_nLineSize);
  737. }
  738. else
  739. {
  740. if (::IsWindow(m_hOwnerWnd))
  741. ::SendMessage(m_hOwnerWnd, WM_HSCROLL, SB_LINERIGHT, m_nCtrlId);
  742. else
  743. SetScrollPos(m_nScrollPos + m_nLineSize);
  744. }
  745. }
  746. else
  747. {
  748. if (m_nScrollRepeatDelay <= 5)
  749. return;
  750. POINT pt = {0};
  751. ::GetCursorPos(&pt);
  752. ::ScreenToClient(m_hOwnerWnd, &pt);
  753. if (!m_bHorizontal) // 垂直
  754. {
  755. if (pt.y < m_rcThumb.top) // 上箭头和滑块之间区域
  756. {
  757. if (::IsWindow(m_hOwnerWnd))
  758. ::SendMessage(m_hOwnerWnd, WM_VSCROLL, SB_PAGEUP, m_nCtrlId);
  759. else
  760. SetScrollPos(m_nScrollPos + m_rcScrollBar.top - m_rcScrollBar.bottom);
  761. }
  762. else if (pt.y > m_rcThumb.bottom) // 下箭头和滑块之间区域
  763. {
  764. if (::IsWindow(m_hOwnerWnd))
  765. ::SendMessage(m_hOwnerWnd, WM_VSCROLL, SB_PAGEDOWN, m_nCtrlId);
  766. else
  767. SetScrollPos(m_nScrollPos - m_rcScrollBar.top + m_rcScrollBar.bottom);
  768. }
  769. }
  770. else // 水平
  771. {
  772. if (pt.x < m_rcThumb.left) // 左箭头和滑块之间区域
  773. {
  774. if (::IsWindow(m_hOwnerWnd))
  775. ::SendMessage(m_hOwnerWnd, WM_HSCROLL, SB_PAGELEFT, m_nCtrlId);
  776. else
  777. SetScrollPos(m_nScrollPos + m_rcScrollBar.left - m_rcScrollBar.right);
  778. }
  779. else if (pt.x > m_rcThumb.right) // 右箭头和滑块之间区域
  780. {
  781. if (::IsWindow(m_hOwnerWnd))
  782. ::SendMessage(m_hOwnerWnd, WM_HSCROLL, SB_PAGERIGHT, m_nCtrlId);
  783. else
  784. SetScrollPos(m_nScrollPos - m_rcScrollBar.left + m_rcScrollBar.right);
  785. }
  786. }
  787. }
  788. }
  789. }
  790. void CScrollBarEx::DrawBg(CDC*pDC)
  791. {
  792. if (!IsEnabled())
  793. m_dwThumbState |= UISTATE_DISABLED;
  794. else
  795. m_dwThumbState &= ~UISTATE_DISABLED;
  796. if ((m_dwThumbState & UISTATE_DISABLED) != 0)
  797. {
  798. if (m_lpBgImgD != NULL && !m_lpBgImgD->IsNull())
  799. m_lpBgImgD->DrawImage(pDC, m_rcScrollBar);
  800. }
  801. else if((m_dwThumbState & UISTATE_PUSHED) != 0)
  802. {
  803. if (m_lpBgImgP != NULL && !m_lpBgImgP->IsNull())
  804. m_lpBgImgP->DrawImage(pDC, m_rcScrollBar);
  805. }
  806. else if((m_dwThumbState & UISTATE_HOT) != 0)
  807. {
  808. if (m_lpBgImgH != NULL && !m_lpBgImgH->IsNull())
  809. m_lpBgImgH->DrawImage(pDC, m_rcScrollBar);
  810. }
  811. else
  812. {
  813. if (m_lpBgImgN != NULL && !m_lpBgImgN->IsNull())
  814. m_lpBgImgN->DrawImage(pDC, m_rcScrollBar);
  815. }
  816. }
  817. void CScrollBarEx::DrawLeftUpBtn(CDC*pDC)
  818. {
  819. if (!m_bShowLeftUpBtn)
  820. return;
  821. if (!IsEnabled())
  822. m_dwLeftUpBtnState |= UISTATE_DISABLED;
  823. else
  824. m_dwLeftUpBtnState &= ~ UISTATE_DISABLED;
  825. if ((m_dwLeftUpBtnState & UISTATE_DISABLED) != 0)
  826. {
  827. if (m_lpLeftUpBtnImgD != NULL && !m_lpLeftUpBtnImgD->IsNull())
  828. m_lpLeftUpBtnImgD->DrawImage(pDC, m_rcLeftUpBtn);
  829. }
  830. else if((m_dwLeftUpBtnState & UISTATE_PUSHED) != 0)
  831. {
  832. if (m_lpLeftUpBtnImgP != NULL && !m_lpLeftUpBtnImgP->IsNull())
  833. m_lpLeftUpBtnImgP->DrawImage(pDC, m_rcLeftUpBtn);
  834. }
  835. else if((m_dwLeftUpBtnState & UISTATE_HOT) != 0)
  836. {
  837. if (m_lpLeftUpBtnImgH != NULL && !m_lpLeftUpBtnImgH->IsNull())
  838. m_lpLeftUpBtnImgH->DrawImage(pDC, m_rcLeftUpBtn);
  839. }
  840. else
  841. {
  842. if (m_lpLeftUpBtnImgN != NULL && !m_lpLeftUpBtnImgN->IsNull())
  843. m_lpLeftUpBtnImgN->DrawImage(pDC, m_rcLeftUpBtn);
  844. }
  845. }
  846. void CScrollBarEx::DrawRightDownBtn(CDC*pDC)
  847. {
  848. if (!m_bShowRightDownBtn)
  849. return;
  850. if (!IsEnabled())
  851. m_dwRightDownBtnState |= UISTATE_DISABLED;
  852. else
  853. m_dwRightDownBtnState &= ~ UISTATE_DISABLED;
  854. if ((m_dwRightDownBtnState & UISTATE_DISABLED) != 0)
  855. {
  856. if (m_lpRightDownBtnImgD != NULL && !m_lpRightDownBtnImgD->IsNull())
  857. m_lpRightDownBtnImgD->DrawImage(pDC, m_rcRightDownBtn);
  858. }
  859. else if ((m_dwRightDownBtnState & UISTATE_PUSHED) != 0)
  860. {
  861. if (m_lpRightDownBtnImgP != NULL && !m_lpRightDownBtnImgP->IsNull())
  862. m_lpRightDownBtnImgP->DrawImage(pDC, m_rcRightDownBtn);
  863. }
  864. else if ((m_dwRightDownBtnState & UISTATE_HOT) != 0)
  865. {
  866. if (m_lpRightDownBtnImgH != NULL && !m_lpRightDownBtnImgH->IsNull())
  867. m_lpRightDownBtnImgH->DrawImage(pDC, m_rcRightDownBtn);
  868. }
  869. else
  870. {
  871. if (m_lpRightDownBtnImgN != NULL && !m_lpRightDownBtnImgN->IsNull())
  872. m_lpRightDownBtnImgN->DrawImage(pDC, m_rcRightDownBtn);
  873. }
  874. }
  875. void CScrollBarEx::DrawThumb(CDC*pDC)
  876. {
  877. if (m_rcThumb.left == 0 && m_rcThumb.top == 0 && m_rcThumb.right == 0 && m_rcThumb.bottom == 0)
  878. return;
  879. if (!IsEnabled())
  880. m_dwThumbState |= UISTATE_DISABLED;
  881. else
  882. m_dwThumbState &= ~ UISTATE_DISABLED;
  883. if ((m_dwThumbState & UISTATE_DISABLED) != 0)
  884. {
  885. if (m_lpThumbImgD != NULL && !m_lpThumbImgD->IsNull())
  886. m_lpThumbImgD->Draw(pDC, m_rcThumb);
  887. }
  888. else if ((m_dwThumbState & UISTATE_PUSHED) != 0 )
  889. {
  890. if (m_lpThumbImgP != NULL && !m_lpThumbImgP->IsNull())
  891. m_lpThumbImgP->Draw(pDC, m_rcThumb);
  892. }
  893. else if ((m_dwThumbState & UISTATE_HOT) != 0)
  894. {
  895. if (m_lpThumbImgH != NULL && !m_lpThumbImgH->IsNull())
  896. m_lpThumbImgH->Draw(pDC, m_rcThumb);
  897. }
  898. else
  899. {
  900. if (m_lpThumbImgN != NULL && !m_lpThumbImgN->IsNull())
  901. m_lpThumbImgN->Draw(pDC, m_rcThumb);
  902. }
  903. }
  904. void CScrollBarEx::DrawRail(CDC*pDC)
  905. {
  906. if (m_rcThumb.left == 0 && m_rcThumb.top == 0 && m_rcThumb.right == 0 && m_rcThumb.bottom == 0)
  907. return;
  908. if (!IsEnabled())
  909. m_dwThumbState |= UISTATE_DISABLED;
  910. else
  911. m_dwThumbState &= ~ UISTATE_DISABLED;
  912. CRect rcRail;
  913. if (!m_bHorizontal)
  914. {
  915. rcRail = CRect(0,0,0,0);
  916. }
  917. else
  918. {
  919. rcRail = CRect(0,0,0,0);
  920. }
  921. if ((m_dwThumbState & UISTATE_DISABLED) != 0)
  922. {
  923. if (m_lpRailImgD != NULL && !m_lpRailImgD->IsNull())
  924. m_lpRailImgD->DrawImage(pDC, rcRail);
  925. }
  926. else if((m_dwThumbState & UISTATE_PUSHED) != 0)
  927. {
  928. if (m_lpRailImgP != NULL && !m_lpRailImgP->IsNull())
  929. m_lpRailImgP->DrawImage(pDC, rcRail);
  930. }
  931. else if((m_dwThumbState & UISTATE_HOT) != 0)
  932. {
  933. if (m_lpRailImgH != NULL && !m_lpRailImgH->IsNull())
  934. m_lpRailImgH->DrawImage(pDC, rcRail);
  935. }
  936. else
  937. {
  938. if (m_lpRailImgN != NULL && !m_lpRailImgN->IsNull())
  939. m_lpRailImgN->DrawImage(pDC, rcRail);
  940. }
  941. }
  942. BOOL CScrollBarEx::Invalidate(BOOL bErase/* = TRUE*/)
  943. {
  944. if (::IsWindow(m_hOwnerWnd))
  945. return ::InvalidateRect(m_hOwnerWnd, &m_rcScrollBar, bErase);
  946. else
  947. return FALSE;
  948. }
  949. void CScrollBarEx::CalcScrollBarData()
  950. {
  951. if (m_bHorizontal) // 水平
  952. {
  953. int cx = m_rcScrollBar.Width();
  954. int cy = m_rcScrollBar.Height();
  955. if (m_bShowLeftUpBtn)
  956. cx -= cy;
  957. if (m_bShowRightDownBtn)
  958. cx -= cy;
  959. if (cx > cy)
  960. {
  961. m_rcLeftUpBtn.left = m_rcScrollBar.left; // 计算左箭头按钮区域
  962. m_rcLeftUpBtn.top = m_rcScrollBar.top;
  963. if (m_bShowLeftUpBtn)
  964. {
  965. m_rcLeftUpBtn.right = m_rcScrollBar.left + cy;
  966. m_rcLeftUpBtn.bottom = m_rcScrollBar.top + cy;
  967. }
  968. else
  969. {
  970. m_rcLeftUpBtn.right = m_rcLeftUpBtn.left;
  971. m_rcLeftUpBtn.bottom = m_rcLeftUpBtn.top;
  972. }
  973. m_rcRightDownBtn.top = m_rcScrollBar.top; // 计算右箭头按钮区域
  974. m_rcRightDownBtn.right = m_rcScrollBar.right;
  975. if (m_bShowRightDownBtn)
  976. {
  977. m_rcRightDownBtn.left = m_rcScrollBar.right - cy;
  978. m_rcRightDownBtn.bottom = m_rcScrollBar.top + cy;
  979. }
  980. else
  981. {
  982. m_rcRightDownBtn.left = m_rcRightDownBtn.right;
  983. m_rcRightDownBtn.bottom = m_rcRightDownBtn.top;
  984. }
  985. m_rcThumb.top = m_rcScrollBar.top;
  986. m_rcThumb.bottom = m_rcScrollBar.top + cy;
  987. if (m_nRange > 0)
  988. {
  989. int cxThumb = cx * m_rcScrollBar.Width() / (m_nRange + m_rcScrollBar.Width());
  990. if (cxThumb < cy)
  991. cxThumb = cy;
  992. m_rcThumb.left = m_nScrollPos * (cx - cxThumb) / m_nRange + m_rcLeftUpBtn.right;
  993. m_rcThumb.right = m_rcThumb.left + cxThumb;
  994. if (m_rcThumb.right > m_rcRightDownBtn.left)
  995. {
  996. m_rcThumb.left = m_rcRightDownBtn.left - cxThumb;
  997. m_rcThumb.right = m_rcRightDownBtn.left;
  998. }
  999. }
  1000. else
  1001. {
  1002. m_rcThumb.left = m_rcLeftUpBtn.right;
  1003. m_rcThumb.right = m_rcRightDownBtn.left;
  1004. }
  1005. }
  1006. else
  1007. {
  1008. int cxButton = m_rcScrollBar.Width() / 2;
  1009. if (cxButton > cy)
  1010. cxButton = cy;
  1011. m_rcLeftUpBtn.left = m_rcScrollBar.left;
  1012. m_rcLeftUpBtn.top = m_rcScrollBar.top;
  1013. if (m_bShowLeftUpBtn)
  1014. {
  1015. m_rcLeftUpBtn.right = m_rcScrollBar.left + cxButton;
  1016. m_rcLeftUpBtn.bottom = m_rcScrollBar.top + cy;
  1017. }
  1018. else
  1019. {
  1020. m_rcLeftUpBtn.right = m_rcLeftUpBtn.left;
  1021. m_rcLeftUpBtn.bottom = m_rcLeftUpBtn.top;
  1022. }
  1023. m_rcRightDownBtn.top = m_rcScrollBar.top;
  1024. m_rcRightDownBtn.right = m_rcScrollBar.right;
  1025. if (m_bShowRightDownBtn)
  1026. {
  1027. m_rcRightDownBtn.left = m_rcScrollBar.right - cxButton;
  1028. m_rcRightDownBtn.bottom = m_rcScrollBar.top + cy;
  1029. }
  1030. else
  1031. {
  1032. m_rcRightDownBtn.left = m_rcRightDownBtn.right;
  1033. m_rcRightDownBtn.bottom = m_rcRightDownBtn.top;
  1034. }
  1035. memset(&m_rcThumb, 0, sizeof(m_rcThumb));
  1036. }
  1037. }
  1038. else // 垂直
  1039. {
  1040. int cx = m_rcScrollBar.Width();
  1041. int cy = m_rcScrollBar.Height();
  1042. if (m_bShowLeftUpBtn)
  1043. cy -= cx;
  1044. if (m_bShowRightDownBtn)
  1045. cy -= cx;
  1046. if (cy > cx)
  1047. {
  1048. m_rcLeftUpBtn.left = m_rcScrollBar.left;
  1049. m_rcLeftUpBtn.top = m_rcScrollBar.top;
  1050. if (m_bShowLeftUpBtn)
  1051. {
  1052. m_rcLeftUpBtn.right = m_rcScrollBar.left + cx;
  1053. m_rcLeftUpBtn.bottom = m_rcScrollBar.top + cx;
  1054. }
  1055. else
  1056. {
  1057. m_rcLeftUpBtn.right = m_rcLeftUpBtn.left;
  1058. m_rcLeftUpBtn.bottom = m_rcLeftUpBtn.top;
  1059. }
  1060. m_rcRightDownBtn.left = m_rcScrollBar.left;
  1061. m_rcRightDownBtn.bottom = m_rcScrollBar.bottom;
  1062. if (m_bShowRightDownBtn)
  1063. {
  1064. m_rcRightDownBtn.top = m_rcScrollBar.bottom - cx;
  1065. m_rcRightDownBtn.right = m_rcScrollBar.left + cx;
  1066. }
  1067. else
  1068. {
  1069. m_rcRightDownBtn.top = m_rcRightDownBtn.bottom;
  1070. m_rcRightDownBtn.right = m_rcRightDownBtn.left;
  1071. }
  1072. m_rcThumb.left = m_rcScrollBar.left;
  1073. m_rcThumb.right = m_rcScrollBar.left + cx;
  1074. if (m_nRange > 0)
  1075. {
  1076. // 滚动条高度 * (显示大小 / 总大小)
  1077. // 滚动条高度 * 显示大小 / 总大小
  1078. int cyThumb = cy * m_rcScrollBar.Height() / (m_nRange + m_rcScrollBar.Height());
  1079. if (cyThumb < cx)
  1080. cyThumb = cx;
  1081. m_rcThumb.top = m_nScrollPos * (cy - cyThumb) / m_nRange + m_rcLeftUpBtn.bottom;
  1082. m_rcThumb.bottom = m_rcThumb.top + cyThumb;
  1083. if (m_rcThumb.bottom > m_rcRightDownBtn.top)
  1084. {
  1085. m_rcThumb.top = m_rcRightDownBtn.top - cyThumb;
  1086. m_rcThumb.bottom = m_rcRightDownBtn.top;
  1087. }
  1088. }
  1089. else
  1090. {
  1091. m_rcThumb.top = m_rcLeftUpBtn.bottom;
  1092. m_rcThumb.bottom = m_rcRightDownBtn.top;
  1093. }
  1094. }
  1095. else
  1096. {
  1097. int cyButton = m_rcScrollBar.Height() / 2;
  1098. if (cyButton > cx)
  1099. cyButton = cx;
  1100. m_rcLeftUpBtn.left = m_rcScrollBar.left;
  1101. m_rcLeftUpBtn.top = m_rcScrollBar.top;
  1102. if (m_bShowLeftUpBtn)
  1103. {
  1104. m_rcLeftUpBtn.right = m_rcScrollBar.left + cx;
  1105. m_rcLeftUpBtn.bottom = m_rcScrollBar.top + cyButton;
  1106. }
  1107. else
  1108. {
  1109. m_rcLeftUpBtn.right = m_rcLeftUpBtn.left;
  1110. m_rcLeftUpBtn.bottom = m_rcLeftUpBtn.top;
  1111. }
  1112. m_rcRightDownBtn.left = m_rcScrollBar.left;
  1113. m_rcRightDownBtn.bottom = m_rcScrollBar.bottom;
  1114. if (m_bShowRightDownBtn)
  1115. {
  1116. m_rcRightDownBtn.top = m_rcScrollBar.bottom - cyButton;
  1117. m_rcRightDownBtn.right = m_rcScrollBar.left + cx;
  1118. }
  1119. else
  1120. {
  1121. m_rcRightDownBtn.top = m_rcRightDownBtn.bottom;
  1122. m_rcRightDownBtn.right = m_rcRightDownBtn.left;
  1123. }
  1124. memset(&m_rcThumb, 0, sizeof(m_rcThumb));
  1125. }
  1126. }
  1127. }
  1128. HWND CScrollBarEx::SetCapture()
  1129. {
  1130. m_bCaptured = TRUE;
  1131. return ::SetCapture(m_hOwnerWnd);
  1132. }
  1133. BOOL CScrollBarEx::ReleaseCapture()
  1134. {
  1135. m_bCaptured = FALSE;
  1136. return ::ReleaseCapture();
  1137. }
  1138. BOOL CScrollBarEx::IsCaptured()
  1139. {
  1140. return m_bCaptured;
  1141. }
  1142. BOOL CScrollBarEx::StartTrackMouseLeave()
  1143. {
  1144. TRACKMOUSEEVENT tme = { 0 };
  1145. tme.cbSize = sizeof(tme);
  1146. tme.dwFlags = TME_LEAVE;
  1147. tme.hwndTrack = m_hOwnerWnd;
  1148. return _TrackMouseEvent(&tme);
  1149. }
  1150. BOOL CScrollBarEx::IsMouseTracking()
  1151. {
  1152. return m_bMouseTracking;
  1153. }