SkinUI_ScrollBar.cpp 45 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806
  1. //////////////////////////////////////////////////////////////////////////////////
  2. #include "internal.h"
  3. #include "SkinUI_ScrollBar.h"
  4. #define WIN32_LEAN_AND_MEAN
  5. static TCHAR g_szPropSB[] = TEXT("PROP_SkinUI");
  6. //在这里规定滚动条的图片资源大小为110*110,并且按照以下的规格就行图片的划分
  7. static POINT ptArray[6][6] =
  8. {
  9. { {0, 0}, {19, 0}, {38, 0}, {57, 0}, {76, 0}, {95, 0} },
  10. { {0, 19}, {19, 19}, {38, 19}, {57, 19}, {76, 19}, {95, 19} },
  11. { {0, 38}, {19, 38}, {38, 38}, {57, 38}, {76, 38}, {95, 38} },
  12. { {0, 57}, {19, 57}, {38, 57}, {57, 57}, {76, 57}, {95, 57} },
  13. { {0, 76}, {19, 76}, {38, 76}, {57, 76}, {76, 76}, {95, 76} },
  14. { {0, 95}, {19, 95}, {38, 95}, {57, 95}, {76, 95}, {95, 95} }
  15. };
  16. // Public interfaces
  17. //----------------------------------------------------------
  18. // Name : SkinUI_Init()
  19. // Desc : Initialize the skin scrollbar library
  20. //----------------------------------------------------------
  21. BOOL WINAPI SkinUI_Init(HWND hwnd, HBITMAP hBmp)
  22. {
  23. LPSB psb;
  24. DWORD dwStyle;
  25. if( !IsWindow(hwnd) ) {
  26. SetLastError(ERROR_INVALID_HANDLE);
  27. return FALSE;
  28. }
  29. if( SkinUI_IsValid(hwnd) )
  30. return FALSE;
  31. // Allocates memory
  32. psb = (LPSB)LocalAlloc(LPTR, sizeof(SB));
  33. if( psb == NULL )
  34. return FALSE;
  35. ZeroMemory(psb, sizeof(SB));
  36. dwStyle = GetWindowLong(hwnd, GWL_STYLE);
  37. psb->Horz.cbSize = psb->Vert.cbSize = sizeof(SCROLLINFO);
  38. psb->Horz.fMask = psb->Vert.fMask = SIF_ALL;
  39. if( dwStyle & WS_HSCROLL )
  40. GetScrollInfo(hwnd, SB_HORZ, &psb->Horz);
  41. if( dwStyle & WS_VSCROLL )
  42. GetScrollInfo(hwnd, SB_VERT, &psb->Vert);
  43. // Is left scrollbar style
  44. if( GetWindowLong(hwnd, GWL_EXSTYLE) & WS_EX_LEFTSCROLLBAR )
  45. psb->fLeftScrollBar = TRUE;
  46. if( !hBmp ) {
  47. SetLastError(ERROR_INVALID_HANDLE);
  48. return FALSE;
  49. }
  50. psb->hBmp = hBmp;
  51. // Reaplace the window procedure
  52. psb->hwnd = hwnd;
  53. psb->pfnOldProc = (WNDPROC)(LONG_PTR)SetWindowLong(hwnd,
  54. GWL_WNDPROC, (LONG)(LONG_PTR)SkinUI_Proc);
  55. psb->fPreventStyleChange = FALSE;
  56. psb->fTracking = FALSE;
  57. // Whether richedit control
  58. TCHAR szClassName[255] = { 0 };
  59. GetClassName(hwnd, szClassName, sizeof(szClassName));
  60. if( _strcmpi(szClassName, TEXT("RichEdit20A")) == 0 ||
  61. _strcmpi(szClassName, TEXT("RichEdit20W")) == 0 ) {
  62. psb->fRichEdit = TRUE;
  63. }
  64. // Set the window property
  65. if( !SetProp(hwnd, g_szPropSB, (HANDLE)psb) )
  66. return FALSE;
  67. // Redraw the window noclient
  68. SetWindowPos(hwnd, NULL, 0, 0, 0, 0, SWP_NOZORDER |
  69. SWP_NOSIZE | SWP_NOMOVE | SWP_NOACTIVATE | SWP_DRAWFRAME);
  70. return TRUE;
  71. }
  72. //---------------------------------------------------------
  73. // Name : SkinUI_Uninit()
  74. // Desc : Finalize the skin scrollbar library
  75. //---------------------------------------------------------
  76. BOOL WINAPI SkinUI_Uninit(HWND hwnd)
  77. {
  78. LPSB psb;
  79. SCROLLINFO vsi;
  80. SCROLLINFO hsi;
  81. BOOL vValid, hValid;
  82. UINT vFlags, hFlags;
  83. if( (psb = SkinUI_GetSB(hwnd)) == NULL )
  84. return FALSE;
  85. vsi.cbSize = hsi.cbSize = sizeof(SCROLLINFO);
  86. vsi.fMask = hsi.fMask = SIF_ALL | SIF_DISABLENOSCROLL;
  87. vValid = SkinUI_GetScrollInfo(hwnd, SB_VERT, &vsi);
  88. vFlags = SkinUI_GetDisableFlags(psb, TRUE);
  89. hValid = SkinUI_GetScrollInfo(hwnd, SB_HORZ, &hsi);
  90. hFlags = SkinUI_GetDisableFlags(psb, FALSE);
  91. // Remove the subclass procedure
  92. SetWindowLong(hwnd, GWL_WNDPROC, (LONG)(LONG_PTR)psb->pfnOldProc);
  93. RemoveProp(hwnd, g_szPropSB);
  94. LocalFree((HLOCAL)psb);
  95. // Restore system scroll parameters
  96. if( vValid ) {
  97. SetScrollInfo(hwnd, SB_VERT, &vsi, TRUE);
  98. EnableScrollBar(hwnd, SB_VERT, vFlags);
  99. }
  100. if( hValid ) {
  101. SetScrollInfo(hwnd, SB_HORZ, &hsi, TRUE);
  102. EnableScrollBar(hwnd, SB_HORZ, hFlags);
  103. }
  104. return TRUE;
  105. }
  106. //---------------------------------------------------------
  107. // Name : SkinUI_IsValid()
  108. // Desc : Is initialized ??
  109. //---------------------------------------------------------
  110. BOOL WINAPI SkinUI_IsValid(HWND hwnd)
  111. {
  112. return (SkinUI_GetSB(hwnd) != NULL);
  113. }
  114. //---------------------------------------------------------
  115. // Name : SkinUI_GetScrollInfo()
  116. // Desc : Overload API GetScrollInfo()
  117. //---------------------------------------------------------
  118. BOOL WINAPI SkinUI_GetScrollInfo(HWND hwnd, int fnBar, LPSCROLLINFO lpsi)
  119. {
  120. LPSB psb;
  121. LPSCROLLINFO psi;
  122. BOOL fCopied = FALSE;
  123. if( !lpsi || lpsi->cbSize != sizeof(SCROLLINFO) )
  124. return FALSE;
  125. // Is initialized ?
  126. if( (psb = SkinUI_GetSB(hwnd)) == NULL )
  127. return FALSE;
  128. // If be scrollbar control then call failed
  129. if( fnBar == SB_HORZ )
  130. psi = &psb->Horz;
  131. else if( fnBar == SB_VERT )
  132. psi = &psb->Vert;
  133. else if( fnBar == SB_CTL )
  134. return FALSE;
  135. if( lpsi->fMask & SIF_PAGE ) {
  136. lpsi->nPage = psi->nPage;
  137. fCopied = TRUE;
  138. }
  139. if( lpsi->fMask & SIF_POS ) {
  140. lpsi->nPos = psi->nPos;
  141. fCopied = TRUE;
  142. }
  143. if( lpsi->fMask & SIF_TRACKPOS ) {
  144. lpsi->nTrackPos = psi->nTrackPos;
  145. fCopied = TRUE;
  146. }
  147. if( lpsi->fMask & SIF_RANGE ) {
  148. lpsi->nMin = psi->nMin;
  149. lpsi->nMax = psi->nMax;
  150. fCopied = TRUE;
  151. }
  152. return fCopied;
  153. }
  154. //---------------------------------------------------------
  155. // Name : SkinUI_SetScrollInfo()
  156. // Desc : Overload API SetScrollInfo()
  157. //---------------------------------------------------------
  158. int WINAPI SkinUI_SetScrollInfo(HWND hwnd, int fnBar, LPCSCROLLINFO psi, BOOL fRedraw)
  159. {
  160. LPSB psb;
  161. LPSCROLLINFO mysi;
  162. int nRet;
  163. DWORD dwStyle;
  164. BOOL fVert;
  165. UINT wScroll;
  166. BOOL fScroll;
  167. BOOL fOldScroll;
  168. BOOL bReturnOldPos;
  169. // if be scrollbar control the call failed
  170. if( fnBar == SB_CTL )
  171. return 0;
  172. if( (psb = SkinUI_GetSB(hwnd)) == NULL )
  173. return 0;
  174. if( fRedraw )
  175. fRedraw = IsWindowVisible(hwnd);
  176. fVert = (fnBar == SB_VERT);
  177. bReturnOldPos = (psi->fMask & SIF_POS);
  178. dwStyle = GetWindowLong(hwnd, GWL_STYLE);
  179. wScroll = fVert ? WS_VSCROLL : WS_HSCROLL;
  180. fScroll = fOldScroll = (dwStyle & wScroll) ? TRUE : FALSE;
  181. // Don't do anything if we're setting position of a nonexistent scroll bar.
  182. if( !(psi->fMask & SIF_RANGE) && !fOldScroll )
  183. return 0;
  184. mysi = (fVert ? &psb->Vert : &psb->Horz);
  185. if( !SkinUI_SetSBParms(mysi, *psi, &fScroll, &nRet, bReturnOldPos) &&
  186. !(psi->fMask & SIF_DISABLENOSCROLL) ) {
  187. if( fOldScroll && fRedraw )
  188. goto redrawAfterSet;
  189. return nRet;
  190. }
  191. if( fScroll )
  192. psb->style |= wScroll;
  193. else
  194. psb->style &= ~wScroll;
  195. // Keep the owner window scroll style
  196. SetWindowLong(hwnd, GWL_STYLE, dwStyle | wScroll);
  197. if( psi->fMask & SIF_DISABLENOSCROLL ) {
  198. if( fOldScroll ) {
  199. fScroll = ((int)mysi->nPage <= (mysi->nMax - mysi->nMin));
  200. psb->style |= wScroll;
  201. SetWindowLong(hwnd, GWL_STYLE, dwStyle | wScroll);
  202. SkinUI_EnableArrows(psb, fnBar, fScroll ? ESB_ENABLE_BOTH : ESB_DISABLE_BOTH);
  203. }
  204. }
  205. else if( fOldScroll ^ fScroll ) {
  206. SetWindowPos(hwnd, NULL, 0, 0, 0, 0, SWP_NOZORDER |
  207. SWP_NOSIZE | SWP_NOMOVE | SWP_NOACTIVATE | SWP_DRAWFRAME);
  208. return nRet;
  209. }
  210. if( fScroll && fRedraw ) {
  211. redrawAfterSet:
  212. if(dwStyle & wScroll) {
  213. HDC hDC = GetWindowDC(hwnd);
  214. SkinUI_DrawThumb(psb, hDC, fVert);
  215. ReleaseDC(hwnd, hDC);
  216. }
  217. else {
  218. if( SkinUI_IsScrollInfoActive(psi) )
  219. SetWindowPos(hwnd, NULL, 0, 0, 0, 0, SWP_NOZORDER |
  220. SWP_NOSIZE | SWP_NOMOVE | SWP_NOACTIVATE | SWP_DRAWFRAME);
  221. }
  222. }
  223. return mysi->nPos; //lres;
  224. }
  225. //---------------------------------------------------------
  226. // Name : SkinUI_GetScrollPos()
  227. // Desc : Overload API GetScrollPos()
  228. //---------------------------------------------------------
  229. int WINAPI SkinUI_GetScrollPos(HWND hwnd, int nBar)
  230. {
  231. LPSB psb;
  232. int nPos;
  233. if( !(psb = SkinUI_GetSB(hwnd)) )
  234. return FALSE;
  235. if( nBar == SB_HORZ )
  236. nPos = psb->Horz.nPos;
  237. else if( nBar == SB_VERT )
  238. nPos = psb->Vert.nPos;
  239. return nPos;
  240. }
  241. //---------------------------------------------------------
  242. // Name : SkinUI_SetScrollPos()
  243. // Desc : Overload API SetScrollPos()
  244. //---------------------------------------------------------
  245. int WINAPI SkinUI_SetScrollPos(HWND hwnd, int nBar, int nPos, BOOL fRedraw)
  246. {
  247. LPSB psb;
  248. LPSCROLLINFO psi;
  249. int nOldPos;
  250. if( (psb = SkinUI_GetSB(hwnd)) == NULL)
  251. return FALSE;
  252. if( nBar == SB_HORZ )
  253. psi = &psb->Horz;
  254. else if( nBar == SB_VERT )
  255. psi = &psb->Vert;
  256. else
  257. return FALSE;
  258. nOldPos = psi->nPos;
  259. psi->nPos = nPos;
  260. if( fRedraw ) {
  261. HDC hDC = GetWindowDC(hwnd);
  262. SkinUI_DrawScrollBar(psb, hDC, (nBar == SB_VERT) );
  263. ReleaseDC(hwnd, hDC);
  264. }
  265. return nOldPos;
  266. }
  267. //---------------------------------------------------------
  268. // Name : SkinUI_GetScrollRange()
  269. // Desc : Overload API GetScrollRange()
  270. //---------------------------------------------------------
  271. BOOL WINAPI SkinUI_GetScrollRange(HWND hwnd, int nBar, LPINT lpMinPos, LPINT lpMaxPos)
  272. {
  273. LPSB psb;
  274. LPSCROLLINFO psi;
  275. if( !lpMinPos || !lpMaxPos )
  276. return FALSE;
  277. if( (psb = SkinUI_GetSB(hwnd)) == NULL )
  278. return FALSE;
  279. if( nBar == SB_HORZ )
  280. psi = &psb->Horz;
  281. else if( nBar == SB_VERT )
  282. psi = &psb->Vert;
  283. *lpMinPos = psi->nMin;
  284. *lpMaxPos = psi->nMax;
  285. return TRUE;
  286. }
  287. //---------------------------------------------------------
  288. // Name : SkinUI_SetScrollRange()
  289. // Desc : Overload API SetScrollRange()
  290. //---------------------------------------------------------
  291. BOOL WINAPI SkinUI_SetScrollRange(HWND hwnd, int nBar, int nMinPos, int nMaxPos, BOOL fRedraw)
  292. {
  293. LPSB psb;
  294. LPSCROLLINFO psi;
  295. if( !(psb = SkinUI_GetSB(hwnd)) )
  296. return FALSE;
  297. if( nBar == SB_HORZ )
  298. psi = &psb->Horz;
  299. else if( nBar == SB_VERT )
  300. psi = &psb->Vert;
  301. psi->nMin = nMinPos;
  302. psi->nMax = nMaxPos;
  303. if(nMinPos == 0 && nMaxPos == 0)
  304. SkinUI_ShowScrollBar(hwnd, nBar, FALSE);
  305. if( fRedraw ) {
  306. HDC hDC = GetWindowDC(hwnd);
  307. SkinUI_DrawScrollBar(psb, hDC, (nBar == SB_VERT) );
  308. ReleaseDC(hwnd, hDC);
  309. }
  310. return TRUE;
  311. }
  312. //---------------------------------------------------------
  313. // Name : SkinUI_ShowScrollBar()
  314. // Desc : Overload API ShowScrollBar()
  315. //---------------------------------------------------------
  316. BOOL WINAPI SkinUI_ShowScrollBar(HWND hwnd, int wBar, BOOL fShow)
  317. {
  318. BOOL fChanged = FALSE;
  319. DWORD dwStyle, dwNew;
  320. switch( wBar )
  321. {
  322. case SB_CTL:
  323. ShowWindow(hwnd, fShow ? SW_SHOW : SW_HIDE);
  324. break;
  325. case SB_HORZ:
  326. dwNew = WS_HSCROLL;
  327. break;
  328. case SB_VERT:
  329. dwNew = WS_VSCROLL;
  330. break;
  331. case SB_BOTH:
  332. dwNew = WS_HSCROLL | WS_VSCROLL;
  333. break;
  334. }
  335. dwStyle = GetWindowLong(hwnd, GWL_STYLE);
  336. if( !fShow ) {
  337. if( dwStyle & dwNew ) {
  338. fChanged = TRUE;
  339. dwStyle &= ~dwNew;
  340. }
  341. }
  342. else {
  343. if( (dwStyle & dwNew) != dwNew ) {
  344. fChanged = TRUE;
  345. dwStyle |= dwNew;
  346. }
  347. }
  348. if( fChanged ) {
  349. SetWindowLong(hwnd, GWL_STYLE, dwStyle);
  350. SetWindowPos(hwnd, NULL, 0, 0, 0, 0, SWP_NOZORDER |
  351. SWP_NOSIZE | SWP_NOMOVE | SWP_NOACTIVATE | SWP_DRAWFRAME);
  352. }
  353. return TRUE;
  354. }
  355. //---------------------------------------------------------
  356. // Name : SkinUI_EnableScrollBar()
  357. // Desc : Overload API EnableScrollBar()
  358. //---------------------------------------------------------
  359. BOOL WINAPI SkinUI_EnableScrollBar(HWND hwnd, UINT wSBflags, UINT wArrows)
  360. {
  361. LPSB psb;
  362. if( !(psb = SkinUI_GetSB(hwnd)) )
  363. return FALSE;
  364. if( wSBflags == SB_CTL )
  365. return FALSE;
  366. return SkinUI_EnableArrows(psb, wSBflags, wArrows);
  367. }
  368. // Internal Function
  369. //---------------------------------------------------------
  370. // Name : SkinUI_SetSBParms()
  371. // Desc : Set scroll parameters
  372. //---------------------------------------------------------
  373. BOOL SkinUI_SetSBParms(LPSCROLLINFO psi, SCROLLINFO si, BOOL* pfScroll, int* plres, BOOL bOldPos)
  374. {
  375. BOOL fChanged = FALSE;
  376. if( bOldPos )
  377. *plres = psi->nPos;
  378. if( si.fMask & SIF_RANGE ) {
  379. if( si.nMax < si.nMin )
  380. si.nMax = si.nMin;
  381. if( si.nMax != psi->nMax || si.nMin != psi->nMin ) {
  382. psi->nMax = si.nMax;
  383. psi->nMin = si.nMin;
  384. if( !(si.fMask & SIF_PAGE) ) {
  385. si.fMask |= SIF_PAGE;
  386. si.nPage = psi->nPage;
  387. }
  388. if( !(si.fMask & SIF_POS) ) {
  389. si.fMask |= SIF_POS;
  390. si.nPos = psi->nPos;
  391. }
  392. fChanged = TRUE;
  393. }
  394. }
  395. if( si.fMask & SIF_PAGE ) {
  396. UINT nMaxPage = abs( psi->nMax - psi->nMin ) + 1;
  397. if( si.nPage > nMaxPage )
  398. si.nPage = nMaxPage;
  399. if( psi->nPage != si.nPage ) {
  400. psi->nPage = si.nPage;
  401. if( !(si.fMask & SIF_POS) ) {
  402. si.fMask |= SIF_POS;
  403. si.nPos = psi->nPos;
  404. }
  405. fChanged = TRUE;
  406. }
  407. }
  408. if( si.fMask & SIF_POS ) {
  409. int nMaxPos = psi->nMax - ((psi->nPage) ? psi->nPage - 1 : 0);
  410. if( si.nPos < psi->nMin )
  411. si.nPos = psi->nMin;
  412. else if( si.nPos > nMaxPos )
  413. si.nPos = nMaxPos;
  414. if( psi->nPos != si.nPos ) {
  415. psi->nPos = si.nPos;
  416. fChanged = TRUE;
  417. }
  418. }
  419. if( si.fMask & SIF_TRACKPOS ) {
  420. if( psi->nTrackPos != si.nTrackPos ) {
  421. psi->nTrackPos = si.nTrackPos;
  422. fChanged = TRUE;
  423. }
  424. }
  425. if( !bOldPos )
  426. *plres = psi->nPos; // Return the new pos
  427. if( si.fMask & SIF_RANGE ) {
  428. if( *pfScroll = (psi->nMin != psi->nMax) )
  429. goto CheckPage;
  430. }
  431. else if( si.fMask & SIF_PAGE ) {
  432. CheckPage:
  433. *pfScroll = ( (int)psi->nPage <= (psi->nMax - psi->nMin) );
  434. }
  435. return fChanged;
  436. }
  437. //---------------------------------------------------------
  438. // Name : SkinUI_EnableArrows()
  439. // Desc : Enable or Disable scrollbar arrows
  440. //---------------------------------------------------------
  441. BOOL SkinUI_EnableArrows(LPSB psb, int nBar, UINT wArrows)
  442. {
  443. HDC hDC;
  444. UINT uOldFlags;
  445. BOOL bRetValue = FALSE;
  446. if( psb == NULL )
  447. return FALSE;
  448. uOldFlags = psb->flags;
  449. if( (hDC = GetWindowDC(psb->hwnd)) == NULL )
  450. return FALSE;
  451. // Enable or disable horizontal scrollbar
  452. if( nBar == SB_HORZ || nBar == SB_BOTH ) {
  453. if( wArrows == ESB_ENABLE_BOTH )
  454. psb->flags &= ~ESB_DISABLE_BOTH;
  455. else
  456. psb->flags |= wArrows;
  457. if( uOldFlags != psb->flags ) {
  458. bRetValue = TRUE;
  459. if( GetWindowLong(psb->hwnd, GWL_STYLE ) & WS_HSCROLL )
  460. SkinUI_DrawScrollBar(psb, hDC, FALSE);
  461. }
  462. }
  463. // Enable or disable vertical scrollbar
  464. if( nBar == SB_VERT || nBar == SB_BOTH ) {
  465. if( wArrows == ESB_ENABLE_BOTH )
  466. psb->flags &= ~(ESB_DISABLE_BOTH << 2);
  467. else
  468. psb->flags |= (wArrows << 2);
  469. if( uOldFlags != psb->flags ) {
  470. bRetValue = TRUE;
  471. if( GetWindowLong(psb->hwnd, GWL_STYLE ) & WS_VSCROLL )
  472. SkinUI_DrawScrollBar(psb, hDC, TRUE);
  473. }
  474. }
  475. ReleaseDC(psb->hwnd, hDC);
  476. return bRetValue;
  477. }
  478. //---------------------------------------------------------
  479. // Name : SkinUI_GetDisableFlags()
  480. // Desc : Get scrollbar disable flags
  481. //---------------------------------------------------------
  482. UINT SkinUI_GetDisableFlags(LPSB psb, BOOL fVert)
  483. {
  484. return (fVert ? (psb->flags & 0x000c) >> 2 : psb->flags & 0x0003);
  485. }
  486. //---------------------------------------------------------
  487. // Name : SkinUI_GetSB()
  488. // Desc : Get the skin scrollbar data structure
  489. //---------------------------------------------------------
  490. LPSB SkinUI_GetSB(HWND hwnd)
  491. {
  492. return (LPSB)GetProp(hwnd, g_szPropSB);
  493. }
  494. //---------------------------------------------------------
  495. // Name : SkinUI_IsScrollInfoActive()
  496. // Desc : Check scroll information whether active
  497. //---------------------------------------------------------
  498. BOOL SkinUI_IsScrollInfoActive(LPCSCROLLINFO lpsi)
  499. {
  500. if( lpsi->nPage > (UINT)lpsi->nMax || lpsi->nMax <= lpsi->nMin || lpsi->nMax == 0 )
  501. return FALSE;
  502. else
  503. return TRUE;
  504. }
  505. //----------------------------------------------------------
  506. // Name : SkinUI_GetSizeBoxRect()
  507. // Desc : Get the size box rect
  508. //----------------------------------------------------------
  509. BOOL SkinUI_GetSizeBoxRect(LPSB psb, LPRECT lprc)
  510. {
  511. DWORD dwStyle;
  512. RECT rect;
  513. SetRectEmpty(lprc);
  514. dwStyle = GetWindowLong(psb->hwnd, GWL_STYLE);
  515. if( (dwStyle & WS_HSCROLL) && (dwStyle & WS_VSCROLL) ) {
  516. GetClientRect(psb->hwnd, &rect);
  517. ClientToScreen(psb->hwnd, (LPPOINT)&rect);
  518. ClientToScreen(psb->hwnd, ((LPPOINT)&rect)+1);
  519. // calculate left scroll style of size box rect
  520. if( psb->fLeftScrollBar ) {
  521. lprc->left = rect.left - GetSystemMetrics(SM_CXVSCROLL);
  522. lprc->right = rect.left;
  523. }
  524. else {
  525. lprc->left = rect.right;
  526. lprc->right = rect.right + GetSystemMetrics(SM_CXVSCROLL);
  527. }
  528. lprc->top = rect.bottom;
  529. lprc->bottom= rect.bottom + GetSystemMetrics(SM_CYHSCROLL);
  530. return TRUE;
  531. }
  532. return FALSE;
  533. }
  534. //----------------------------------------------------------
  535. // Name : SkinUI_GetScrollBarRect()
  536. // Desc : Get the scrollbar rect
  537. //----------------------------------------------------------
  538. BOOL SkinUI_GetScrollBarRect(LPSB psb, BOOL fVert, LPRECT lprc)
  539. {
  540. RECT rect;
  541. DWORD dwStyle;
  542. if( !psb || !lprc )
  543. return FALSE;
  544. SetRectEmpty(lprc);
  545. GetClientRect(psb->hwnd, &rect);
  546. ClientToScreen(psb->hwnd, (LPPOINT)&rect);
  547. ClientToScreen(psb->hwnd, ((LPPOINT)&rect)+1);
  548. dwStyle = GetWindowLong(psb->hwnd, GWL_STYLE);
  549. if( fVert ) {
  550. if( psb->fLeftScrollBar ) {
  551. lprc->right = lprc->left = rect.left;
  552. if( dwStyle & WS_VSCROLL )
  553. lprc->left -= GetSystemMetrics(SM_CXVSCROLL);
  554. }
  555. else {
  556. lprc->right = lprc->left = rect.right;
  557. if( dwStyle & WS_VSCROLL )
  558. lprc->right += GetSystemMetrics(SM_CXVSCROLL);
  559. }
  560. lprc->top = rect.top;
  561. lprc->bottom = rect.bottom;
  562. }
  563. else {
  564. lprc->top = lprc->bottom = rect.bottom;
  565. if( dwStyle & WS_HSCROLL )
  566. lprc->bottom += GetSystemMetrics(SM_CYHSCROLL);
  567. lprc->left = rect.left;
  568. lprc->right = rect.right;
  569. }
  570. return TRUE;
  571. }
  572. //----------------------------------------------------------
  573. // Name : SkinUI_GetThumbRect()
  574. // Desc :
  575. //----------------------------------------------------------
  576. BOOL SkinUI_GetThumbRect(LPSB psb, LPRECT lprc, BOOL fVert)
  577. {
  578. if( !psb || !lprc )
  579. return FALSE;
  580. SBCALC sbc;
  581. RECT rect;
  582. SkinUI_SBCalc(psb, &sbc, fVert);
  583. GetWindowRect(psb->hwnd, &rect);
  584. if( fVert )
  585. SetRect(lprc, sbc.pxLeft, sbc.pxThumbTop, sbc.pxRight, sbc.pxThumbBottom);
  586. else
  587. SetRect(lprc, sbc.pxThumbLeft, sbc.pxTop, sbc.pxThumbRight, sbc.pxBottom);
  588. OffsetRect(lprc, -rect.left, -rect.top);
  589. return TRUE;
  590. }
  591. //----------------------------------------------------------
  592. // Name : SkinUI_GetGrooveRect()
  593. // Desc :
  594. //----------------------------------------------------------
  595. BOOL SkinUI_GetGrooveRect(LPSB psb, LPRECT lprc, BOOL fVert)
  596. {
  597. if( !psb || !lprc )
  598. return FALSE;
  599. SBCALC sbc;
  600. RECT rect;
  601. SkinUI_SBCalc(psb, &sbc, fVert);
  602. GetWindowRect(psb->hwnd, &rect);
  603. if( fVert )
  604. SetRect(lprc, sbc.pxLeft, sbc.pxUpArrow, sbc.pxRight, sbc.pxDownArrow);
  605. else
  606. SetRect(lprc, sbc.pxUpArrow, sbc.pxTop, sbc.pxDownArrow, sbc.pxBottom);
  607. OffsetRect(lprc, -rect.left, -rect.top);
  608. return TRUE;
  609. }
  610. //----------------------------------------------------------
  611. // Name : SkinUI_DrawSizeBox()
  612. // Desc : Draw the size box
  613. //----------------------------------------------------------
  614. BOOL SkinUI_DrawSizeBox(LPSB psb, HDC hDC)
  615. {
  616. HDC hMemDC;
  617. HBITMAP hOldBmp;
  618. RECT rect, rc;
  619. GetWindowRect(psb->hwnd, &rect);
  620. SkinUI_GetSizeBoxRect(psb, &rc);
  621. OffsetRect(&rc, -rect.left, -rect.top);
  622. hMemDC = CreateCompatibleDC(NULL);
  623. hOldBmp = (HBITMAP)SelectObject(hMemDC, psb->hBmp);
  624. BitBlt(hDC, rc.left, rc.top, rc.right - rc.left, rc.bottom - rc.top, hMemDC, 38, 57, SRCCOPY);
  625. // Release GDI object
  626. SelectObject(hMemDC, hOldBmp);
  627. DeleteDC(hMemDC);
  628. return TRUE;
  629. }
  630. //----------------------------------------------------------
  631. // Name : SkinUI_DrawGroove()
  632. // Desc :
  633. //----------------------------------------------------------
  634. BOOL SkinUI_DrawGroove(LPSB psb, HDC hdc, LPRECT lprc, BOOL fVert)
  635. {
  636. if( !hdc || !lprc || IsRectEmpty(lprc) )
  637. return FALSE;
  638. HDC hbmpDC;
  639. HBITMAP hOldBmp;
  640. POINT pt;
  641. int nMode;
  642. hbmpDC = CreateCompatibleDC(hdc);
  643. hOldBmp = (HBITMAP)SelectObject(hbmpDC, psb->hBmp);
  644. if( fVert )
  645. pt = ptArray[0][4];
  646. else
  647. pt = ptArray[3][4];
  648. nMode = SetStretchBltMode(hdc, HALFTONE);
  649. StretchBlt(hdc, lprc->left, lprc->top, lprc->right - lprc->left,
  650. lprc->bottom - lprc->top, hbmpDC, pt.x, pt.y, 16, 16, SRCCOPY);
  651. SetStretchBltMode(hdc, nMode);
  652. SelectObject(hbmpDC, hOldBmp);
  653. DeleteDC(hbmpDC);
  654. return TRUE;
  655. }
  656. //----------------------------------------------------------
  657. // Name : SkinUI_DrawScrollBar()
  658. // Desc : Draw the scrollbar
  659. //----------------------------------------------------------
  660. void SkinUI_DrawScrollBar(LPSB psb, HDC hDC, BOOL fVert)
  661. {
  662. RECT rcGroove;
  663. SkinUI_GetGrooveRect(psb, &rcGroove, fVert);
  664. SkinUI_DrawGroove(psb, hDC, &rcGroove, fVert);
  665. if( fVert ) {
  666. // Draw the arrow
  667. SkinUI_DrawArrow(psb, hDC, fVert, HTSCROLL_LINEUP, 0);
  668. SkinUI_DrawArrow(psb, hDC, fVert, HTSCROLL_LINEDOWN, 0);
  669. // Draw the thumb
  670. if( !SkinUI_IsScrollInfoActive(&psb->Vert) )
  671. return ;
  672. SkinUI_DrawThumb(psb, hDC, fVert);
  673. }
  674. else {
  675. SkinUI_DrawArrow(psb, hDC, fVert, HTSCROLL_LINEUP, 0);
  676. SkinUI_DrawArrow(psb, hDC, fVert, HTSCROLL_LINEDOWN, 0);
  677. if( !SkinUI_IsScrollInfoActive(&psb->Horz) )
  678. return ;
  679. SkinUI_DrawThumb(psb, hDC, fVert);
  680. }
  681. }
  682. //----------------------------------------------------------
  683. // Name : SkinUI_DrawArrow()
  684. // Desc : Draw the scrollbar arrow button
  685. //----------------------------------------------------------
  686. BOOL SkinUI_DrawArrow(LPSB psb, HDC hdc, BOOL fVert, int nArrow, UINT uState)
  687. {
  688. RECT rect, rc;
  689. SBCALC sbc;
  690. HDC hMemDC;
  691. HBITMAP hOldBmp;
  692. int x, y;
  693. POINT pt;
  694. GetWindowRect(psb->hwnd, &rect);
  695. SkinUI_SBCalc(psb, &sbc, fVert);
  696. if( uState == 0 )
  697. uState = SkinUI_GetState(psb, fVert, nArrow);
  698. hMemDC = CreateCompatibleDC(hdc);
  699. hOldBmp = (HBITMAP)SelectObject(hMemDC, psb->hBmp);
  700. switch( nArrow )
  701. {
  702. // up or left arrow
  703. case HTSCROLL_LINEUP:
  704. if( fVert ) {
  705. x = 0; y = 0;
  706. SetRect(&rc, sbc.pxLeft, sbc.pxTop, sbc.pxRight, sbc.pxUpArrow);
  707. }
  708. else {
  709. x = 3; y = 0;
  710. SetRect(&rc, sbc.pxLeft, sbc.pxTop, sbc.pxUpArrow, sbc.pxBottom);
  711. }
  712. break;
  713. // right or down arrow
  714. case HTSCROLL_LINEDOWN:
  715. if( fVert ) {
  716. x = 0; y = 1;
  717. SetRect(&rc, sbc.pxLeft, sbc.pxDownArrow, sbc.pxRight, sbc.pxBottom);
  718. }
  719. else {
  720. x = 3; y = 1;
  721. SetRect(&rc, sbc.pxDownArrow, sbc.pxTop, sbc.pxRight, sbc.pxBottom);
  722. }
  723. break;
  724. }
  725. OffsetRect(&rc, -rect.left, -rect.top);
  726. switch( uState )
  727. {
  728. case SB_STATE_NORMAL:
  729. break;
  730. case SB_STATE_HOTTRACKED:
  731. x += 1;
  732. break;
  733. case SB_STATE_PRESSED:
  734. x += 2;
  735. break;
  736. case SB_STATE_DISABLED:
  737. break;
  738. }
  739. pt = ptArray[x][y];
  740. BitBlt(hdc, rc.left, rc.top, rc.right - rc.left, rc.bottom - rc.top,
  741. hMemDC, pt.x, pt.y, SRCCOPY);
  742. SelectObject(hMemDC, hOldBmp);
  743. DeleteDC(hMemDC);
  744. return TRUE;
  745. }
  746. //----------------------------------------------------------
  747. // Name : SkinUI_DrawThumb()
  748. // Desc : Draw the thumb
  749. //----------------------------------------------------------
  750. void SkinUI_DrawThumb(LPSB psb, HDC hdc, BOOL fVert)
  751. {
  752. SBCALC sbc;
  753. RECT rc, rect;
  754. HDC hSrcDC;
  755. HDC memDC;
  756. HBITMAP hOldBmp;
  757. HBITMAP hMemBitmap, hOldBitmap;
  758. UINT uState;
  759. int cx, cy;
  760. POINT pt, pt1;
  761. uState = SkinUI_GetState(psb, fVert, HTSCROLL_THUMB);
  762. SkinUI_SBCalc(psb, &sbc, fVert);
  763. GetWindowRect(psb->hwnd, &rect);
  764. // Chack scrollbar of size whether valid
  765. if( sbc.pxTop >= sbc.pxBottom || sbc.pxLeft >= sbc.pxRight )
  766. return ;
  767. // Draw the groove only
  768. if( (sbc.pxDownArrow - sbc.pxUpArrow) < (sbc.pxThumbBottom - sbc.pxThumbTop) ||
  769. uState == SB_STATE_DISABLED ) {
  770. SkinUI_GetGrooveRect(psb, &rc, fVert);
  771. SkinUI_DrawGroove(psb, hdc, &rc, fVert);
  772. return ;
  773. }
  774. // Padding the groove part
  775. if( sbc.pxUpArrow < sbc.pxThumbTop ) {
  776. if( fVert )
  777. SetRect(&rc, sbc.pxLeft, sbc.pxUpArrow, sbc.pxRight, sbc.pxThumbTop);
  778. else
  779. SetRect(&rc, sbc.pxUpArrow, sbc.pxTop, sbc.pxThumbTop, sbc.pxBottom);
  780. OffsetRect(&rc, -rect.left, -rect.top);
  781. SkinUI_DrawGroove(psb, hdc, &rc, fVert);
  782. }
  783. if( sbc.pxThumbBottom < sbc.pxDownArrow ) {
  784. if( fVert )
  785. SetRect(&rc, sbc.pxLeft, sbc.pxThumbBottom, sbc.pxRight, sbc.pxDownArrow);
  786. else
  787. SetRect(&rc, sbc.pxThumbBottom, sbc.pxTop, sbc.pxDownArrow, sbc.pxBottom);
  788. OffsetRect(&rc, -rect.left, -rect.top);
  789. SkinUI_DrawGroove(psb, hdc, &rc, fVert);
  790. }
  791. // Draw the thumb use memory dc
  792. // Select scrollbar bitmap resource to dc
  793. hSrcDC = CreateCompatibleDC(hdc);
  794. hOldBmp = (HBITMAP)SelectObject(hSrcDC, psb->hBmp);
  795. // get the thumb rectangle
  796. SkinUI_GetThumbRect(psb, &rc, fVert);
  797. cx = rc.right - rc.left;
  798. cy = rc.bottom - rc.top;
  799. RECT rcMemDC = {0, 0, rc.right-rc.left, rc.bottom-rc.top};
  800. // create the memory dc
  801. memDC = CreateCompatibleDC(hdc);
  802. hMemBitmap = CreateCompatibleBitmap(hdc, cx, cy);
  803. hOldBitmap = (HBITMAP)SelectObject(memDC, hMemBitmap);
  804. SetBkColor(memDC, 0xFFFFFF);
  805. ExtTextOut(memDC, 0, 0, ETO_OPAQUE, &rcMemDC, NULL, 0, NULL);
  806. // Select state bitmap part
  807. switch( uState )
  808. {
  809. case SB_STATE_NORMAL:
  810. pt = fVert ? ptArray[0][2] : ptArray[3][2];
  811. pt1 = fVert ? ptArray[0][3] : ptArray[3][3];
  812. break;
  813. case SB_STATE_HOTTRACKED:
  814. pt = fVert ? ptArray[1][2] : ptArray[4][2];
  815. pt1 = fVert ? ptArray[1][3] : ptArray[4][3];
  816. break;
  817. case SB_STATE_PRESSED:
  818. pt = fVert ? ptArray[2][2] : ptArray[5][2];
  819. pt1 = fVert ? ptArray[2][3] : ptArray[5][3];
  820. break;
  821. case SB_STATE_DISABLED:
  822. break;
  823. }
  824. if ( fVert ) {
  825. for( int i= 4; i < cy - 4; i += 8 )
  826. BitBlt(memDC, 0, i, cx, 8, hSrcDC, pt.x, pt.y + 4, SRCCOPY);
  827. BitBlt(memDC, 0, 0, cx, 4, hSrcDC, pt.x, pt.y, SRCCOPY);
  828. BitBlt(memDC, 0, cy - 4, cx, 4, hSrcDC, pt.x, (pt.y + 16) - 4, SRCCOPY);
  829. if( cy > 16 + 8 ) {
  830. int y = (cy - 16) / 2;
  831. BitBlt(memDC, 0, y, cx, 16, hSrcDC, pt1.x, pt1.y, SRCCOPY);
  832. }
  833. }
  834. else {
  835. for( int i=4; i < cx - 4; i += 8 )
  836. BitBlt(memDC, i, 0, 8, cy, hSrcDC, pt.x + 4, pt.y, SRCCOPY);
  837. BitBlt(memDC, 0, 0, 4, cy, hSrcDC, pt.x, pt.y, SRCCOPY);
  838. BitBlt(memDC, cx - 4, 0, 4, cy, hSrcDC, (pt.x + 16) - 4, pt.y, SRCCOPY);
  839. if( cx > 16 + 8 ) {
  840. int x = (cx - 16) / 2;
  841. BitBlt(memDC, x, 0, 16, cy, hSrcDC, pt1.x, pt1.y, SRCCOPY);
  842. }
  843. }
  844. BitBlt(hdc, rc.left, rc.top, rc.right-rc.left, rc.bottom-rc.top, memDC, 0,0, SRCCOPY);
  845. // Release the memory DC
  846. SelectObject(memDC, hOldBitmap);
  847. DeleteDC(memDC);
  848. DeleteObject(hMemBitmap);
  849. SelectObject(hSrcDC, hOldBmp);
  850. DeleteDC(hSrcDC);
  851. }
  852. //----------------------------------------------------------
  853. // Name : SkinUI_HitTest()
  854. // Desc : HitTest scrollbar items
  855. //----------------------------------------------------------
  856. UINT SkinUI_HitTest(LPSB psb, BOOL fVert, POINT pt)
  857. {
  858. SBCALC sbc;
  859. UINT disFlags;
  860. int x;
  861. SkinUI_SBCalc(psb, &sbc, fVert);
  862. if( pt.x < sbc.pxLeft || pt.y < sbc.pxTop ||
  863. pt.x > sbc.pxRight || pt.y > sbc.pxBottom )
  864. return HTSCROLL_NONE;
  865. disFlags = SkinUI_GetDisableFlags(psb, fVert);
  866. x = fVert ? pt.y : pt.x;
  867. if( x < sbc.pxUpArrow ) {
  868. if( disFlags & ESB_DISABLE_BOTH || disFlags & ESB_DISABLE_LTUP )
  869. return HTSCROLL_NONE;
  870. else
  871. return HTSCROLL_LINEUP;
  872. }
  873. else if( x > sbc.pxUpArrow && x < sbc.pxThumbTop ) {
  874. if( disFlags & ESB_DISABLE_BOTH || disFlags & ESB_DISABLE_LTUP )
  875. return HTSCROLL_NONE;
  876. else
  877. return HTSCROLL_PAGEUP;
  878. }
  879. else if( (x >= sbc.pxThumbTop && x <= sbc.pxThumbBottom) &&
  880. (sbc.pxThumbTop > 0 && sbc.pxThumbBottom > sbc.pxThumbTop) ) {
  881. return HTSCROLL_THUMB;
  882. }
  883. else if( x > sbc.pxThumbBottom && x < sbc.pxDownArrow ) {
  884. if( disFlags & ESB_DISABLE_BOTH || disFlags & ESB_DISABLE_RTDN )
  885. return HTSCROLL_NONE;
  886. else
  887. return HTSCROLL_PAGEDOWN;
  888. }
  889. else if( x >= sbc.pxDownArrow ) {
  890. if( disFlags & ESB_DISABLE_BOTH || disFlags & ESB_DISABLE_RTDN )
  891. return HTSCROLL_NONE;
  892. else
  893. return HTSCROLL_LINEDOWN;
  894. }
  895. return HTSCROLL_NONE;
  896. }
  897. //----------------------------------------------------------
  898. // Name : SkinUI_SBCalc()
  899. // Desc : Calc the scrollbar items position and size
  900. //----------------------------------------------------------
  901. void SkinUI_SBCalc(LPSB psb, LPSBCALC lpcalc, BOOL fVert)
  902. {
  903. RECT rcBar; // the scrollbar rect
  904. int nRange; // the scroll range
  905. int nWorkingsize; // the scroll working size
  906. int nArrowsize; // the arrow button of size
  907. int nThumbsize; // the thumb of size
  908. int nStart; // the thumb of start position
  909. int nThumbpos; // the thumn of current position
  910. SCROLLINFO* psi;
  911. SkinUI_GetScrollBarRect(psb, fVert, &rcBar);
  912. lpcalc->pxLeft = rcBar.left;
  913. lpcalc->pxTop = rcBar.top;
  914. lpcalc->pxRight = rcBar.right;
  915. lpcalc->pxBottom = rcBar.bottom;
  916. if( fVert ) {
  917. psi = &psb->Vert;
  918. nArrowsize = GetSystemMetrics(SM_CYVSCROLL);
  919. nWorkingsize = (rcBar.bottom - rcBar.top) - nArrowsize * 2;
  920. nStart = rcBar.top + nArrowsize;
  921. lpcalc->pxUpArrow = rcBar.top + nArrowsize;
  922. lpcalc->pxDownArrow = rcBar.bottom - nArrowsize;
  923. }
  924. else {
  925. psi = &psb->Horz;
  926. nArrowsize = GetSystemMetrics(SM_CXHSCROLL);
  927. nWorkingsize = (rcBar.right - rcBar.left) - nArrowsize * 2;
  928. nStart = rcBar.left + nArrowsize;
  929. lpcalc->pxUpArrow = rcBar.left + nArrowsize;
  930. lpcalc->pxDownArrow = rcBar.right - nArrowsize;
  931. }
  932. nRange = (psi->nMax - psi->nMin) + 1;
  933. if( nRange > 0 && SkinUI_IsScrollInfoActive(psi)) {
  934. nThumbsize = MulDiv(psi->nPage, nWorkingsize, nRange);
  935. if( nThumbsize < SB_MINTHUMB_SIZE )
  936. nThumbsize = SB_MINTHUMB_SIZE;
  937. int pagesize = max(1, psi->nPage);
  938. nThumbpos = MulDiv(psi->nPos - psi->nMin, nWorkingsize - nThumbsize, nRange - pagesize);
  939. if( nThumbpos < 0 )
  940. nThumbpos = 0;
  941. if( nThumbpos >= nWorkingsize - nThumbsize )
  942. nThumbpos = nWorkingsize - nThumbsize;
  943. nThumbpos += nStart;
  944. lpcalc->pxThumbTop = nThumbpos;
  945. lpcalc->pxThumbBottom = nThumbpos + nThumbsize;
  946. }
  947. else {
  948. lpcalc->pxThumbTop = 0;
  949. lpcalc->pxThumbBottom = 0;
  950. }
  951. }
  952. //---------------------------------------------------------
  953. // Name : SkinUI_TrackThumb()
  954. // Desc : Track the scroll thumb
  955. //---------------------------------------------------------
  956. BOOL SkinUI_TrackThumb(LPSB psb, BOOL fVert, POINT pt)
  957. {
  958. SBCALC sbclc;
  959. int nPos;
  960. int nThumbpos;
  961. int nRange;
  962. int nThumbsize;
  963. int nWorksize;
  964. LPSCROLLINFO psi;
  965. SkinUI_SBCalc(psb, &sbclc, fVert);
  966. if( fVert ) {
  967. psi = &psb->Vert;
  968. nThumbpos = pt.y - psb->nOffsetPoint;
  969. }
  970. else {
  971. psi = &psb->Horz;
  972. nThumbpos = pt.x - psb->nOffsetPoint;
  973. }
  974. nPos = 0;
  975. nThumbpos -= sbclc.pxUpArrow;
  976. nThumbsize = sbclc.pxThumbBottom - sbclc.pxThumbTop;
  977. nWorksize = sbclc.pxDownArrow - sbclc.pxUpArrow;
  978. nRange = (psi->nMax - psi->nMin) + 1;
  979. if( nThumbpos < 0 )
  980. nThumbpos = 0;
  981. if( nThumbpos > nWorksize - nThumbsize)
  982. nThumbpos = nWorksize - nThumbsize;
  983. if( nRange > 0 )
  984. nPos = MulDiv(nThumbpos, nRange - psi->nPage, nWorksize - nThumbsize);
  985. // Send the scroll message to window !!!
  986. if( psi->nPos != nPos ) {
  987. psi->nTrackPos = nPos;
  988. psb->nTrackPos = nPos;
  989. // NOTE: 2008-12-24
  990. // Not use the SB_THUMBTRACK flag that because of
  991. // the RichEdit cannot receving the WM_MOUSEMOVE message
  992. if( psb->fRichEdit ) {
  993. DoScrollMsg(psb->hwnd, /*SB_THUMBTRACK*/SB_THUMBPOSITION, nPos, fVert);
  994. }
  995. else {
  996. DoScrollMsg(psb->hwnd, SB_THUMBTRACK, nPos, fVert);
  997. }
  998. }
  999. return TRUE;
  1000. }
  1001. //---------------------------------------------------------
  1002. // Name : SkinUI_GetState()
  1003. // Desc :
  1004. //---------------------------------------------------------
  1005. UINT SkinUI_GetState(LPSB psb, BOOL fVert, UINT nHit)
  1006. {
  1007. BOOL fHotTracked;
  1008. BOOL fPressed;
  1009. BOOL fDisabled;
  1010. UINT disFlags;
  1011. UINT state;
  1012. if( nHit == HTSCROLL_NONE )
  1013. return 0;
  1014. fHotTracked = fPressed = fDisabled = FALSE;
  1015. disFlags = SkinUI_GetDisableFlags(psb, fVert);
  1016. switch( nHit ) {
  1017. case HTSCROLL_LINEUP:
  1018. fDisabled = (disFlags & ESB_DISABLE_BOTH || disFlags & ESB_DISABLE_UP);
  1019. break;
  1020. case HTSCROLL_LINEDOWN:
  1021. fDisabled = (disFlags & ESB_DISABLE_BOTH || disFlags & ESB_DISABLE_DOWN);
  1022. break;
  1023. case HTSCROLL_THUMB:
  1024. fDisabled = (disFlags & ESB_DISABLE_BOTH);
  1025. break;
  1026. }
  1027. if( nHit == psb->nLastCode && fVert == psb->fLastVert )
  1028. fHotTracked = TRUE;
  1029. if( !fDisabled && psb->fTracking && fHotTracked )
  1030. fPressed = TRUE;
  1031. if( fDisabled )
  1032. state = SB_STATE_DISABLED;
  1033. else if( fPressed )
  1034. state = SB_STATE_PRESSED;
  1035. else if( fHotTracked )
  1036. state = SB_STATE_HOTTRACKED;
  1037. else
  1038. state = SB_STATE_NORMAL;
  1039. return state;
  1040. }
  1041. //----------------------------------------------------------
  1042. // Name : SkinUI_Track()
  1043. // Desc :
  1044. //----------------------------------------------------------
  1045. void SkinUI_Track(LPSB psb, BOOL fVert, UINT nHit, POINT pt)
  1046. {
  1047. UINT disFlags;
  1048. LPSCROLLINFO psi;
  1049. WORD wSBCode;
  1050. psi = fVert ? &psb->Vert : &psb->Horz;
  1051. disFlags = SkinUI_GetDisableFlags(psb, fVert);
  1052. switch( nHit )
  1053. {
  1054. case HTSCROLL_THUMB:
  1055. SBCALC sbclc;
  1056. SkinUI_SBCalc(psb, &sbclc, fVert);
  1057. psi->nTrackPos = psi->nPos;
  1058. psb->nOffsetPoint = (fVert ? pt.y : pt.x) - sbclc.pxThumbTop;
  1059. break;
  1060. case HTSCROLL_LINEUP:
  1061. wSBCode = SB_LINEUP;
  1062. goto DoScroll;
  1063. case HTSCROLL_LINEDOWN:
  1064. wSBCode = SB_LINEDOWN;
  1065. goto DoScroll;
  1066. case HTSCROLL_PAGEDOWN:
  1067. wSBCode = SB_PAGEDOWN;
  1068. goto DoScroll;
  1069. case HTSCROLL_PAGEUP:
  1070. wSBCode = SB_PAGEUP;
  1071. DoScroll:
  1072. psb->nScrollTimerMsg = MAKELONG(fVert ? WM_VSCROLL : WM_HSCROLL, wSBCode);
  1073. DoScrollMsg(psb->hwnd, wSBCode, 0, fVert);
  1074. SetTimer(psb->hwnd, SB_TIMER_DELAY, SB_SCROLL_DELAY, NULL);
  1075. break;
  1076. default:
  1077. return;
  1078. }
  1079. psb->nTrackCode = nHit;
  1080. psb->fTrackVert = fVert;
  1081. psb->fTracking = TRUE;
  1082. SkinUI_HotTrack(psb, nHit, fVert, TRUE);
  1083. SetCapture(psb->hwnd);
  1084. //SkinUI_TrackLoop(psb);
  1085. }
  1086. /*
  1087. //----------------------------------------------------------
  1088. // Name : SkinUI_TrackLoop()
  1089. // Desc :
  1090. //----------------------------------------------------------
  1091. void SkinUI_TrackLoop(LPSB psb)
  1092. {
  1093. HWND hwnd;
  1094. MSG msg;
  1095. int cmd;
  1096. //POINT pt;
  1097. if( !psb->fTracking )
  1098. return;
  1099. hwnd = psb->hwnd;
  1100. while( GetCapture() == hwnd )
  1101. {
  1102. if( !GetMessage(&msg, hwnd, 0, 0) )
  1103. break;
  1104. if( !CallMsgFilter(&msg, MSGF_SCROLLBAR) )
  1105. {
  1106. cmd = msg.message;
  1107. if( msg.hwnd == hwnd &&
  1108. ((cmd >= WM_MOUSEFIRST && cmd <= WM_MOUSELAST) ||
  1109. (cmd >= WM_KEYFIRST && cmd <= WM_KEYLAST))
  1110. )
  1111. {
  1112. TRACE("message loop\n");
  1113. SkinUI_Proc(hwnd, cmd, msg.wParam, msg.lParam);
  1114. }
  1115. }
  1116. else
  1117. {
  1118. TranslateMessage(&msg);
  1119. DispatchMessage(&msg);
  1120. }
  1121. }
  1122. }*/
  1123. //----------------------------------------------------------
  1124. // Name : SkinUI_HotTrack()
  1125. // Desc : Hot scrollbar arrow and thumb items
  1126. //----------------------------------------------------------
  1127. BOOL SkinUI_HotTrack(LPSB psb, int nHitCode, BOOL fVert, BOOL fMouseDown)
  1128. {
  1129. HDC hDC;
  1130. UINT oldHit;
  1131. BOOL oldVert;
  1132. // Save old hittest code
  1133. oldHit = psb->nLastCode;
  1134. oldVert = psb->fLastVert;
  1135. psb->nLastCode = nHitCode;
  1136. psb->fLastVert = fVert;
  1137. if( (hDC = GetWindowDC(psb->hwnd)) == NULL )
  1138. return FALSE;
  1139. if( nHitCode != oldHit || fVert != oldVert || fMouseDown) {
  1140. // Restore old hittest item state
  1141. if( oldHit == HTSCROLL_LINEUP )
  1142. SkinUI_DrawArrow(psb, hDC, oldVert, HTSCROLL_LINEUP, SB_STATE_NORMAL);
  1143. else if( oldHit == HTSCROLL_LINEDOWN )
  1144. SkinUI_DrawArrow(psb, hDC, oldVert, HTSCROLL_LINEDOWN, SB_STATE_NORMAL);
  1145. else if( oldHit == HTSCROLL_THUMB )
  1146. SkinUI_DrawThumb(psb, hDC, oldVert);
  1147. // Draw new hittest item state
  1148. if( nHitCode == HTSCROLL_LINEUP )
  1149. SkinUI_DrawArrow(psb, hDC, fVert, HTSCROLL_LINEUP, fMouseDown ? SB_STATE_PRESSED : SB_STATE_HOTTRACKED);
  1150. else if( nHitCode == HTSCROLL_LINEDOWN )
  1151. SkinUI_DrawArrow(psb, hDC, fVert, HTSCROLL_LINEDOWN, fMouseDown ? SB_STATE_PRESSED : SB_STATE_HOTTRACKED);
  1152. else if( nHitCode == HTSCROLL_THUMB)
  1153. SkinUI_DrawThumb(psb, hDC, fVert);
  1154. }
  1155. ReleaseDC(psb->hwnd, hDC);
  1156. return TRUE;
  1157. }
  1158. // Message handle
  1159. //----------------------------------------------------------
  1160. // Name : SkinUI_OnStyleChanged()
  1161. // Desc :
  1162. //----------------------------------------------------------
  1163. LRESULT SkinUI_OnStyleChanged(LPSB psb, int nStyleType, LPSTYLESTRUCT lpStyleStruct)
  1164. {
  1165. if( psb->fPreventStyleChange )
  1166. return 0;
  1167. if( nStyleType == GWL_EXSTYLE ) {
  1168. BOOL fOld = psb->fLeftScrollBar;
  1169. if( lpStyleStruct->styleNew & WS_EX_LEFTSCROLLBAR )
  1170. psb->fLeftScrollBar = TRUE;
  1171. else
  1172. psb->fLeftScrollBar = FALSE;
  1173. if( fOld != psb->fLeftScrollBar )
  1174. SetWindowPos(psb->hwnd, NULL, 0, 0, 0, 0, SWP_NOZORDER |
  1175. SWP_NOSIZE | SWP_NOMOVE | SWP_NOACTIVATE | SWP_DRAWFRAME);
  1176. }
  1177. return CallWindowProc(psb->pfnOldProc, psb->hwnd, WM_STYLECHANGED, nStyleType, (LPARAM)lpStyleStruct);
  1178. }
  1179. //----------------------------------------------------------
  1180. // Name : SkinUI_OnNcCalcSize()
  1181. // Desc :
  1182. //----------------------------------------------------------
  1183. LRESULT SkinUI_OnNcCalcSize(LPSB psb, BOOL bCalcValidRects, NCCALCSIZE_PARAMS* lpncsp)
  1184. {
  1185. LRESULT lr;
  1186. DWORD dwStyle;
  1187. RECT* lprc, rect;
  1188. lprc = &lpncsp->rgrc[0];
  1189. rect = *lprc;
  1190. dwStyle = GetWindowLong(psb->hwnd, GWL_STYLE);
  1191. if( dwStyle & (WS_VSCROLL | WS_HSCROLL) ) {
  1192. psb->fPreventStyleChange = TRUE;
  1193. SetWindowLong(psb->hwnd, GWL_STYLE, dwStyle & ~(WS_VSCROLL|WS_HSCROLL));
  1194. }
  1195. lr = CallWindowProc(psb->pfnOldProc, psb->hwnd,
  1196. WM_NCCALCSIZE, (WPARAM)bCalcValidRects, (LPARAM)lpncsp);
  1197. if( dwStyle & (WS_VSCROLL | WS_HSCROLL) ) {
  1198. SetWindowLong(psb->hwnd, GWL_STYLE, dwStyle);
  1199. psb->fPreventStyleChange = FALSE;
  1200. }
  1201. if( (dwStyle & WS_HSCROLL) &&
  1202. (lprc->bottom - lprc->top) > GetSystemMetrics(SM_CYHSCROLL) ) {
  1203. lprc->bottom -= GetSystemMetrics(SM_CYHSCROLL);
  1204. }
  1205. if( (dwStyle & WS_VSCROLL) &&
  1206. (lprc->right - lprc->left) > GetSystemMetrics(SM_CXVSCROLL) ) {
  1207. if( psb->fLeftScrollBar )
  1208. lprc->left += GetSystemMetrics(SM_CXVSCROLL);
  1209. else
  1210. lprc->right -= GetSystemMetrics(SM_CXVSCROLL);
  1211. }
  1212. return lr;
  1213. }
  1214. //----------------------------------------------------------
  1215. // Name : SkinUI_OnNcPaint()
  1216. // Desc :
  1217. //----------------------------------------------------------
  1218. LRESULT SkinUI_OnNcPaint(LPSB psb, HRGN hRgn)
  1219. {
  1220. LRESULT lr;
  1221. DWORD dwStyle;
  1222. HDC hDC;
  1223. dwStyle = GetWindowLong(psb->hwnd, GWL_STYLE);
  1224. if( dwStyle & (WS_VSCROLL | WS_HSCROLL) ) {
  1225. psb->fPreventStyleChange = TRUE;
  1226. SetWindowLong(psb->hwnd, GWL_STYLE, dwStyle & ~(WS_VSCROLL|WS_HSCROLL));
  1227. }
  1228. // draw frame border by system
  1229. lr = CallWindowProc(psb->pfnOldProc, psb->hwnd, WM_NCPAINT, (WPARAM)hRgn, 0);
  1230. if( dwStyle & (WS_VSCROLL | WS_HSCROLL) ) {
  1231. SetWindowLong(psb->hwnd, GWL_STYLE, dwStyle);
  1232. psb->fPreventStyleChange = FALSE;
  1233. }
  1234. //hDC = GetDCEx(psb->hwnd, hRgn, DCX_WINDOW|DCX_INTERSECTRGN|DCX_CACHE );
  1235. hDC = GetWindowDC(psb->hwnd);
  1236. // draw the size box
  1237. if( dwStyle & (WS_VSCROLL | WS_HSCROLL) )
  1238. SkinUI_DrawSizeBox(psb, hDC);
  1239. // Draw scrollbar
  1240. if( dwStyle & WS_VSCROLL )
  1241. SkinUI_DrawScrollBar(psb, hDC, TRUE);
  1242. if( dwStyle & WS_HSCROLL )
  1243. SkinUI_DrawScrollBar(psb, hDC, FALSE);
  1244. ReleaseDC(psb->hwnd, hDC);
  1245. return lr;
  1246. }
  1247. //----------------------------------------------------------
  1248. // Name : SkinUI_OnNcHitTest()
  1249. // Desc :
  1250. //----------------------------------------------------------
  1251. LRESULT SkinUI_OnNcHitTest(LPSB psb, WPARAM wParam, LPARAM lParam)
  1252. {
  1253. POINT pt;
  1254. RECT rcHorz, rcVert, rcSize;
  1255. pt.x = GET_X_LPARAM(lParam);
  1256. pt.y = GET_Y_LPARAM(lParam);
  1257. SkinUI_GetScrollBarRect(psb, TRUE, &rcVert);
  1258. SkinUI_GetScrollBarRect(psb, FALSE, &rcHorz);
  1259. SkinUI_GetSizeBoxRect(psb, &rcSize);
  1260. if( PtInRect(&rcVert, pt) )
  1261. return HTVSCROLL;
  1262. else if( PtInRect(&rcHorz, pt) )
  1263. return HTHSCROLL;
  1264. else if( PtInRect(&rcSize, pt) )
  1265. return HTSIZE;
  1266. return CallWindowProc(psb->pfnOldProc, psb->hwnd, WM_NCHITTEST, wParam, lParam);
  1267. }
  1268. //----------------------------------------------------------
  1269. // Name : SkinUI_OnNcMouseMove()
  1270. // Desc :
  1271. //----------------------------------------------------------
  1272. LRESULT SkinUI_OnNcMouseMove(LPSB psb, WPARAM wParam, LPARAM lParam)
  1273. {
  1274. if( wParam == HTHSCROLL || wParam == HTVSCROLL ) {
  1275. POINT pt;
  1276. BOOL fVert;
  1277. int nHitCode;
  1278. pt.x = GET_X_LPARAM(lParam);
  1279. pt.y = GET_Y_LPARAM(lParam);
  1280. fVert = ( wParam == HTVSCROLL );
  1281. nHitCode = SkinUI_HitTest(psb, fVert, pt);
  1282. SkinUI_HotTrack(psb, nHitCode, fVert, FALSE);
  1283. }
  1284. else if( wParam == HTSIZE ) {
  1285. SkinUI_HotTrack(psb, HTSCROLL_NONE, FALSE, FALSE);
  1286. }
  1287. return CallWindowProc(psb->pfnOldProc, psb->hwnd, WM_NCMOUSEMOVE, wParam, lParam);
  1288. }
  1289. //---------------------------------------------------------
  1290. // Name : SkinUI_OnNcMouseLeave()
  1291. // Desc :
  1292. //---------------------------------------------------------
  1293. LRESULT SkinUI_OnNcMouseLeave(LPSB psb, WPARAM wParam, LPARAM lParam)
  1294. {
  1295. psb->fMouseTracking = FALSE;
  1296. if( psb->fTracking )
  1297. return 0;
  1298. SkinUI_HotTrack(psb, HTSCROLL_NONE, FALSE, FALSE);
  1299. psb->nLastCode = HTSCROLL_NONE;
  1300. return 0;
  1301. }
  1302. //----------------------------------------------------------
  1303. // Name : SkinUI_OnNcLButtonDown()
  1304. // Desc :
  1305. //----------------------------------------------------------
  1306. LRESULT SkinUI_OnNcLButtonDown(LPSB psb, WPARAM wParam, LPARAM lParam)
  1307. {
  1308. if( wParam == HTHSCROLL || wParam == HTVSCROLL ) {
  1309. POINT pt;
  1310. BOOL fVert;
  1311. int nHitCode;
  1312. LPSCROLLINFO psi;
  1313. pt.x = GET_X_LPARAM(lParam);
  1314. pt.y = GET_Y_LPARAM(lParam);
  1315. fVert = (wParam == HTVSCROLL);
  1316. psi = (fVert ? &psb->Vert : &psb->Horz);
  1317. nHitCode = SkinUI_HitTest(psb, fVert, pt);
  1318. psb->nLastCode = nHitCode;
  1319. psb->fLastVert = fVert;
  1320. SkinUI_Track(psb, fVert, nHitCode, pt);
  1321. return 0;
  1322. }
  1323. return CallWindowProc(psb->pfnOldProc, psb->hwnd, WM_NCLBUTTONDOWN, wParam, lParam);
  1324. }
  1325. //----------------------------------------------------------
  1326. // Name : SkinUI_OnMouseMove()
  1327. // Desc :
  1328. //----------------------------------------------------------
  1329. LRESULT SkinUI_OnMouseMove(LPSB psb, WPARAM wParam, LPARAM lParam)
  1330. {
  1331. DWORD dwPos;
  1332. POINT pt;
  1333. UINT nHitCode, nHitTest;
  1334. dwPos = GetMessagePos();
  1335. pt.x = GET_X_LPARAM(dwPos);
  1336. pt.y = GET_Y_LPARAM(dwPos);
  1337. // Mouse left button down
  1338. if( psb->fTracking && wParam & MK_LBUTTON ) {
  1339. if( psb->nTrackCode == HTSCROLL_THUMB ) {
  1340. SkinUI_TrackThumb(psb, psb->fTrackVert, pt);
  1341. return 0;
  1342. }
  1343. nHitTest = (UINT)SkinUI_OnNcHitTest(psb, 0, dwPos);
  1344. if( nHitTest == HTHSCROLL || nHitTest == HTVSCROLL ) {
  1345. BOOL fVert = (nHitTest == HTVSCROLL);
  1346. nHitCode = SkinUI_HitTest(psb, fVert, pt);
  1347. if( nHitCode != psb->nTrackCode || fVert != psb->fTrackVert) {
  1348. // Unallowed hot-track other hittest item
  1349. SkinUI_HotTrack(psb, HTSCROLL_NONE, FALSE, FALSE);
  1350. }
  1351. else {
  1352. SkinUI_HotTrack(psb, psb->nTrackCode, psb->fTrackVert, TRUE);
  1353. }
  1354. }
  1355. else {
  1356. SkinUI_HotTrack(psb, HTSCROLL_NONE, FALSE, FALSE);
  1357. }
  1358. return 0;
  1359. }
  1360. return CallWindowProc(psb->pfnOldProc, psb->hwnd, WM_MOUSEMOVE, wParam, lParam);
  1361. }
  1362. //----------------------------------------------------------
  1363. // Name : SkinUI_OnLButtonUp()
  1364. // Desc :
  1365. //----------------------------------------------------------
  1366. LRESULT SkinUI_OnLButtonUp(LPSB psb, WPARAM wParam, LPARAM lParam)
  1367. {
  1368. if( psb->nTrackCode != HTSCROLL_NONE && psb->fTracking) {
  1369. // Release mouse capture
  1370. ReleaseCapture();
  1371. // End scroll
  1372. switch( psb->nTrackCode )
  1373. {
  1374. case HTSCROLL_LINEUP:
  1375. case HTSCROLL_LINEDOWN:
  1376. case HTSCROLL_PAGEUP:
  1377. case HTSCROLL_PAGEDOWN:
  1378. KillTimer(psb->hwnd, SB_TIMER_SCROLL);
  1379. DoScrollMsg(psb->hwnd, SB_ENDSCROLL, 0, psb->fTrackVert);
  1380. break;
  1381. case HTSCROLL_THUMB:
  1382. if( psb->fTracking ) {
  1383. DWORD dwPos;
  1384. POINT pt;
  1385. dwPos = GetMessagePos();
  1386. pt.x = GET_X_LPARAM(dwPos);
  1387. pt.y = GET_Y_LPARAM(dwPos);
  1388. DoScrollMsg(psb->hwnd, SB_THUMBPOSITION, psb->nTrackPos, psb->fTrackVert);
  1389. DoScrollMsg(psb->hwnd, SB_ENDSCROLL, 0, psb->fTrackVert);
  1390. psb->nLastCode = SkinUI_HitTest(psb, psb->fTrackVert, pt);
  1391. }
  1392. break;
  1393. }
  1394. // Clean the track parameters
  1395. psb->nOffsetPoint = 0;
  1396. psb->nScrollTimerMsg = MAKELONG(WM_NULL, 0);
  1397. psb->nTrackCode = HTSCROLL_NONE;
  1398. psb->fTracking = FALSE;
  1399. psb->nTrackPos = 0;
  1400. HDC hdc = GetWindowDC(psb->hwnd);
  1401. SkinUI_DrawThumb(psb, hdc, psb->fTrackVert);
  1402. ReleaseDC(psb->hwnd, hdc);
  1403. return 0;
  1404. }
  1405. return CallWindowProc(psb->pfnOldProc, psb->hwnd, WM_LBUTTONUP, wParam, lParam);
  1406. }
  1407. //----------------------------------------------------------
  1408. // Name : SkinUI_OnTimer()
  1409. // Desc :
  1410. //----------------------------------------------------------
  1411. LRESULT SkinUI_OnTimer(LPSB psb, WPARAM wParam, LPARAM lParam)
  1412. {
  1413. if(wParam == SB_TIMER_SCROLL) {
  1414. // if mouse left button released then close scroll timer
  1415. if( psb->nTrackCode == HTSCROLL_NONE ) {
  1416. KillTimer(psb->hwnd, SB_TIMER_SCROLL);
  1417. return 0;
  1418. }
  1419. // Timer send scroll message
  1420. if( psb->nTrackCode == psb->nLastCode && psb->fTrackVert == psb->fLastVert )
  1421. DoScrollMsg(psb->hwnd, HIWORD(psb->nScrollTimerMsg), 0, psb->fTrackVert);
  1422. return 0;
  1423. }
  1424. else if(wParam == SB_TIMER_DELAY) {
  1425. KillTimer(psb->hwnd, SB_TIMER_DELAY);
  1426. SetTimer(psb->hwnd, SB_TIMER_SCROLL, SB_SCROLL_INTERVAL, 0);
  1427. return 0;
  1428. }
  1429. return CallWindowProc(psb->pfnOldProc, psb->hwnd, WM_TIMER, wParam, lParam);
  1430. }
  1431. //----------------------------------------------------------
  1432. // Name : SkinUI_Proc()
  1433. // Desc :
  1434. //----------------------------------------------------------
  1435. LRESULT CALLBACK SkinUI_Proc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
  1436. {
  1437. LPSB psb = SkinUI_GetSB(hwnd);
  1438. if( psb && uMsg == WM_NCMOUSEMOVE ) {
  1439. if(!psb->fMouseTracking && !psb->fTracking) {
  1440. TRACKMOUSEEVENT tme;
  1441. tme.cbSize = sizeof(tme);
  1442. tme.hwndTrack = psb->hwnd;
  1443. tme.dwFlags = TME_LEAVE|TME_NONCLIENT;
  1444. tme.dwHoverTime = 0;
  1445. psb->fMouseTracking = _TrackMouseEvent(&tme);
  1446. }
  1447. }
  1448. switch( uMsg )
  1449. {
  1450. case WM_NCPAINT:
  1451. return SkinUI_OnNcPaint(psb, (HRGN)wParam);
  1452. case WM_NCCALCSIZE:
  1453. return SkinUI_OnNcCalcSize(psb, (BOOL)wParam, (NCCALCSIZE_PARAMS*)lParam);
  1454. case WM_NCHITTEST:
  1455. return SkinUI_OnNcHitTest(psb, wParam, lParam);
  1456. case WM_STYLECHANGED:
  1457. return SkinUI_OnStyleChanged(psb, (int)wParam, (LPSTYLESTRUCT)lParam);
  1458. case WM_NCLBUTTONDOWN:
  1459. return SkinUI_OnNcLButtonDown(psb, wParam, lParam);
  1460. case WM_NCMOUSEMOVE:
  1461. return SkinUI_OnNcMouseMove(psb, wParam, lParam);
  1462. case WM_MOUSEMOVE:
  1463. return SkinUI_OnMouseMove(psb, wParam, lParam);
  1464. case WM_LBUTTONUP:
  1465. return SkinUI_OnLButtonUp(psb, wParam, lParam);
  1466. case WM_NCMOUSELEAVE:
  1467. return SkinUI_OnNcMouseLeave(psb, wParam, lParam);
  1468. case WM_NCLBUTTONDBLCLK:
  1469. case WM_NCRBUTTONDBLCLK:
  1470. return 0;
  1471. case WM_TIMER:
  1472. return SkinUI_OnTimer(psb, wParam, lParam);
  1473. case WM_NCDESTROY:
  1474. LRESULT lr = CallWindowProc(psb->pfnOldProc, hwnd, uMsg, wParam, lParam);
  1475. SkinUI_Uninit(hwnd);
  1476. return lr;
  1477. }
  1478. return CallWindowProc(psb->pfnOldProc, hwnd, uMsg, wParam, lParam);
  1479. }