rtgui_theme.c 33 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312
  1. /*
  2. * File : rtgui_theme.c
  3. * This file is part of RTGUI in 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. * 2009-10-04 Bernard first version
  13. */
  14. #include <rtgui/rtgui.h>
  15. #include <rtgui/color.h>
  16. #include <rtgui/rtgui_server.h>
  17. #include <rtgui/font.h>
  18. #include <rtgui/image.h>
  19. #include <panel.h>
  20. #include <rtgui/rtgui_theme.h>
  21. const rtgui_color_t default_foreground = RTGUI_RGB(0, 0, 0 );
  22. const rtgui_color_t default_background = RTGUI_RGB(212, 208, 200);
  23. extern rtgui_font_t rtgui_font_asc12;
  24. extern rtgui_font_t rtgui_font_asc16;
  25. /* init theme */
  26. void rtgui_system_theme_init(void)
  27. {
  28. #if RTGUI_DEFAULT_FONT_SIZE == 16
  29. rtgui_font_set_defaut(&rtgui_font_asc16);
  30. #else
  31. rtgui_font_set_defaut(&rtgui_font_asc12);
  32. #endif
  33. }
  34. static const rt_uint8_t minbox_bmp[]=
  35. {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xF0,0x07,0xF0};
  36. static const rt_uint8_t maxbox_bmp[]=
  37. {0x0F,0xF8,0x0F,0xF8,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x0F,0xF8};
  38. static const rt_uint8_t normal_bmp[]=
  39. {0x03,0xF8,0x03,0xF8,0x02,0x08,0x0F,0xE8,0x0F,0xE8,0x08,0x38,0x08,0x20,0x08,0x20,0x0F,0xE0};
  40. static const rt_uint8_t close_bmp[] =
  41. {0x00,0x00,0x06,0x18,0x03,0x30,0x01,0xE0,0x00,0xC0,0x01,0xE0,0x03,0x30,0x06,0x18,0x00,0x00};
  42. void rtgui_theme_draw_win_closebox(rtgui_win_t *win)
  43. {
  44. rtgui_dc_t* dc;
  45. RT_ASSERT(win != RT_NULL);
  46. /* begin drawing */
  47. dc = rtgui_dc_begin_drawing(win);
  48. if(dc == RT_NULL)return;
  49. if(win->style & RTGUI_WIN_CLOSEBOX)
  50. {//绘制关闭按钮
  51. rtgui_rect_t rect;
  52. /* get close button rect */
  53. rtgui_win_get_closebox_rect(win, &rect);
  54. rtgui_dc_fill_rect(dc, &rect);
  55. /* draw close box */
  56. if(win->style & RTGUI_WIN_CLOSEBOX_PRESSED)
  57. {
  58. rtgui_dc_draw_border(dc, &rect, RTGUI_BORDER_SUNKEN);
  59. RTGUI_DC_FC(dc) = blue;
  60. rtgui_dc_draw_word(dc,rect.x1-0, rect.y1+4, 9, close_bmp);
  61. }
  62. else
  63. {
  64. rtgui_dc_draw_border(dc, &rect, RTGUI_BORDER_RAISE);
  65. RTGUI_DC_FC(dc) = black;
  66. rtgui_dc_draw_word(dc,rect.x1-1, rect.y1+3, 9, close_bmp);
  67. }
  68. }
  69. rtgui_dc_end_drawing(dc);
  70. }
  71. void rtgui_theme_draw_win_maxbox(rtgui_win_t *win)
  72. {
  73. rtgui_dc_t* dc;
  74. RT_ASSERT(win != RT_NULL);
  75. /* begin drawing */
  76. dc = rtgui_dc_begin_drawing(win);
  77. if(dc == RT_NULL)return;
  78. if(win->style & RTGUI_WIN_MAXBOX)
  79. {//最大化按钮
  80. rtgui_rect_t rect;
  81. rtgui_win_get_maxbox_rect(win, &rect);
  82. rtgui_dc_fill_rect(dc, &rect);
  83. /* draw close box */
  84. if(win->style & RTGUI_WIN_MAXBOX_PRESSED)
  85. {
  86. rtgui_dc_draw_border(dc, &rect, RTGUI_BORDER_SUNKEN);
  87. RTGUI_DC_FC(dc) = blue;
  88. if(!(win->status & RTGUI_WIN_STATUS_MAX))
  89. rtgui_dc_draw_word(dc,rect.x1-0, rect.y1+4, 9, maxbox_bmp);
  90. else
  91. rtgui_dc_draw_word(dc,rect.x1-1, rect.y1+3, 9, normal_bmp);
  92. }
  93. else
  94. {
  95. rtgui_dc_draw_border(dc, &rect, RTGUI_BORDER_RAISE);
  96. RTGUI_DC_FC(dc) = black;
  97. if(!(win->status & RTGUI_WIN_STATUS_MAX))
  98. rtgui_dc_draw_word(dc,rect.x1-1, rect.y1+3, 9, maxbox_bmp);
  99. else
  100. rtgui_dc_draw_word(dc,rect.x1-1, rect.y1+3, 9, normal_bmp);
  101. }
  102. }
  103. rtgui_dc_end_drawing(dc);
  104. }
  105. void rtgui_theme_draw_win_minbox(rtgui_win_t *win)
  106. {
  107. rtgui_dc_t* dc;
  108. RT_ASSERT(win != RT_NULL);
  109. /* begin drawing */
  110. dc = rtgui_dc_begin_drawing(win);
  111. if(dc == RT_NULL)return;
  112. if(win->style & RTGUI_WIN_MINBOX)
  113. {
  114. rtgui_rect_t rect;
  115. rtgui_win_get_minbox_rect(win, &rect);
  116. rtgui_dc_fill_rect(dc, &rect);
  117. /* draw close box */
  118. if(win->style & RTGUI_WIN_MINBOX_PRESSED)
  119. {
  120. rtgui_dc_draw_border(dc, &rect, RTGUI_BORDER_SUNKEN);
  121. RTGUI_DC_FC(dc) = blue;
  122. rtgui_dc_draw_word(dc, rect.x1-0, rect.y1+4, 9, minbox_bmp);
  123. }
  124. else
  125. {
  126. rtgui_dc_draw_border(dc, &rect, RTGUI_BORDER_RAISE);
  127. RTGUI_DC_FC(dc) = black;
  128. rtgui_dc_draw_word(dc,rect.x1-1, rect.y1+3, 9, minbox_bmp);
  129. }
  130. }
  131. rtgui_dc_end_drawing(dc);
  132. }
  133. int TABLE_VARY_COLOR[24][3]={
  134. {22,66,254},{22,65,251},{21,63,248},{20,61,245},{19,60,242},{19,58,239},{18,56,235},{17,55,233},
  135. {17,53,230},{16,51,226},{15,50,224},{14,48,220},{14,47,217},{13,45,215},{12,43,211},{11,42,206},
  136. {11,40,206},{10,38,202},{9, 37,199},{8, 35,197},{7, 34,195},{6, 33,193},{5, 31,191},{4, 29,197}
  137. };
  138. void rtgui_theme_draw_win_title(rtgui_win_t *win)
  139. {
  140. rtgui_dc_t* dc;
  141. RT_ASSERT(win != RT_NULL);
  142. /* begin drawing */
  143. dc = rtgui_dc_begin_drawing(win);
  144. if(dc == RT_NULL)return;
  145. /* draw title */
  146. if(win->style & RTGUI_WIN_TITLE)
  147. {
  148. rt_uint32_t i,j;
  149. rtgui_rect_t rect;
  150. //float r, g, b, delta;
  151. rtgui_color_t color;
  152. rtgui_win_get_title_rect(win, &rect);
  153. if((win->status & RTGUI_WIN_STATUS_ACTIVATE))
  154. {
  155. //color = RTGUI_RGB(10, 36, 106);
  156. for(i = rect.y1,j=0; i < rect.y2; i ++,j++)
  157. {
  158. RTGUI_DC_FC(dc) = RTGUI_RGB(TABLE_VARY_COLOR[j][0],TABLE_VARY_COLOR[j][1],TABLE_VARY_COLOR[j][2]);
  159. rtgui_dc_draw_hline(dc,rect.x1, rect.x2, i);
  160. }
  161. }
  162. else
  163. {
  164. RTGUI_DC_FC(dc) = RTGUI_RGB(128, 128, 128);
  165. for(i = rect.y1,j=0; i < rect.y2; i ++,j++)
  166. {
  167. rtgui_dc_draw_hline(dc,rect.x1, rect.x2, i);
  168. }
  169. }
  170. if (win->status & RTGUI_WIN_STATUS_ACTIVATE)
  171. color = white;
  172. else
  173. color = RTGUI_RGB(212, 208, 200);
  174. rect.x1 += 4;
  175. rect.y1 += 2; rect.y2 = rect.y1 + RTGUI_WIN_CLOSEBOX_HEIGHT;
  176. RTGUI_DC_FC(dc) = color;
  177. RTGUI_DC_TEXTALIGN(dc) = RTGUI_ALIGN_LEFT;
  178. rtgui_dc_draw_text(dc,win->title, &rect);
  179. if(win->style & RTGUI_WIN_BORDER)//恢复原来的尺寸(前面缩放处理过)
  180. rtgui_rect_inflate(&rect, win->border_size);
  181. rtgui_theme_draw_win_closebox(win);
  182. rtgui_theme_draw_win_maxbox(win);
  183. rtgui_theme_draw_win_minbox(win);
  184. }
  185. rtgui_dc_end_drawing(dc);
  186. }
  187. /* window drawing */
  188. void rtgui_theme_draw_win(rtgui_win_t* win)
  189. {
  190. rtgui_rect_t rect;
  191. rtgui_dc_t* dc;
  192. RT_ASSERT(win != RT_NULL);
  193. /* begin drawing */
  194. dc = rtgui_dc_begin_drawing(win);
  195. if(dc == RT_NULL)return;
  196. /* get rect */
  197. rtgui_widget_get_rect(win, &rect);
  198. /* draw border */
  199. if(win->style & RTGUI_WIN_BORDER)
  200. {
  201. rect.x2 -= 1; rect.y2 -= 1;
  202. RTGUI_DC_FC(dc) = RTGUI_RGB(212, 208, 200);
  203. rtgui_dc_draw_hline(dc,rect.x1, rect.x2, rect.y1);
  204. rtgui_dc_draw_vline(dc,rect.x1, rect.y1, rect.y2);
  205. RTGUI_DC_FC(dc) = white;
  206. rtgui_dc_draw_hline(dc,rect.x1 + 1, rect.x2 - 1, rect.y1 + 1);
  207. rtgui_dc_draw_vline(dc,rect.x1 + 1, rect.y1 + 1, rect.y2 - 1);
  208. RTGUI_DC_FC(dc) = RTGUI_RGB(128, 128, 128);
  209. rtgui_dc_draw_hline(dc,rect.x1 + 1, rect.x2 - 0, rect.y2 - 1);
  210. rtgui_dc_draw_vline(dc,rect.x2 - 1, rect.y1 + 1, rect.y2 - 1);
  211. RTGUI_DC_FC(dc) = RTGUI_RGB(64, 64, 64);
  212. rtgui_dc_draw_hline(dc,rect.x1, rect.x2+1, rect.y2);
  213. rtgui_dc_draw_vline(dc,rect.x2, rect.y1, rect.y2);
  214. /* shrink border */
  215. rtgui_rect_inflate(&rect, -RTGUI_WIDGET_BORDER(win));
  216. }
  217. rtgui_theme_draw_win_title(win);
  218. //填充客户区背景色
  219. rtgui_win_get_client_rect(win,&rect);
  220. rtgui_dc_fill_rect(dc,&rect);
  221. rtgui_dc_end_drawing(dc);
  222. }
  223. /* widget drawing */
  224. void rtgui_theme_draw_button(rtgui_button_t* btn)
  225. {
  226. /* draw button */
  227. rtgui_rect_t rect;
  228. rtgui_dc_t* dc;
  229. RT_ASSERT(btn != RT_NULL);
  230. /* begin drawing */
  231. dc = rtgui_dc_begin_drawing(btn);
  232. if(dc == RT_NULL)return;
  233. /* get widget rect */
  234. rtgui_widget_get_rect(btn, &rect);
  235. rtgui_dc_fill_rect(dc,&rect);
  236. if(btn->flag & RTGUI_BUTTON_FLAG_PRESS)
  237. {
  238. rtgui_dc_draw_border(dc, &rect,RTGUI_BORDER_DOWN);
  239. if(btn->image != RT_NULL)
  240. {
  241. rtgui_rect_t image_rect;
  242. rtgui_dc_draw_border(dc, &rect,RTGUI_BORDER_DOWN);
  243. image_rect.x1 = 0; image_rect.y1 = 0;
  244. image_rect.x2 = btn->image->w;
  245. image_rect.y2 = btn->image->h;
  246. rtgui_rect_moveto_align(&rect, &image_rect, RTGUI_ALIGN_CENTER_HORIZONTAL|RTGUI_ALIGN_CENTER_VERTICAL);
  247. //rtgui_image_blit(btn->image, dc, &image_rect);
  248. rtgui_image_paste(btn->image, dc, &image_rect,white);
  249. }
  250. }
  251. else
  252. {
  253. if(btn->image != RT_NULL)
  254. {
  255. rtgui_rect_t image_rect;
  256. rtgui_dc_draw_border(dc, &rect,RTGUI_WIDGET_BORDER_STYLE(btn));
  257. image_rect.x1 = 0; image_rect.y1 = 0;
  258. image_rect.x2 = btn->image->w;
  259. image_rect.y2 = btn->image->h;
  260. rtgui_rect_moveto_align(&rect, &image_rect, RTGUI_ALIGN_CENTER_HORIZONTAL|RTGUI_ALIGN_CENTER_VERTICAL);
  261. //rtgui_image_blit(btn->image, dc, &image_rect);
  262. rtgui_image_paste(btn->image, dc, &image_rect,white);
  263. }
  264. else
  265. {
  266. //绘制"常规"状态下的边框
  267. rtgui_dc_draw_border(dc, &rect,RTGUI_WIDGET_BORDER_STYLE(btn));
  268. }
  269. }
  270. if(btn->image == RT_NULL)
  271. {
  272. /* re-set foreground and get default rect */
  273. rtgui_widget_get_rect(btn, &rect);
  274. /* remove border */
  275. rtgui_rect_inflate(&rect, -2);
  276. if(btn->flag & RTGUI_BUTTON_FLAG_PRESS)
  277. {
  278. rect.x1 += 1; rect.y1 += 1;
  279. rect.x2 += 1; rect.y2 += 1;
  280. rtgui_dc_draw_text(dc, rtgui_label_get_text(RTGUI_LABEL(btn)), &rect);
  281. }
  282. else
  283. rtgui_dc_draw_text(dc, rtgui_label_get_text(RTGUI_LABEL(btn)), &rect);
  284. }
  285. if(RTGUI_WIDGET_IS_FOCUSED(btn))
  286. {
  287. /* re-set foreground and get default rect */
  288. rtgui_widget_get_rect(btn, &rect);
  289. rtgui_rect_inflate(&rect, -2);
  290. rtgui_dc_draw_focus_rect(dc,&rect);
  291. }
  292. rtgui_dc_end_drawing(dc);
  293. }
  294. void rtgui_theme_draw_label(rtgui_label_t* label)
  295. {
  296. /* draw label */
  297. rtgui_rect_t rect;
  298. rtgui_dc_t* dc;
  299. RT_ASSERT(label != RT_NULL);
  300. /* begin drawing */
  301. dc = rtgui_dc_begin_drawing(label);
  302. if(dc == RT_NULL)return;
  303. rtgui_widget_get_rect(label, &rect);
  304. rtgui_dc_fill_rect(dc,&rect);
  305. /* default left and center draw */
  306. rtgui_dc_draw_text(dc, label->text, &rect);
  307. rtgui_dc_end_drawing(dc);
  308. }
  309. void rtgui_theme_draw_textbox(rtgui_textbox_t* box)
  310. {
  311. /* draw button */
  312. rtgui_rect_t rect;
  313. rtgui_dc_t* dc;
  314. RT_ASSERT(box != RT_NULL);
  315. /* begin drawing */
  316. dc = rtgui_dc_begin_drawing(box);
  317. if(dc == RT_NULL)return;
  318. /* get widget rect */
  319. rtgui_widget_get_rect(box, &rect);
  320. rtgui_rect_inflate(&rect,-RTGUI_WIDGET_BORDER(box));
  321. /* fill widget rect with white color */
  322. if(box->isedit == RT_TRUE)
  323. {
  324. RTGUI_DC_BC(dc) = white;
  325. rtgui_dc_fill_rect(dc,&rect);
  326. }
  327. else
  328. {
  329. if(RTGUI_IS_COMBOBOX(RTGUI_WIDGET(box)->parent))
  330. {
  331. RTGUI_DC_BC(dc) = white;
  332. rtgui_dc_fill_rect(dc,&rect);
  333. }
  334. else
  335. {
  336. RTGUI_DC_BC(dc) = light_grey;
  337. rtgui_dc_fill_rect(dc,&rect);
  338. }
  339. }
  340. rtgui_rect_inflate(&rect,RTGUI_WIDGET_BORDER(box));
  341. /* draw border */
  342. rtgui_dc_draw_border(dc,&rect,RTGUI_WIDGET_BORDER_STYLE(box));
  343. /* draw text */
  344. if(box->text != RT_NULL)
  345. {
  346. rect.x1 += RTGUI_WIDGET_DEFAULT_MARGIN;
  347. if(box->flag & RTGUI_TEXTBOX_MULTI)
  348. {//多行文本
  349. int start,end,alllen,fh,fw,rw;
  350. fw = rtgui_font_get_font_width(RTGUI_WIDGET_FONT(box)); //字体宽度
  351. fh = rtgui_font_get_font_height(RTGUI_WIDGET_FONT(box)); //字体高度
  352. rw = rtgui_rect_width(rect); //编辑框文字区域可包含的字符个数
  353. alllen = rt_strlen(box->text);//文本总长度
  354. start=end=0;
  355. rect.y1 += 2;
  356. while(end<alllen)
  357. {//查找字符串中是否有换行符
  358. if(*(box->text+end) == '\n')
  359. {
  360. int i, mlen;
  361. char* string;
  362. end++;
  363. mlen = end-start;//一整行(以\n结尾)的长度
  364. //为了使用函数rtgui_dc_draw_text(),需要提取出一行再手工添加\0
  365. string = rt_malloc(mlen);//临时缓存
  366. for(i=0;i<mlen;i++)
  367. {
  368. if(box->flag & RTGUI_TEXTBOX_MASK) //密文
  369. string[i] = '*';
  370. else //明文
  371. string[i] = *(box->text+start+i);
  372. if(i==(mlen-1))string[i] = '\0';//手工添加\0
  373. }
  374. RTGUI_DC_FC(dc) = black;
  375. //绘制一个完整行(以\n结尾),如果行长度超过控件宽度,要自动换行
  376. for(i=0;i<mlen;)
  377. {
  378. int linelen = rw/fw;//一行可以显示的字符数
  379. rect.y2 = rect.y1+fh;
  380. if(linelen > mlen)
  381. {//行长度小于控件宽度所容纳字符数的情况
  382. linelen = mlen;
  383. RTGUI_DC_FC(dc) = black;
  384. rtgui_dc_draw_text(dc, string+i, &rect);
  385. }
  386. else
  387. {//自动换行的情况
  388. int k;
  389. char* tmpstr = rt_malloc(linelen+1);//临时缓存
  390. rt_kprintf("1.\n");
  391. for(k=0;k<(linelen+1);k++)
  392. {
  393. if(box->flag & RTGUI_TEXTBOX_MASK) //密文
  394. tmpstr[k] = '*';
  395. else //明文
  396. tmpstr[k] = *(string+i+k);
  397. if(k==linelen)tmpstr[k]='\0';//手工添加\0
  398. }
  399. RTGUI_DC_FC(dc) = black;
  400. rtgui_dc_draw_text(dc, tmpstr, &rect);
  401. rt_free(tmpstr);
  402. }
  403. i += linelen;
  404. rect.y1 = rect.y2+1;
  405. }
  406. rt_free(string);
  407. start = end;//设置下一个完整行的开始
  408. }
  409. end++;
  410. }
  411. }
  412. else
  413. {//单行文本
  414. RTGUI_DC_FC(dc) = black;
  415. if(box->flag & RTGUI_TEXTBOX_MASK)
  416. {
  417. /* draw '*' */
  418. rt_size_t len = rt_strlen(box->text);
  419. if(len > 0)
  420. {
  421. char *text_mask = rt_malloc(len + 1);
  422. rt_memset(text_mask, '*', len + 1);
  423. text_mask[len] = 0;
  424. rtgui_dc_draw_text(dc, text_mask, &rect);
  425. rt_free(text_mask);
  426. }
  427. }
  428. else
  429. {
  430. rtgui_dc_draw_text(dc, box->text, &rect);
  431. }
  432. }
  433. }
  434. rtgui_dc_end_drawing(dc);
  435. }
  436. void rtgui_theme_draw_iconbox(rtgui_iconbox_t* iconbox)
  437. {
  438. rtgui_rect_t rect,ico_rect;
  439. rtgui_dc_t* dc;
  440. RT_ASSERT(iconbox != RT_NULL);
  441. /* begin drawing */
  442. dc = rtgui_dc_begin_drawing(iconbox);
  443. if(dc == RT_NULL)return;
  444. /* get widget rect */
  445. rtgui_widget_get_rect(iconbox, &rect);
  446. ico_rect.x1 = rect.x1+(rtgui_rect_width(rect)-iconbox->image->w)/2;
  447. ico_rect.y1 = rect.y1+(36-iconbox->image->h)/2+RTGUI_WIDGET_DEFAULT_MARGIN;
  448. ico_rect.x2 = ico_rect.x1+iconbox->image->w;
  449. ico_rect.y2 = ico_rect.y1+iconbox->image->h;
  450. /* draw icon */
  451. rtgui_image_blit(iconbox->image, dc, &ico_rect);
  452. /* draw text */
  453. RTGUI_DC_FC(dc) = white;
  454. if(iconbox->text_position == RTGUI_ICONBOX_TEXT_BELOW && iconbox->text != RT_NULL)
  455. {
  456. rect.y1 += iconbox->image->h + RTGUI_WIDGET_DEFAULT_MARGIN;
  457. rtgui_dc_draw_text(dc, iconbox->text, &rect);
  458. }
  459. else if(iconbox->text_position == RTGUI_ICONBOX_TEXT_RIGHT && iconbox->text != RT_NULL)
  460. {
  461. rect.x1 += iconbox->image->w + RTGUI_WIDGET_DEFAULT_MARGIN;
  462. rtgui_dc_draw_text(dc, iconbox->text, &rect);
  463. }
  464. rtgui_dc_end_drawing(dc);
  465. }
  466. static const rt_uint8_t checked_byte[7] = {0x02, 0x06, 0x8E, 0xDC, 0xF8, 0x70, 0x20};
  467. void rtgui_theme_draw_checkbox(rtgui_checkbox_t* checkbox)
  468. {
  469. rtgui_rect_t rect, box_rect;
  470. rtgui_dc_t* dc;
  471. rtgui_color_t color;
  472. RT_ASSERT(checkbox != RT_NULL);
  473. /* begin drawing */
  474. dc = rtgui_dc_begin_drawing(checkbox);
  475. if(dc == RT_NULL)return;
  476. /* get rect */
  477. rtgui_widget_get_rect(checkbox, &rect);
  478. RTGUI_DC_BC(dc) = default_background;
  479. /* fill rect */
  480. rtgui_dc_fill_rect(dc,&rect);
  481. if(RTGUI_WIDGET_IS_FOCUSED(checkbox))
  482. {//只绘制包围字符串的焦点框
  483. rtgui_rect_t tmp_rect;
  484. rtgui_font_get_string_rect(RTGUI_WIDGET_FONT(checkbox), rtgui_label_get_text(RTGUI_LABEL(checkbox)), &tmp_rect);
  485. rtgui_rect_moveto(&tmp_rect,rect.x1+CHECK_BOX_W+7, rect.y1);
  486. tmp_rect.x1 -= 1;
  487. tmp_rect.x2 += 2;
  488. tmp_rect.y2 = rect.y2-1;
  489. /* draw focused border */
  490. rtgui_dc_draw_focus_rect(dc,&tmp_rect);
  491. }
  492. /* draw check box */
  493. box_rect.x1 = 0;
  494. box_rect.y1 = 0;
  495. box_rect.x2 = CHECK_BOX_W;
  496. box_rect.y2 = CHECK_BOX_H;
  497. rtgui_rect_moveto_align(&rect, &box_rect, RTGUI_ALIGN_CENTER_VERTICAL);
  498. box_rect.x1 += 2; box_rect.x2 += 2;
  499. rtgui_dc_draw_border(dc, &box_rect, RTGUI_BORDER_SUNKEN);
  500. rtgui_rect_inflate(&box_rect, -2);
  501. color = RTGUI_DC_BC(dc);
  502. RTGUI_DC_BC(dc) = white;
  503. rtgui_dc_fill_rect(dc, &box_rect);
  504. RTGUI_DC_BC(dc) = color;
  505. if(checkbox->value)
  506. {
  507. color = RTGUI_DC_FC(dc);
  508. RTGUI_DC_FC(dc) = RTGUI_RGB(33, 161, 33);
  509. rtgui_dc_draw_byte(dc,box_rect.x1 + 1, box_rect.y1 + 1, 7, checked_byte);
  510. RTGUI_DC_FC(dc) = color;
  511. }
  512. /* draw text */
  513. rect.x1 += rtgui_rect_height(rect) - 4 + 5;
  514. rtgui_dc_draw_text(dc, rtgui_label_get_text(RTGUI_LABEL(checkbox)), &rect);
  515. rtgui_dc_end_drawing(dc);
  516. }
  517. //static const rt_uint8_t radio_unchecked_byte[] =
  518. //{
  519. // 0x0f, 0x00, 0x30, 0xc0, 0x40, 0x20,
  520. // 0x40, 0x20, 0x80, 0x10, 0x80, 0x10,
  521. // 0x80, 0x10, 0x80, 0x10, 0x40, 0x20,
  522. // 0x40, 0x20, 0x30, 0xc0, 0x0f, 0x00,
  523. //};
  524. //static const rt_uint8_t radio_checked_byte[] =
  525. //{
  526. // 0x0f, 0x00, 0x30, 0xc0, 0x40, 0x20,
  527. // 0x40, 0x20, 0x86, 0x10, 0x8f, 0x10,
  528. // 0x8f, 0x10, 0x86, 0x10, 0x40, 0x20,
  529. // 0x40, 0x20, 0x30, 0xc0, 0x0f, 0x00,
  530. //};
  531. void rtgui_theme_draw_radiobutton(rtgui_radiobox_t* rbox, rt_uint32_t index)
  532. {
  533. rtgui_rect_t rect;
  534. rtgui_dc_t* dc;
  535. RT_ASSERT(rbox != RT_NULL);
  536. /* begin drawing */
  537. dc = rtgui_dc_begin_drawing(rbox);
  538. if(dc == RT_NULL)return;
  539. /* get widget rect */
  540. rtgui_widget_get_rect(rbox, &rect);
  541. if(rbox->orient == RTGUI_HORIZONTAL)
  542. {//水平
  543. //绘制圆圈
  544. //绘制text
  545. }
  546. else if(rbox->orient == RTGUI_VERTICAL)
  547. {//垂直
  548. }
  549. rtgui_dc_end_drawing(dc);
  550. }
  551. void rtgui_theme_draw_radiobox(rtgui_radiobox_t* rbox)
  552. {
  553. rtgui_rect_t rect;
  554. rtgui_dc_t* dc;
  555. RT_ASSERT(rbox != RT_NULL);
  556. /* begin drawing */
  557. dc = rtgui_dc_begin_drawing(rbox);
  558. if(dc == RT_NULL)return;
  559. /* get widget rect */
  560. rtgui_widget_get_rect(rbox, &rect);
  561. rtgui_dc_fill_rect(dc,&rect);
  562. if(rbox->orient == RTGUI_HORIZONTAL)
  563. {//水平
  564. }
  565. else if(rbox->orient == RTGUI_VERTICAL)
  566. {//垂直
  567. }
  568. rtgui_dc_end_drawing(dc);
  569. }
  570. static const rt_uint8_t menu_popup_byte[7] = {0x40,0x60,0x70,0x78,0x70,0x60,0x40};
  571. void rtgui_theme_draw_menu_item(rtgui_menu_t* menu, rtgui_menu_item_t *item)
  572. {
  573. rtgui_rect_t rect, item_rect;
  574. int item_size;
  575. rtgui_dc_t* dc;
  576. RT_ASSERT(menu != RT_NULL);
  577. if(item == RT_NULL) return;
  578. /* begin drawing */
  579. dc = rtgui_dc_begin_drawing(menu);
  580. if(dc == RT_NULL)return;
  581. rtgui_widget_get_rect(menu, &rect);
  582. item_size = menu->item_size;
  583. rtgui_rect_inflate(&rect, -RTGUI_WIDGET_BORDER(menu));
  584. item_rect = rect;
  585. if(menu->orient == RTGUI_VERTICAL)
  586. {
  587. int serial_num=0;
  588. rtgui_menu_item_t* tmp_item=menu->head;
  589. while(tmp_item != item)
  590. {/* 计算菜单项的位置 */
  591. serial_num++;
  592. tmp_item = tmp_item->next;
  593. }
  594. /* set the text rect */
  595. item_rect.y1 += serial_num * (item_size+1);
  596. item_rect.y2 = item_rect.y1 + item_size;
  597. /* draw menu item */
  598. if(menu->current_item == item)
  599. {/* 当前项 */
  600. if(RTGUI_WIDGET_IS_FOCUSED(menu))
  601. {
  602. RTGUI_DC_BC(dc) = selected_color;
  603. RTGUI_DC_FC(dc) = white;
  604. }
  605. else
  606. {
  607. RTGUI_DC_BC(dc) = dark_grey;
  608. RTGUI_DC_FC(dc) = black;
  609. }
  610. rtgui_dc_fill_rect(dc, &item_rect);
  611. if(item->image)
  612. {
  613. item_rect.x1 += RTGUI_MENU_IMAGE_W+RTGUI_WIDGET_BORDER(menu);
  614. }
  615. item_rect.x1 += RTGUI_WIDGET_DEFAULT_MARGIN;
  616. rtgui_dc_draw_text(dc, item->caption, &item_rect);
  617. if(item->type & RTGUI_MENU_POPUP)
  618. {
  619. RTGUI_DC_FC(dc) = white;
  620. rtgui_dc_draw_byte(dc,rect.x2-8, item_rect.y1+7, 7, menu_popup_byte);
  621. }
  622. if(item->image)
  623. {
  624. item_rect.x1 -= RTGUI_MENU_IMAGE_W+RTGUI_WIDGET_BORDER(menu);
  625. }
  626. item_rect.x1 -= RTGUI_WIDGET_DEFAULT_MARGIN;
  627. }
  628. else
  629. {//非当前项
  630. RTGUI_DC_BC(dc) = white;
  631. RTGUI_DC_FC(dc) = black;
  632. rtgui_dc_fill_rect(dc,&item_rect);
  633. if(item->image)
  634. {
  635. item_rect.x1 += RTGUI_MENU_IMAGE_W+RTGUI_WIDGET_BORDER(menu);
  636. }
  637. item_rect.x1 += RTGUI_WIDGET_DEFAULT_MARGIN;
  638. rtgui_dc_draw_text(dc, item->caption, &item_rect);
  639. if(item->type & RTGUI_MENU_POPUP)
  640. rtgui_dc_draw_byte(dc,rect.x2-8, item_rect.y1+7, 7, menu_popup_byte);
  641. if(item->image)
  642. {
  643. item_rect.x1 -= RTGUI_MENU_IMAGE_W+RTGUI_WIDGET_BORDER(menu);
  644. }
  645. item_rect.x1 -= RTGUI_WIDGET_DEFAULT_MARGIN;
  646. }
  647. }
  648. // else
  649. // {
  650. // }
  651. rtgui_dc_end_drawing(dc);
  652. }
  653. void rtgui_theme_draw_menu(rtgui_menu_t* menu)
  654. {
  655. rtgui_rect_t rect, item_rect;
  656. int item_size, index;
  657. rtgui_dc_t* dc;
  658. RT_ASSERT(menu != RT_NULL);
  659. /* begin drawing */
  660. dc = rtgui_dc_begin_drawing(menu);
  661. if(dc == RT_NULL)return;
  662. rtgui_widget_get_rect(menu, &rect);
  663. rtgui_rect_inflate(&rect,-RTGUI_WIDGET_BORDER(menu));
  664. RTGUI_DC_BC(dc) = white;
  665. rtgui_dc_fill_rect(dc,&rect);
  666. rtgui_rect_inflate(&rect, RTGUI_WIDGET_BORDER(menu));
  667. rtgui_dc_draw_border(dc, &rect, RTGUI_WIDGET_BORDER_STYLE(menu));
  668. item_size = menu->item_size;
  669. rtgui_rect_inflate(&rect, -RTGUI_WIDGET_BORDER(menu));
  670. item_rect = rect;
  671. if(menu->orient == RTGUI_VERTICAL)
  672. {//垂直排列
  673. //rt_uint16_t offset;
  674. rtgui_menu_item_t* menu_item = menu->head;//该组的第一个菜单项
  675. /* set the first text rect */
  676. item_rect.y2 = item_rect.y1 + item_size;
  677. /* draw each menu item */
  678. for(index = 0; index < menu->item_count; index ++)
  679. {
  680. if(item_rect.y2 > rect.y2) break;
  681. /* draw text */
  682. if(menu_item == menu->current_item)
  683. {/* 绘制当前项 */
  684. if(RTGUI_WIDGET_IS_FOCUSED(menu))
  685. {
  686. RTGUI_DC_BC(dc) = selected_color;
  687. RTGUI_DC_FC(dc) = white;
  688. }
  689. else
  690. {
  691. RTGUI_DC_BC(dc) = dark_grey;
  692. RTGUI_DC_FC(dc) = black;
  693. }
  694. rtgui_dc_fill_rect(dc, &item_rect);
  695. if(menu_item->image)
  696. {
  697. item_rect.x1 += RTGUI_MENU_IMAGE_W+RTGUI_WIDGET_BORDER(menu);
  698. }
  699. item_rect.x1 += RTGUI_WIDGET_DEFAULT_MARGIN;
  700. rtgui_dc_draw_text(dc, menu_item->caption, &item_rect);
  701. if(menu_item->type & RTGUI_MENU_POPUP)
  702. rtgui_dc_draw_byte(dc,rect.x2-8, item_rect.y1+7, 7, menu_popup_byte);
  703. if(menu_item->image)
  704. {
  705. item_rect.x1 -= RTGUI_MENU_IMAGE_W+RTGUI_WIDGET_BORDER(menu);
  706. }
  707. item_rect.x1 -= RTGUI_WIDGET_DEFAULT_MARGIN;
  708. }
  709. else
  710. {
  711. RTGUI_DC_BC(dc) = white;
  712. RTGUI_DC_FC(dc) = black;
  713. rtgui_dc_fill_rect(dc,&item_rect);
  714. if(menu_item->image)
  715. {
  716. item_rect.x1 += RTGUI_MENU_IMAGE_W+RTGUI_WIDGET_BORDER(menu);
  717. }
  718. item_rect.x1 += RTGUI_WIDGET_DEFAULT_MARGIN;
  719. rtgui_dc_draw_text(dc, menu_item->caption, &item_rect);
  720. if(menu_item->type & RTGUI_MENU_POPUP)
  721. rtgui_dc_draw_byte(dc,rect.x2-8, item_rect.y1+7, 7, menu_popup_byte);
  722. if(menu_item->image)
  723. {
  724. item_rect.x1 -= RTGUI_MENU_IMAGE_W+RTGUI_WIDGET_BORDER(menu);
  725. }
  726. item_rect.x1 -= RTGUI_WIDGET_DEFAULT_MARGIN;
  727. }
  728. menu_item = menu_item->next;
  729. item_rect.y1 += item_size+1;
  730. item_rect.y2 = item_rect.y1+item_size;
  731. }
  732. }
  733. else
  734. {//水平排列
  735. //Add code at here...
  736. }
  737. rtgui_dc_end_drawing(dc);
  738. }
  739. void rtgui_theme_draw_slider(rtgui_slider_t* slider)
  740. {
  741. /* draw button */
  742. int i, xsize, x0;
  743. rtgui_rect_t rect, focus_rect, slider_rect, slot_rect;
  744. rtgui_dc_t* dc;
  745. RT_ASSERT(slider != RT_NULL);
  746. /* begin drawing */
  747. dc = rtgui_dc_begin_drawing(slider);
  748. if(dc == RT_NULL)return;
  749. /* get widget rect */
  750. rtgui_widget_get_rect(slider, &focus_rect);
  751. /* fill widget rect with background color */
  752. rtgui_dc_fill_rect(dc,&focus_rect);
  753. rect = focus_rect;
  754. if(slider->orient == RTGUI_VERTICAL)
  755. {
  756. rtgui_rect_inflate(&rect, -1);
  757. xsize = rect.y2 - rect.y1 - slider->thumb_width;
  758. x0 = rect.y1 + slider->thumb_width / 2;
  759. /* calculate thumb position */
  760. slider_rect = rect;
  761. slider_rect.x1 += 1;
  762. slider_rect.x2 -= 1;
  763. slider_rect.y1 = x0 + xsize * (slider->value - slider->min) / (slider->max - slider->min) - slider->thumb_width/2;
  764. slider_rect.y2 = slider_rect.y1 + slider->thumb_width;
  765. /* calculate slot position */
  766. slot_rect.y1 = x0;
  767. slot_rect.y2 = x0 + xsize;
  768. slot_rect.x1 = (slider_rect.x1 + slider_rect.x2) /2 -1;
  769. slot_rect.x2 = slot_rect.x1 +3;
  770. /* draw slot */
  771. rtgui_dc_draw_border(dc, &slot_rect, RTGUI_WIDGET_BORDER_STYLE(slider));
  772. /* draw the ticks */
  773. for(i = 0; i <= slider->ticks; i++)
  774. {
  775. int k = x0 + xsize * i / slider->ticks;
  776. rtgui_dc_draw_hline(dc,rect.x1+1, rect.x1+4, k);
  777. }
  778. /* draw the thumb */
  779. rtgui_dc_fill_rect(dc,&slider_rect);
  780. rtgui_dc_draw_border(dc, &slider_rect, RTGUI_WIDGET_BORDER_STYLE(slider));
  781. }
  782. else
  783. {
  784. rtgui_rect_inflate(&rect, -1);
  785. xsize = rect.x2 - rect.x1 - slider->thumb_width;
  786. x0 = rect.x1 + slider->thumb_width / 2;
  787. /* calculate thumb position */
  788. slider_rect = rect;
  789. slider_rect.x1 = x0 + xsize*(slider->value - slider->min)/(slider->max - slider->min) - slider->thumb_width/2;
  790. slider_rect.x2 = slider_rect.x1 + slider->thumb_width;
  791. slider_rect.y1 += 1;
  792. slider_rect.y2 -= 1;
  793. /* calculate slot position */
  794. slot_rect.x1 = x0;
  795. slot_rect.x2 = x0 + xsize;
  796. slot_rect.y1 = (slider_rect.y1 + slider_rect.y2) /2 -1;
  797. slot_rect.y2 = slot_rect.y1 +3;
  798. /* draw slot */
  799. rtgui_dc_draw_border(dc, &slot_rect, RTGUI_WIDGET_BORDER_STYLE(slider));
  800. /* draw the ticks */
  801. for(i = 0; i <= slider->ticks; i++)
  802. {
  803. int x = x0 + xsize * i / slider->ticks;
  804. rtgui_dc_draw_vline(dc,x, rect.y1+1, rect.y1+4);
  805. }
  806. /* draw the thumb */
  807. rtgui_dc_fill_rect(dc,&slider_rect);
  808. rtgui_dc_draw_border(dc, &slider_rect, RTGUI_WIDGET_BORDER_STYLE(slider));
  809. }
  810. /* draw focus */
  811. if(RTGUI_WIDGET_IS_FOCUSED(slider))
  812. {
  813. RTGUI_DC_FC(dc) = white;
  814. rtgui_dc_draw_focus_rect(dc, &focus_rect);
  815. }
  816. rtgui_dc_end_drawing(dc);
  817. }
  818. const static rt_uint8_t _up_arrow[] = {0x10, 0x38, 0x7C, 0xFE};
  819. const static rt_uint8_t _down_arrow[] = {0xFE,0x7C, 0x38, 0x10};
  820. const static rt_uint8_t _left_arrow[] = {0x10, 0x30, 0x70, 0xF0, 0x70, 0x30, 0x10};
  821. const static rt_uint8_t _right_arrow[] = {0x80, 0xC0, 0xE0, 0xF0, 0xE0, 0xC0, 0x80};
  822. void rtgui_theme_draw_scrollbar(rtgui_scrollbar_t* bar)
  823. {
  824. /* draw scroll bar */
  825. rtgui_rect_t rect, btn_rect, thum_rect, arrow_rect;
  826. rtgui_dc_t* dc;
  827. RT_ASSERT(bar != RT_NULL);
  828. /* begin drawing */
  829. dc = rtgui_dc_begin_drawing(bar);
  830. if(dc == RT_NULL)return;
  831. /* begin drawing */
  832. rtgui_widget_get_rect(bar, &rect);
  833. RTGUI_DC_BC(dc) = RTGUI_RGB(225, 228, 220);
  834. rtgui_dc_fill_rect(dc,&rect);
  835. if(bar->orient == RTGUI_VERTICAL)
  836. {
  837. btn_rect = rect;
  838. btn_rect.y2 = btn_rect.y1 + (rect.x2 - rect.x1);
  839. /* draw up button */
  840. if(bar->status & SBAR_UPARROW)
  841. rtgui_dc_draw_border(dc, &btn_rect, RTGUI_BORDER_SUNKEN);
  842. else
  843. rtgui_dc_draw_border(dc, &btn_rect, RTGUI_BORDER_RAISE);
  844. /* draw up arrow */
  845. arrow_rect.x1 = 0; arrow_rect.y1 = 0;
  846. arrow_rect.x2 = 7; arrow_rect.y2 = 4;
  847. rtgui_rect_moveto_align(&btn_rect, &arrow_rect, RTGUI_ALIGN_CENTER_HORIZONTAL|RTGUI_ALIGN_CENTER_VERTICAL);
  848. rtgui_dc_draw_byte(dc, arrow_rect.x1, arrow_rect.y1, rtgui_rect_height(arrow_rect), _up_arrow);
  849. /* draw thumb */
  850. {
  851. rtgui_scrollbar_get_thumb_rect(bar, &thum_rect);
  852. rtgui_dc_fill_rect(dc,&thum_rect);
  853. rtgui_dc_draw_border(dc, &thum_rect, RTGUI_BORDER_RAISE);
  854. }
  855. /* draw down button */
  856. btn_rect.y1 = rect.y2 - (rect.x2 - rect.x1);
  857. btn_rect.y2 = rect.y2;
  858. if(bar->status & SBAR_DOWNARROW)
  859. rtgui_dc_draw_border(dc, &btn_rect, RTGUI_BORDER_SUNKEN);
  860. else
  861. rtgui_dc_draw_border(dc, &btn_rect, RTGUI_BORDER_RAISE);
  862. /* drow down arrow */
  863. arrow_rect.x1 = 0; arrow_rect.y1 = 0;
  864. arrow_rect.x2 = 7; arrow_rect.y2 = 4;
  865. rtgui_rect_moveto_align(&btn_rect, &arrow_rect, RTGUI_ALIGN_CENTER_HORIZONTAL|RTGUI_ALIGN_CENTER_VERTICAL);
  866. rtgui_dc_draw_byte(dc, arrow_rect.x1, arrow_rect.y1, rtgui_rect_height(arrow_rect), _down_arrow);
  867. }
  868. else
  869. {
  870. btn_rect = rect;
  871. btn_rect.x2 = btn_rect.x1 + (rect.y2 - rect.y1);
  872. /* draw left button */
  873. if(bar->status & SBAR_LEFTARROW)
  874. rtgui_dc_draw_border(dc, &btn_rect, RTGUI_BORDER_SUNKEN);
  875. else
  876. rtgui_dc_draw_border(dc, &btn_rect, RTGUI_BORDER_RAISE);
  877. arrow_rect.x1 = 0; arrow_rect.y1 = 0;
  878. arrow_rect.x2 = 4; arrow_rect.y2 = 7;
  879. rtgui_rect_moveto_align(&btn_rect, &arrow_rect, RTGUI_ALIGN_CENTER_HORIZONTAL|RTGUI_ALIGN_CENTER_VERTICAL);
  880. rtgui_dc_draw_byte(dc, arrow_rect.x1, arrow_rect.y1, rtgui_rect_height(arrow_rect), _left_arrow);
  881. /* draw thumb */
  882. if(RTGUI_WIDGET_IS_ENABLE(bar))
  883. {
  884. rtgui_scrollbar_get_thumb_rect(bar, &thum_rect);
  885. rtgui_dc_fill_rect(dc,&thum_rect);
  886. rtgui_dc_draw_border(dc, &thum_rect, RTGUI_BORDER_RAISE);
  887. }
  888. btn_rect.x1 = rect.x2 - (rect.y2-rect.y1);
  889. btn_rect.x2 = rect.x2;
  890. /* draw right button */
  891. if(bar->status & SBAR_RIGHTARROW)
  892. rtgui_dc_draw_border(dc, &btn_rect, RTGUI_BORDER_SUNKEN);
  893. else
  894. rtgui_dc_draw_border(dc, &btn_rect, RTGUI_BORDER_RAISE);
  895. arrow_rect.x1 = 0; arrow_rect.y1 = 0;
  896. arrow_rect.x2 = 4; arrow_rect.y2 = 7;
  897. rtgui_rect_moveto_align(&btn_rect, &arrow_rect, RTGUI_ALIGN_CENTER_HORIZONTAL|RTGUI_ALIGN_CENTER_VERTICAL);
  898. rtgui_dc_draw_byte(dc, arrow_rect.x1, arrow_rect.y1, rtgui_rect_height(arrow_rect), _right_arrow);
  899. }
  900. rtgui_dc_end_drawing(dc);
  901. }
  902. void rtgui_theme_draw_progressbar(rtgui_progressbar_t* bar)
  903. {
  904. /* draw progress bar */
  905. rtgui_rect_t rect;
  906. int max = bar->range;
  907. int pos = bar->position;
  908. int left;
  909. rtgui_dc_t* dc;
  910. RT_ASSERT(bar != RT_NULL);
  911. /* begin drawing */
  912. dc = rtgui_dc_begin_drawing(bar);
  913. if(dc == RT_NULL)return;
  914. rtgui_widget_get_rect(&(bar->parent), &rect);
  915. /* fill button rect with background color */
  916. RTGUI_DC_BC(dc) = RTGUI_RGB(212, 208, 200);
  917. /* draw border */
  918. rect.x2 --; rect.y2 --;
  919. rtgui_dc_draw_border(dc, &rect, RTGUI_WIDGET_BORDER_STYLE(bar));
  920. /* Nothing to draw */
  921. if(max == 0)
  922. {
  923. return;
  924. }
  925. rect.x2 ++; rect.y2 ++;
  926. left = max - pos;
  927. rtgui_rect_inflate(&rect, -2);
  928. RTGUI_DC_BC(dc) = RTGUI_RGB(0, 0, 255);
  929. if(bar->orient == RTGUI_VERTICAL)
  930. {
  931. /* Vertical bar grows from bottom to top */
  932. int dy = (rtgui_rect_height(rect) * left) / max;
  933. rect.y1 += dy;
  934. rtgui_dc_fill_rect(dc,&rect);
  935. rect.y1 -= dy; rect.y2 = dy;
  936. rtgui_dc_fill_rect(dc,&rect);
  937. }
  938. else
  939. {
  940. /* Horizontal bar grows from left to right */
  941. int dx = (rtgui_rect_width(rect) * left) / max;
  942. rect.x2 -= dx;
  943. rtgui_dc_fill_rect(dc,&rect);
  944. rect.x1 = rect.x2; rect.x2 += dx;
  945. rtgui_dc_fill_rect(dc,&rect);
  946. }
  947. rtgui_dc_end_drawing(dc);
  948. }
  949. void rtgui_theme_draw_staticline(rtgui_staticline_t* sline)
  950. {
  951. rtgui_rect_t rect;
  952. rtgui_dc_t* dc;
  953. RT_ASSERT(sline != RT_NULL);
  954. /* begin drawing */
  955. dc = rtgui_dc_begin_drawing(sline);
  956. if(dc == RT_NULL)return;
  957. rtgui_widget_get_rect(sline, &rect);
  958. rtgui_dc_fill_rect(dc,&rect);
  959. if(sline->orient == RTGUI_HORIZONTAL)
  960. {
  961. rtgui_dc_draw_horizontal_line(dc, rect.x1, rect.x2, rect.y1);
  962. }
  963. else
  964. {
  965. rtgui_dc_draw_vertical_line(dc, rect.x1, rect.y1, rect.y2);
  966. }
  967. rtgui_dc_end_drawing(dc);
  968. }
  969. void rtgui_theme_draw_selected(rtgui_dc_t *dc, rtgui_color_t *color, rtgui_rect_t *rect)
  970. {
  971. rt_uint16_t i;
  972. rtgui_dc_draw_hline(dc,rect->x1 + 1, rect->x2 - 0, rect->y1 + 1);
  973. rtgui_dc_draw_hline(dc,rect->x1 + 1, rect->x2 - 0, rect->y2 - 2);
  974. rtgui_dc_draw_vline(dc,rect->x1 + 1, rect->y1 + 2, rect->y2 - 2);
  975. rtgui_dc_draw_vline(dc,rect->x2 - 1, rect->y1 + 2, rect->y2 - 2);
  976. for(i = rect->y1 + 1; i < rect->y2 - 2; i ++)
  977. rtgui_dc_draw_hline(dc,rect->x1 + 2, rect->x2 - 1, i);
  978. }
  979. /* get default background color */
  980. rtgui_color_t rtgui_theme_default_bc()
  981. {
  982. return default_background;
  983. }
  984. /* get default foreground color */
  985. rtgui_color_t rtgui_theme_default_fc()
  986. {
  987. return default_foreground;
  988. }
  989. void rtgui_theme_draw_panel(rtgui_panel_t *panel)
  990. {
  991. rtgui_event_paint_t event;
  992. rtgui_rect_t rect;
  993. rtgui_dc_t* dc;
  994. RT_ASSERT(panel != RT_NULL);
  995. rtgui_widget_get_rect(panel, &rect);
  996. if(panel->image == RT_NULL)
  997. {//不使用背景图片
  998. /* begin drawing */
  999. dc = rtgui_dc_begin_drawing(panel);
  1000. if(dc == RT_NULL)return;
  1001. rtgui_dc_fill_rect(dc,&rect);
  1002. rtgui_dc_end_drawing(dc);
  1003. }
  1004. /* paint each widget */
  1005. RTGUI_EVENT_PAINT_INIT(&event);
  1006. event.wid = RT_NULL;
  1007. rtgui_container_dispatch_event(RTGUI_CONTAINER(panel), (rtgui_event_t*)&event);
  1008. }
  1009. const rt_uint8_t combo_down_bmp[]=
  1010. {
  1011. 0xFE,0x7C,0x38,0x10,
  1012. };
  1013. void rtgui_theme_draw_combo(rtgui_combo_t *cbo)
  1014. {
  1015. rtgui_rect_t rect;
  1016. rtgui_dc_t* dc;
  1017. RT_ASSERT(cbo != RT_NULL);
  1018. /* begin drawing */
  1019. dc = rtgui_dc_begin_drawing(cbo);
  1020. if(dc == RT_NULL)return;
  1021. rtgui_widget_get_rect(cbo, &rect);
  1022. rtgui_rect_inflate(&rect,-RTGUI_WIDGET_BORDER(cbo));
  1023. RTGUI_DC_BC(dc) = white;
  1024. rtgui_dc_fill_rect(dc, &rect);
  1025. rtgui_rect_inflate(&rect,RTGUI_WIDGET_BORDER(cbo));
  1026. rtgui_dc_draw_border(dc, &rect,RTGUI_WIDGET_BORDER_STYLE(cbo));
  1027. if(rtgui_rect_height(rect)<RTGUI_COMBOBOX_HEIGHT)return;
  1028. /* draw downarrow button */
  1029. rect.x1 = rect.x2-RTGUI_COMBOBOX_BUTTON_WIDTH-RTGUI_WIDGET_BORDER(cbo);
  1030. rect.y1 += RTGUI_WIDGET_BORDER(cbo);
  1031. rect.x2 -= RTGUI_WIDGET_BORDER(cbo);
  1032. rect.y2 -= RTGUI_WIDGET_BORDER(cbo);
  1033. RTGUI_DC_BC(dc) = default_background;
  1034. rtgui_dc_fill_rect(dc, &rect);
  1035. if(cbo->style & RTGUI_COMBO_STYLE_DOWNARROW_UP)
  1036. {
  1037. rtgui_dc_draw_border(dc, &rect,RTGUI_BORDER_EXTRA);
  1038. rtgui_dc_draw_byte(dc,rect.x1+4, rect.y1+8, 4, combo_down_bmp);
  1039. }
  1040. else if(cbo->style & RTGUI_COMBO_STYLE_DOWNARROW_DOWN)
  1041. {
  1042. rtgui_dc_draw_border(dc, &rect,RTGUI_BORDER_SUNKEN);
  1043. rtgui_dc_draw_byte(dc,rect.x1+5, rect.y1+9, 4, combo_down_bmp);
  1044. }
  1045. if(cbo->tbox != RT_NULL)
  1046. {
  1047. RTGUI_DC_FC(dc) = black;
  1048. rtgui_theme_draw_textbox(cbo->tbox);
  1049. }
  1050. rtgui_dc_end_drawing(dc);
  1051. }
  1052. void rtgui_theme_draw_combo_downarrow(rtgui_combo_t *cbo)
  1053. {
  1054. rtgui_rect_t rect;
  1055. rtgui_dc_t* dc;
  1056. RT_ASSERT(cbo != RT_NULL);
  1057. /* begin drawing */
  1058. dc = rtgui_dc_begin_drawing(cbo);
  1059. if(dc == RT_NULL)return;
  1060. rtgui_widget_get_rect(cbo, &rect);
  1061. rect.x1 = rect.x2-RTGUI_COMBOBOX_BUTTON_WIDTH-RTGUI_WIDGET_BORDER(cbo);
  1062. rect.y1 += RTGUI_WIDGET_BORDER(cbo);
  1063. rect.x2 -= RTGUI_WIDGET_BORDER(cbo);
  1064. rect.y2 -= RTGUI_WIDGET_BORDER(cbo);
  1065. RTGUI_DC_BC(dc) = default_background;
  1066. rtgui_dc_fill_rect(dc, &rect);
  1067. if(cbo->style & RTGUI_COMBO_STYLE_DOWNARROW_UP)
  1068. {
  1069. rtgui_dc_draw_border(dc, &rect,RTGUI_BORDER_EXTRA);
  1070. rtgui_dc_draw_byte(dc,rect.x1+4, rect.y1+8, 4, combo_down_bmp);
  1071. }
  1072. else if(cbo->style & RTGUI_COMBO_STYLE_DOWNARROW_DOWN)
  1073. {
  1074. rtgui_dc_draw_border(dc, &rect,RTGUI_BORDER_SUNKEN);
  1075. rtgui_dc_draw_byte(dc,rect.x1+5, rect.y1+9, 4, combo_down_bmp);
  1076. }
  1077. rtgui_dc_end_drawing(dc);
  1078. }