scrollbar.c 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666
  1. /*
  2. * File : scrollbar.c
  3. * This file is part of RT-Thread RTOS
  4. * COPYRIGHT (C) 2006 - 2009, RT-Thread Development Team
  5. *
  6. * The license and distribution terms for this file may be
  7. * found in the file LICENSE in this distribution or at
  8. * http://www.rt-thread.org/license/LICENSE
  9. *
  10. * Change Logs:
  11. * Date Author Notes
  12. * 2010-08-09 Bernard first version
  13. */
  14. #include <rtgui/dc.h>
  15. #include <rtgui/widgets/scrollbar.h>
  16. #include <rtgui/rtgui_theme.h>
  17. static void _rtgui_scrollbar_constructor(rtgui_scrollbar_t *bar)
  18. {
  19. /* set event handler */
  20. rtgui_widget_set_event_handler(bar, rtgui_scrollbar_event_handler);
  21. bar->status = 0;
  22. bar->value = 0;
  23. bar->thumb_w = 16;
  24. bar->thumb_len = 16;
  25. bar->widgetlnk = RT_NULL;
  26. bar->on_scroll = RT_NULL;
  27. bar->orient = RTGUI_HORIZONTAL;
  28. /* set gc */
  29. RTGUI_WIDGET_TEXTALIGN(bar) = RTGUI_ALIGN_CENTER_HORIZONTAL|RTGUI_ALIGN_CENTER_VERTICAL;
  30. }
  31. static void _rtgui_scrollbar_destructor(rtgui_scrollbar_t *bar)
  32. {
  33. }
  34. rt_inline rt_uint32_t _rtgui_scrollbar_get_length(rtgui_scrollbar_t *bar)
  35. {
  36. rtgui_rect_t rect;
  37. rt_uint32_t result;
  38. rtgui_widget_get_rect(bar, &rect);
  39. if(bar->orient & RTGUI_VERTICAL)
  40. result = rtgui_rect_height(rect) - 2*rtgui_rect_width(rect) - bar->thumb_len;
  41. else
  42. result = rtgui_rect_width(rect) - 2*rtgui_rect_height(rect) - bar->thumb_len;
  43. return result;
  44. }
  45. rt_inline rt_uint32_t get_scrollbar_pos(rtgui_scrollbar_t* bar)
  46. {
  47. double pos,ftmp;
  48. rt_uint32_t result;
  49. /* calculate thumb position */
  50. pos = bar->value;
  51. ftmp = _rtgui_scrollbar_get_length(bar);
  52. pos *= ftmp;
  53. ftmp = bar->count;
  54. pos /= ftmp;
  55. result = pos;
  56. return result;
  57. }
  58. rtgui_type_t *rtgui_scrollbar_type_get(void)
  59. {
  60. static rtgui_type_t *scrollbar_type = RT_NULL;
  61. if(!scrollbar_type)
  62. {
  63. scrollbar_type = rtgui_type_create("scrollbar", RTGUI_WIDGET_TYPE,
  64. sizeof(rtgui_scrollbar_t),
  65. RTGUI_CONSTRUCTOR(_rtgui_scrollbar_constructor),
  66. RTGUI_DESTRUCTOR(_rtgui_scrollbar_destructor));
  67. }
  68. return scrollbar_type;
  69. }
  70. rtgui_scrollbar_t* rtgui_scrollbar_create(PVOID parent,int left,int top,int w,int len,int orient)
  71. {
  72. rtgui_scrollbar_t* bar;
  73. RT_ASSERT(parent != RT_NULL);
  74. bar = rtgui_widget_create (RTGUI_SCROLLBAR_TYPE);
  75. if(bar != RT_NULL)
  76. {
  77. rtgui_rect_t rect;
  78. rtgui_widget_get_rect(parent, &rect);
  79. rtgui_widget_rect_to_device(parent,&rect);
  80. rect.x1 += left;
  81. rect.y1 += top;
  82. bar->thumb_w = w;
  83. if(orient == RTGUI_VERTICAL)
  84. {
  85. rect.x2 = rect.x1+w;
  86. rect.y2 = rect.y1+len;
  87. }
  88. else
  89. {
  90. rect.x2 = rect.x1+len;
  91. rect.y2 = rect.y1+w;
  92. }
  93. rtgui_widget_set_rect(bar, &rect);
  94. bar->orient = orient;
  95. rtgui_container_add_child(parent, bar);
  96. }
  97. return bar;
  98. }
  99. void rtgui_scrollbar_destroy(rtgui_scrollbar_t* bar)
  100. {
  101. rtgui_widget_destroy(bar);
  102. }
  103. void rtgui_scrollbar_get_thumb_rect(rtgui_scrollbar_t *bar, rtgui_rect_t *erect)
  104. {
  105. rtgui_rect_t rect;
  106. rtgui_widget_get_rect(bar, &rect);
  107. if(bar->orient & RTGUI_VERTICAL)
  108. {
  109. /* vertical scroll bar */
  110. erect->x1 = rect.x1;
  111. erect->x2 = rect.x2;
  112. erect->y1 = rect.y1 + rtgui_rect_width(rect) + get_scrollbar_pos(bar);
  113. erect->y2 = erect->y1 + bar->thumb_len;
  114. }
  115. else
  116. {
  117. /* horizontal scroll bar */
  118. erect->x1 = rect.x1 + rtgui_rect_height(rect) + get_scrollbar_pos(bar);
  119. erect->x2 = erect->x1 + bar->thumb_len;
  120. erect->y1 = rect.y1;
  121. erect->y2 = rect.y2;
  122. }
  123. }
  124. static rtgui_point_t sbar_mouse_move_size;
  125. static void _rtgui_scrollbar_on_mouseclick(PVOID wdt, rtgui_event_t * event)
  126. {
  127. rtgui_widget_t *widget = (rtgui_widget_t*)wdt;
  128. rtgui_rect_t btn_rect, bar_rect,rect;
  129. rt_uint32_t pos;
  130. rtgui_scrollbar_t *bar = (rtgui_scrollbar_t*)widget;
  131. rtgui_event_mouse_t *mouse = (rtgui_event_mouse_t*)event;
  132. RT_ASSERT(bar != RT_NULL);
  133. /* get value */
  134. pos = get_scrollbar_pos(bar);
  135. rtgui_widget_get_rect(bar, &rect);
  136. rtgui_widget_rect_to_device(bar,&rect);
  137. if(bar->orient == RTGUI_VERTICAL)
  138. { /* arrange vertical */
  139. /* get up arrow button rect */
  140. btn_rect.x1 = rect.x1;
  141. btn_rect.x2 = rect.x2;
  142. btn_rect.y1 = rect.y1;
  143. btn_rect.y2 = rect.y1 + rtgui_rect_width(rect);
  144. if(rtgui_rect_contains_point(&btn_rect, mouse->x, mouse->y) == RT_EOK)
  145. {
  146. if((mouse->button & RTGUI_MOUSE_BUTTON_LEFT) && (mouse->button & RTGUI_MOUSE_BUTTON_DOWN))
  147. {
  148. bar->status |= SBAR_UPARROW;
  149. if(bar->value==0)
  150. {
  151. rtgui_theme_draw_scrollbar(bar);
  152. return;
  153. }
  154. /* line step */
  155. bar->value -= bar->line_step;
  156. if(bar->value < 0) bar->value = 0;
  157. }
  158. else if(mouse->button & RTGUI_MOUSE_BUTTON_UP)
  159. {
  160. bar->status = 0;
  161. }
  162. goto __exit;
  163. }
  164. /* click on the thumb chunk, be going to dragging */
  165. rtgui_scrollbar_get_thumb_rect(bar, &bar_rect);
  166. rtgui_widget_rect_to_device(bar,&bar_rect);
  167. if(rtgui_rect_contains_point(&bar_rect, mouse->x, mouse->y) == RT_EOK)
  168. { /* on thumb */
  169. if((mouse->button & RTGUI_MOUSE_BUTTON_LEFT) && (mouse->button & RTGUI_MOUSE_BUTTON_DOWN))
  170. { /* changed status into drag */
  171. bar->status |= SBAR_VERTTHUMB;
  172. sbar_mouse_move_size.x = mouse->x;
  173. sbar_mouse_move_size.y = mouse->y;
  174. }
  175. else if(mouse->button & RTGUI_MOUSE_BUTTON_UP)
  176. {
  177. bar->status = 0;
  178. }
  179. goto __exit;
  180. }
  181. else
  182. { /* click on space without thumb */
  183. /* get bar rect */
  184. bar_rect.y1 = rect.y1 + rtgui_rect_width(rect);
  185. bar_rect.y2 = rect.y2 - rtgui_rect_width(rect);
  186. if(rtgui_rect_contains_point(&bar_rect, mouse->x, mouse->y) == RT_EOK)
  187. {
  188. if((mouse->button & RTGUI_MOUSE_BUTTON_LEFT) && (mouse->button & RTGUI_MOUSE_BUTTON_DOWN))
  189. {
  190. /* page step */
  191. if(mouse->y < bar_rect.y1 + pos)
  192. {
  193. bar->status |= SBAR_UPSPACE;
  194. bar->value -= bar->page_step;
  195. if(bar->value < 0) bar->value = 0;
  196. }
  197. else if(mouse->y > pos + bar->thumb_len)
  198. {
  199. bar->status |= SBAR_DOWNSPACE;
  200. bar->value += bar->page_step;
  201. if(bar->value > bar->count) bar->value = bar->count;
  202. }
  203. }
  204. goto __exit;
  205. }
  206. }
  207. /* likewise foregoing */
  208. /* get down arrow button rect */
  209. bar_rect.x1 = rect.x1;
  210. bar_rect.x2 = rect.x2;
  211. btn_rect.y1 = rect.y2 - rtgui_rect_width(rect);
  212. btn_rect.y2 = rect.y2;
  213. if(rtgui_rect_contains_point(&btn_rect, mouse->x, mouse->y) == RT_EOK)
  214. {
  215. if((mouse->button & RTGUI_MOUSE_BUTTON_LEFT) && (mouse->button & RTGUI_MOUSE_BUTTON_DOWN))
  216. {
  217. bar->status |= SBAR_DOWNARROW;
  218. if(bar->value==bar->count)
  219. {
  220. rtgui_theme_draw_scrollbar(bar);
  221. return;
  222. }
  223. /* line step */
  224. bar->value += bar->line_step;
  225. if(bar->value > bar->count) bar->value = bar->count;
  226. }
  227. else if(mouse->button & RTGUI_MOUSE_BUTTON_UP)
  228. bar->status = 0;
  229. goto __exit;
  230. }
  231. }
  232. else
  233. {
  234. /* get left arrow button rect */
  235. btn_rect.x1 = rect.x1;
  236. btn_rect.x2 = rect.x1 + rtgui_rect_height(rect);
  237. btn_rect.y1 = rect.y1;
  238. btn_rect.y2 = rect.y2;
  239. if(rtgui_rect_contains_point(&btn_rect, mouse->x, mouse->y) == RT_EOK)
  240. {
  241. if((mouse->button & RTGUI_MOUSE_BUTTON_LEFT) && (mouse->button & RTGUI_MOUSE_BUTTON_DOWN))
  242. {
  243. bar->status |= SBAR_LEFTARROW;
  244. if(bar->value==0)
  245. {
  246. rtgui_theme_draw_scrollbar(bar);
  247. return;
  248. }
  249. /* line step */
  250. bar->value -= bar->line_step;
  251. if(bar->value < 0) bar->value = 0;
  252. }
  253. else if(mouse->button & RTGUI_MOUSE_BUTTON_UP)
  254. bar->status = 0;
  255. goto __exit;
  256. }
  257. rtgui_scrollbar_get_thumb_rect(bar, &bar_rect);
  258. rtgui_widget_rect_to_device(bar,&bar_rect);
  259. if(rtgui_rect_contains_point(&bar_rect, mouse->x, mouse->y) == RT_EOK)
  260. {/* on the thumb */
  261. if((mouse->button & RTGUI_MOUSE_BUTTON_LEFT) && (mouse->button & RTGUI_MOUSE_BUTTON_DOWN))
  262. {
  263. bar->status |= SBAR_HORZTHUMB;
  264. sbar_mouse_move_size.x = mouse->x;
  265. sbar_mouse_move_size.y = mouse->y;
  266. }
  267. else if(mouse->button & RTGUI_MOUSE_BUTTON_UP)
  268. {
  269. bar->status = 0;
  270. }
  271. goto __exit;
  272. }
  273. else
  274. {
  275. /* get bar rect */
  276. bar_rect.x1 = rect.x1 + rtgui_rect_height(rect);
  277. bar_rect.x2 = rect.x2 - rtgui_rect_height(rect);
  278. bar_rect.y1 = rect.y1;
  279. bar_rect.y2 = rect.y2;
  280. if(rtgui_rect_contains_point(&bar_rect, mouse->x, mouse->y) == RT_EOK)
  281. {
  282. if((mouse->button & RTGUI_MOUSE_BUTTON_LEFT) && (mouse->button & RTGUI_MOUSE_BUTTON_DOWN))
  283. {
  284. /* page step */
  285. if(mouse->x < bar_rect.x1 + pos)
  286. {
  287. bar->status |= SBAR_LEFTSPACE;
  288. bar->value -= bar->page_step;
  289. if(bar->value < 0) bar->value = 0;
  290. }
  291. else if(mouse->x > pos + bar->thumb_len)
  292. {
  293. bar->status |= SBAR_RIGHTSPACE;
  294. bar->value += bar->page_step;
  295. if(bar->value > bar->count) bar->value = bar->count;
  296. }
  297. }
  298. else if(mouse->button & RTGUI_MOUSE_BUTTON_UP)
  299. {
  300. bar->status = 0;
  301. }
  302. goto __exit;
  303. }
  304. }
  305. /* get right arrow button rect */
  306. btn_rect.x1 = rect.x2 - rtgui_rect_height(rect);
  307. btn_rect.x2 = rect.x2;
  308. bar_rect.y1 = rect.y1;
  309. bar_rect.y2 = rect.y2;
  310. if(rtgui_rect_contains_point(&btn_rect, mouse->x, mouse->y) == RT_EOK)
  311. {
  312. if((mouse->button & RTGUI_MOUSE_BUTTON_LEFT) && (mouse->button & RTGUI_MOUSE_BUTTON_DOWN))
  313. {
  314. bar->status |= SBAR_RIGHTARROW;
  315. if(bar->value==bar->count)
  316. {
  317. rtgui_theme_draw_scrollbar(bar);
  318. return;
  319. }
  320. /* line step */
  321. bar->value += bar->line_step;
  322. if(bar->value > bar->count) bar->value = bar->count;
  323. }
  324. else if(mouse->button & RTGUI_MOUSE_BUTTON_UP)
  325. bar->status = 0;
  326. goto __exit;
  327. }
  328. }
  329. __exit:
  330. rtgui_theme_draw_scrollbar(bar);
  331. if((mouse->button & RTGUI_MOUSE_BUTTON_LEFT) && (mouse->button & RTGUI_MOUSE_BUTTON_DOWN))
  332. {
  333. if(bar->widgetlnk != RT_NULL && bar->on_scroll != RT_NULL)
  334. {
  335. rtgui_widget_focus(bar->widgetlnk);
  336. bar->on_scroll(bar->widgetlnk, RT_NULL);
  337. }
  338. }
  339. }
  340. /* thumb chunk activity */
  341. static void _rtgui_scrollbar_on_mousemotion(PVOID wdt, rtgui_event_t * event)
  342. {
  343. #include <stdlib.h>
  344. float tmppos;
  345. rt_uint32_t pos;
  346. rtgui_scrollbar_t *bar = (rtgui_scrollbar_t*)wdt;
  347. rtgui_event_mouse_t *mouse = (rtgui_event_mouse_t*)event;
  348. tmppos = _rtgui_scrollbar_get_length(bar);
  349. tmppos /= bar->count;
  350. pos = (rt_uint32_t)tmppos;
  351. if(bar->orient == RTGUI_VERTICAL)
  352. {
  353. if(bar->status & SBAR_VERTTHUMB)
  354. { /* from then on mouseclick */
  355. if((mouse->y-sbar_mouse_move_size.y) > 3)
  356. {
  357. bar->status |= SBAR_DOWNTHUMB;
  358. }
  359. else if((mouse->y-sbar_mouse_move_size.y) < -3)
  360. {
  361. bar->status |= SBAR_UPTHUMB;
  362. }
  363. else bar->status &= ~(SBAR_UPTHUMB|SBAR_DOWNTHUMB);
  364. if(abs(mouse->y-sbar_mouse_move_size.y) >= pos)
  365. {
  366. int step = abs(mouse->y-sbar_mouse_move_size.y)/pos;
  367. sbar_mouse_move_size.y = mouse->y;
  368. if(bar->status & SBAR_UPTHUMB)
  369. {
  370. bar->value -= step;
  371. if(bar->value < 0) bar->value = 0;
  372. }
  373. else if(bar->status & SBAR_DOWNTHUMB)
  374. {
  375. bar->value += step;
  376. if(bar->value > bar->count) bar->value = bar->count;
  377. }
  378. goto __exit;
  379. }
  380. }
  381. else if(bar->status & SBAR_UPARROW)
  382. { /* on-going push down uparrow button */
  383. if(bar->value==0)return;
  384. bar->value -= bar->line_step;
  385. if(bar->value < 0) bar->value = 0;
  386. goto __exit;
  387. }
  388. else if(bar->status & SBAR_DOWNARROW)
  389. { /* on-going push down downarrow button */
  390. if(bar->value==bar->count)return;
  391. bar->value += bar->line_step;
  392. if(bar->value > bar->count) bar->value = bar->count;
  393. goto __exit;
  394. }
  395. /*else if(bar->status & SBAR_UPSPACE)
  396. {
  397. bar->value -= bar->page_step;
  398. if(bar->value < 0) bar->value = 0;
  399. goto __exit;
  400. }
  401. else if(bar->status & SBAR_DOWNSPACE)
  402. {
  403. bar->value += bar->page_step;
  404. if(bar->value > bar->count) bar->value = bar->count;
  405. goto __exit;
  406. }*/
  407. return;
  408. }
  409. else
  410. { /* 水平排列 */
  411. if(bar->status & SBAR_HORZTHUMB)
  412. {
  413. if((mouse->x-sbar_mouse_move_size.x) > 5)
  414. {
  415. bar->status |= SBAR_RIGHTTHUMB;
  416. }
  417. else if((mouse->x-sbar_mouse_move_size.x) < -5)
  418. {
  419. bar->status |= SBAR_LEFTTHUMB;
  420. }
  421. if(abs(mouse->x-sbar_mouse_move_size.x) > pos)
  422. {
  423. int step = abs(mouse->x-sbar_mouse_move_size.x)/pos;
  424. sbar_mouse_move_size.x = mouse->x;
  425. if(bar->status & SBAR_LEFTTHUMB)
  426. {
  427. bar->value -= step;
  428. if(bar->value < 0) bar->value = 0;
  429. }
  430. else if(bar->status & SBAR_RIGHTTHUMB)
  431. {
  432. bar->value += step;
  433. if(bar->value > bar->count) bar->value = bar->count;
  434. }
  435. goto __exit;
  436. }
  437. }
  438. else if(bar->status & SBAR_LEFTARROW)
  439. {
  440. if(bar->value==0)return;
  441. bar->value -= bar->line_step;
  442. if(bar->value < 0) bar->value = 0;
  443. goto __exit;
  444. }
  445. else if(bar->status & SBAR_RIGHTARROW)
  446. {
  447. if(bar->value==bar->count)return;
  448. bar->value += bar->line_step;
  449. if(bar->value > bar->count) bar->value = bar->count;
  450. goto __exit;
  451. }
  452. /*else if(bar->status & SBAR_LEFTSPACE)
  453. {
  454. bar->value -= bar->page_step;
  455. if(bar->value < bar->min) bar->value = bar->min;
  456. goto __exit;
  457. }
  458. else if(bar->status & SBAR_RIGHTSPACE)
  459. {
  460. bar->value += bar->page_step;
  461. if(bar->value > bar->count-1) bar->value = bar->count-1;
  462. goto __exit;
  463. }*/
  464. return;
  465. }
  466. __exit:
  467. rtgui_theme_draw_scrollbar(bar);
  468. if(bar->widgetlnk != RT_NULL && bar->on_scroll != RT_NULL)
  469. {
  470. rtgui_widget_focus(bar->widgetlnk);
  471. bar->on_scroll(bar->widgetlnk, RT_NULL);
  472. }
  473. }
  474. rt_bool_t rtgui_scrollbar_event_handler(PVOID wdt, rtgui_event_t *event)
  475. {
  476. rtgui_widget_t *widget = (rtgui_widget_t*)wdt;
  477. rtgui_scrollbar_t* bar = (rtgui_scrollbar_t*)widget;
  478. if(RTGUI_WIDGET_IS_HIDE(bar))return RT_FALSE;
  479. switch (event->type)
  480. {
  481. case RTGUI_EVENT_PAINT:
  482. if(widget->on_draw != RT_NULL)
  483. widget->on_draw(widget, event);
  484. else
  485. {
  486. if(!RTGUI_WIDGET_IS_HIDE(bar))
  487. rtgui_theme_draw_scrollbar(bar);
  488. }
  489. break;
  490. case RTGUI_EVENT_MOUSE_BUTTON:
  491. if(RTGUI_WIDGET_IS_ENABLE(widget))
  492. {
  493. if(widget->on_mouseclick != RT_NULL)
  494. {
  495. widget->on_mouseclick(widget, event);
  496. }
  497. else
  498. {
  499. _rtgui_scrollbar_on_mouseclick(bar, event);
  500. }
  501. }
  502. break;
  503. case RTGUI_EVENT_MOUSE_MOTION:
  504. if(RTGUI_WIDGET_IS_ENABLE(widget))
  505. {
  506. _rtgui_scrollbar_on_mousemotion(bar, event);
  507. }
  508. default:
  509. break;
  510. }
  511. return RT_FALSE;
  512. }
  513. void rtgui_scrollbar_set_orientation(rtgui_scrollbar_t* bar, int orient)
  514. {
  515. RT_ASSERT(bar != RT_NULL);
  516. bar->orient = orient;
  517. }
  518. //取得活动条的可活动区域的长度
  519. rt_uint32_t get_sbar_active_len(rtgui_scrollbar_t *bar)
  520. {
  521. rtgui_rect_t rect;
  522. rtgui_widget_get_rect(bar, &rect);
  523. if(bar->orient & RTGUI_VERTICAL)
  524. return rtgui_rect_height(rect) - 2*rtgui_rect_width(rect);
  525. else
  526. return rtgui_rect_width(rect) - 2*rtgui_rect_height(rect);
  527. }
  528. void rtgui_scrollbar_set_thumbbar_len(rtgui_scrollbar_t* bar)
  529. {
  530. double size=0;
  531. rt_uint32_t len,w;
  532. RT_ASSERT(bar != RT_NULL);
  533. //Make sure called rtgui_scrollbar_set_range(),before you use under code.
  534. //计算活动块尺寸的方法:
  535. //用一页项目条数/总计数条数的比值,来确定活动块在可活动区域中的比例,
  536. //当函数很多是,使用活动块宽的的一半作为最小尺寸.
  537. size = bar->page_step;
  538. size /= bar->count+bar->page_step;
  539. size *= get_sbar_active_len(bar);
  540. len = (rt_uint32_t)size ;
  541. w = bar->thumb_w;
  542. if(len < w/2) len = w/2;
  543. bar->thumb_len = len;
  544. }
  545. //下面三个函数的调用顺序:
  546. //1.SetLineStep();2.SetPageStep();3.SetRange();
  547. void rtgui_scrollbar_set_line_step(rtgui_scrollbar_t* bar, int step)
  548. {
  549. RT_ASSERT(bar != RT_NULL);
  550. bar->line_step = step;
  551. }
  552. void rtgui_scrollbar_set_page_step(rtgui_scrollbar_t* bar, int step)
  553. {
  554. RT_ASSERT(bar != RT_NULL);
  555. bar->page_step = step;
  556. }
  557. void rtgui_scrollbar_set_range(rtgui_scrollbar_t* bar, int count)
  558. {
  559. RT_ASSERT(bar != RT_NULL);
  560. /* disable or enable scrollbar */
  561. if(bar->page_step >= count)
  562. { /* disable bar */
  563. RTGUI_WIDGET_DISABLE(bar);
  564. }
  565. else
  566. { /* enable bar */
  567. RTGUI_WIDGET_ENABLE(bar);
  568. }
  569. //活动块计数个数 = 总个数 - 一屏个数
  570. bar->count = (rt_int16_t)(count-bar->page_step);
  571. rtgui_scrollbar_set_thumbbar_len(bar);
  572. }
  573. //value的值是被绑定控件的首行值frist_aloc
  574. void rtgui_scrollbar_set_value(rtgui_scrollbar_t* bar, rt_int16_t value)
  575. {
  576. RT_ASSERT(bar != RT_NULL);
  577. bar->value = value;
  578. if(bar->value < 0) bar->value = 0;
  579. rtgui_widget_update(bar);
  580. }
  581. void rtgui_scrollbar_set_onscroll(rtgui_scrollbar_t* bar, rtgui_event_handler_ptr handler)
  582. {
  583. if(bar == RT_NULL || handler == RT_NULL) return;
  584. bar->on_scroll = handler;
  585. }