From 37e3e9886a01403bfa02850e4abf2bb528f131be Mon Sep 17 00:00:00 2001 From: "bernard.xiong" Date: Sat, 15 May 2010 14:38:12 +0000 Subject: [PATCH] update RT-Thread/GUI examples. git-svn-id: https://rt-thread.googlecode.com/svn/trunk@711 bbd45198-f89e-11dd-88c7-29a3b14d5316 --- examples/gui/demo_fnview.c | 2 +- examples/gui/demo_listview.c | 13 +- examples/gui/demo_listview_icon.c | 347 ++++++++++++++++++++++ examples/gui/demo_view_buffer_animation.c | 6 +- examples/gui/demo_view_dc_buffer.c | 1 + examples/gui/demo_view_image.c | 2 +- examples/gui/demo_workbench.c | 5 +- examples/gui/mywidget.c | 6 +- 8 files changed, 364 insertions(+), 18 deletions(-) create mode 100644 examples/gui/demo_listview_icon.c diff --git a/examples/gui/demo_fnview.c b/examples/gui/demo_fnview.c index 034e7d743e..3681722861 100644 --- a/examples/gui/demo_fnview.c +++ b/examples/gui/demo_fnview.c @@ -35,7 +35,7 @@ static void open_btn_onbutton(rtgui_widget_t* widget, struct rtgui_event* event) char path[32]; /* 在文件列表视图中成功选择文件,这里获得相应的路径名 */ - rtgui_filelist_get_fullpath(view, path, sizeof(path)); + rtgui_filelist_view_get_fullpath(view, path, sizeof(path)); /* 设置文件路径到文本标签 */ rtgui_label_set_text(label, path); diff --git a/examples/gui/demo_listview.c b/examples/gui/demo_listview.c index a4adaaafda..73d20eca00 100644 --- a/examples/gui/demo_listview.c +++ b/examples/gui/demo_listview.c @@ -48,12 +48,7 @@ static void listitem_action(void* parameter) /* 返回功能的动作函数 */ static void return_action(void* parameter) { - if (_view != RT_NULL) - { - /* 删除列表视图 */ - rtgui_view_destroy(RTGUI_VIEW(_view)); - _view = RT_NULL; - } + rtgui_view_end_modal(RTGUI_VIEW(_view), RTGUI_MODAL_OK); } /* 各个列表项定义 */ @@ -78,12 +73,14 @@ static void open_btn_onbutton(rtgui_widget_t* widget, struct rtgui_event* event) /* 创建一个列表视图, 项指定为items */ _view = rtgui_list_view_create(items, sizeof(items)/sizeof(struct rtgui_list_item), - &rect); + &rect, RTGUI_LIST_VIEW_LIST); /* 在workbench中添加相应的视图 */ rtgui_workbench_add_view(workbench, RTGUI_VIEW(_view)); /* 模式显示视图 */ - rtgui_view_show(RTGUI_VIEW(_view), RT_FALSE); + rtgui_view_show(RTGUI_VIEW(_view), RT_TRUE); + rtgui_view_destroy(RTGUI_VIEW(_view)); + _view = RT_NULL; } /* 创建用于演示列表视图的视图 */ diff --git a/examples/gui/demo_listview_icon.c b/examples/gui/demo_listview_icon.c new file mode 100644 index 0000000000..20f69a1531 --- /dev/null +++ b/examples/gui/demo_listview_icon.c @@ -0,0 +1,347 @@ +/* + * 程序清单:列表视图演示 + * + * 这个例子会先创建出一个演示用的view,当点击上面的按钮时会按照模式显示的形式显示 + * 新的列表视图 + */ +#include "demo_view.h" +#include +#include +#include +#include + +static rtgui_workbench_t* workbench = RT_NULL; +static rtgui_list_view_t* _view = RT_NULL; +static rtgui_image_t* return_image = RT_NULL; + +/* 列表项的动作函数 */ +static void listitem_action(void* parameter) +{ + char label_text[32]; + rtgui_win_t *win; + rtgui_label_t *label; + rtgui_rect_t rect = {0, 0, 150, 80}; + int no = (int)parameter; + + rtgui_rect_moveto(&rect, 20, 50); + + /* 显示消息窗口 */ + win = rtgui_win_create(RTGUI_TOPLEVEL(workbench), + "窗口", &rect, RTGUI_WIN_STYLE_DEFAULT); + + rect.x1 += 20; + rect.x2 -= 5; + rect.y1 += 5; + rect.y2 = rect.y1 + 20; + + /* 添加相应的标签 */ + rt_sprintf(label_text, "动作 %d", no); + label = rtgui_label_create(label_text); + + rtgui_widget_set_rect(RTGUI_WIDGET(label), &rect); + rtgui_container_add_child(RTGUI_CONTAINER(win), RTGUI_WIDGET(label)); + + /* 非模态显示窗口 */ + rtgui_win_show(win, RT_FALSE); +} + +/* 返回功能的动作函数 */ +static void return_action(void* parameter) +{ + /* 退出模态显示 */ + rtgui_view_end_modal(RTGUI_VIEW(_view), RTGUI_MODAL_OK); +} + +/* 列表项 */ +#define ITEM_MAX 50 +static struct rtgui_list_item *items = RT_NULL; +static rtgui_image_t* item_icon = RT_NULL; +static rtgui_image_t* exit_icon = RT_NULL; + +static const char * image_xpm[] = { + "16 16 106 2", + " c None", + ". c #D0C83F", + "+ c #D0C840", + "@ c #D0C030", + "# c #D0B820", + "$ c #D0B020", + "% c #D0B01F", + "& c #5F571F", + "* c #F0F0C0", + "= c #FFF8D0", + "- c #FFF8C0", + "; c #FFF8B0", + "> c #FFF8A0", + ", c #F0E870", + "' c #707030", + ") c #4F87EF", + "! c #4F78C0", + "~ c #5088E0", + "{ c #5078C0", + "] c #C0D0F0", + "^ c #FFF8E0", + "/ c #FFF090", + "( c #F0E070", + "_ c #6F97D0", + ": c #C0D8FE", + "< c #80A8F0", + "[ c #7088D0", + "} c #B0D0FF", + "| c #90B0F0", + "1 c #1040A0", + "2 c #F0F080", + "3 c #707040", + "4 c #7098F0", + "5 c #3068E0", + "6 c #A0B8F0", + "7 c #4070C0", + "8 c #002880", + "9 c #404040", + "0 c #505050", + "a c #F0F090", + "b c #F0E860", + "c c #F0D860", + "d c #807840", + "e c #2F5FC0", + "f c #1050D0", + "g c #1048B0", + "h c #002870", + "i c #C0C080", + "j c #C0C070", + "k c #F0F070", + "l c #F0E060", + "m c #E0D050", + "n c #00277F", + "o c #00287F", + "p c #1F3F6F", + "q c #1048C0", + "r c #0040B0", + "s c #204080", + "t c #FFF890", + "u c #F0D850", + "v c #E0C840", + "w c #807040", + "x c #A0B06F", + "y c #204880", + "z c #2048A0", + "A c #90A8C0", + "B c #FFF080", + "C c #F0D050", + "D c #C0A830", + "E c #6F682F", + "F c #F0F0A0", + "G c #E0D060", + "H c #B0A040", + "I c #D0B840", + "J c #E0C040", + "K c #D0B030", + "L c #706820", + "M c #5F581F", + "N c #CFBF3F", + "O c #FFF0A0", + "P c #A09830", + "Q c #A08820", + "R c #908030", + "S c #807830", + "T c #707020", + "U c #605820", + "V c #6F672F", + "W c #D0C040", + "X c #F0E880", + "Y c #907820", + "Z c #B09820", + "` c #B09010", + " . c #B08820", + ".. c #806820", + "+. c #5F5F1F", + "@. c #F0E080", + "#. c #B09020", + "$. c #C0B040", + "%. c #A09030", + "&. c #908020", + "*. c #606020", + "=. c #6F5F1F", + "-. c #9F982F", + ";. c #A0872F", + ">. c #6F681F", + ",. c #706020", + " ", + " . + + + @ @ # # $ % & ", + " + * = = = = - ; > , ' ", + " ) ! ~ { ] ^ = - - > / ( ' ", + "_ : < { [ } | 1 - ; > > / 2 ( 3 ", + "{ 4 5 1 6 7 5 8 9 0 a / , b c d ", + "e f g h 8 8 g h i j / k l c m d ", + " n o p q r s t 2 , l c u v w ", + " x y z A B , l u C v D E ", + " @ F > t k G H I J K L M ", + " N @ O / 2 l P Q R S T U V ", + " W m 2 X l I Y Z ` ...+. ", + " W @.l u I R #.Z Y U M ", + " $.G I $.%.R &.Y *.& =. ", + " -.;.>.,.L L ,.& M ", + " "}; + +static const char * exit_xpm[] = { + "16 16 71 1", + " c None", + ". c #CF673F", + "+ c #D0673F", + "@ c #C05F3F", + "# c #BF5F3F", + "$ c #D0674F", + "% c #E07050", + "& c #F07850", + "* c #FF7040", + "= c #F06830", + "- c #E05830", + "; c #D05030", + "> c #B04F2F", + ", c #D06F4F", + "' c #F08060", + ") c #FF9070", + "! c #FF8860", + "~ c #FF8050", + "{ c #FF5820", + "] c #FF4810", + "^ c #D04810", + "/ c #B0482F", + "( c #FF9880", + "_ c #FF6030", + ": c #F04000", + "< c #C04010", + "[ c #A03F2F", + "} c #E06840", + "| c #FF9870", + "1 c #FF7850", + "2 c #FF6840", + "3 c #F04010", + "4 c #E03800", + "5 c #A03820", + "6 c #8F372F", + "7 c #F06840", + "8 c #FF8060", + "9 c #FFFFFF", + "0 c #FFF8F0", + "a c #FFF0F0", + "b c #FFE8E0", + "c c #FFD0C0", + "d c #E04010", + "e c #B03010", + "f c #7F2F1F", + "g c #FFD8D0", + "h c #FFC8C0", + "i c #C03000", + "j c #6F281F", + "k c #F04810", + "l c #FF6830", + "m c #FFE0D0", + "n c #F0C0B0", + "o c #D04010", + "p c #5F1F1F", + "q c #E04820", + "r c #FF4000", + "s c #FF5020", + "t c #FF5010", + "u c #D03800", + "v c #D03000", + "w c #B02800", + "x c #5F170F", + "y c #C05020", + "z c #F03800", + "A c #802010", + "B c #4F0F0F", + "C c #A02800", + "D c #C03810", + "E c #5F0F00", + "F c #A03810", + " ", + " .+@@@# ", + " $%&*=-;> ", + " ,')!~*{]^/ ", + " +&)()~*_]:<[ ", + " .}~!||!12{3456 ", + " +7899990abcdef ", + " @{19990bgchdij ", + " @kl0abmchcnoip ", + " @qr]stt]3duvwx ", + " #yz:::z44uvvAB ", + " >o4444uvvvCB ", + " /DvvvvvvCE ", + " [FeiiwAB ", + " 6fjpxB ", + " "}; + +/* 打开列表视图用的按钮触发函数 */ +static void open_btn_onbutton(rtgui_widget_t* widget, struct rtgui_event* event) +{ + rtgui_rect_t rect; + rt_uint32_t index; + + /* 获得顶层的workbench */ + workbench = RTGUI_WORKBENCH(rtgui_widget_get_toplevel(widget)); + rtgui_widget_get_rect(RTGUI_WIDGET(workbench), &rect); + + /* 初始化图标列表 */ + if (items == RT_NULL) + { + char item_name[32]; + + items = (struct rtgui_list_item *) rtgui_malloc((ITEM_MAX + 1) * sizeof(struct rtgui_list_item)); + for (index = 0; index < ITEM_MAX; index ++) + { + rt_snprintf(item_name, sizeof(item_name), "图标%d", index); + items[index].action = listitem_action; + items[index].image = item_icon; + items[index].name = strdup(item_name); + items[index].parameter = (void*) index; + } + + items[ITEM_MAX].action = return_action; + items[ITEM_MAX].image = exit_icon; + items[ITEM_MAX].name = "退出"; + items[ITEM_MAX].parameter = RT_NULL; + } + + /* 创建一个列表视图, 项指定为items */ + _view = rtgui_list_view_create(items, ITEM_MAX + 1, &rect, RTGUI_LIST_VIEW_ICON); + /* 在workbench中添加相应的视图 */ + rtgui_workbench_add_view(workbench, RTGUI_VIEW(_view)); + + /* 模式显示视图 */ + rtgui_view_show(RTGUI_VIEW(_view), RT_TRUE); + rtgui_view_destroy(RTGUI_VIEW(_view)); + + _view = RT_TRUE; +} + +/* 创建用于演示列表视图的视图 */ +rtgui_view_t* demo_listview_icon_view(rtgui_workbench_t* workbench) +{ + rtgui_rect_t rect; + rtgui_view_t *view; + rtgui_button_t* open_btn; + + view = demo_view(workbench, "图标视图演示"); + + if (item_icon == RT_NULL) + item_icon = rtgui_image_create_from_mem("xpm", + image_xpm, sizeof(image_xpm), RT_TRUE); + if (exit_icon == RT_NULL) + exit_icon = rtgui_image_create_from_mem("xpm", + exit_xpm, sizeof(image_xpm), RT_TRUE); + + /* 添加动作按钮 */ + demo_view_get_rect(view, &rect); + rect.x1 += 5; + rect.x2 = rect.x1 + 80; + rect.y1 += 30; + rect.y2 = rect.y1 + 20; + open_btn = rtgui_button_create("打开图标列表"); + rtgui_container_add_child(RTGUI_CONTAINER(view), RTGUI_WIDGET(open_btn)); + rtgui_widget_set_rect(RTGUI_WIDGET(open_btn), &rect); + rtgui_button_set_onbutton(open_btn, open_btn_onbutton); + + return view; +} diff --git a/examples/gui/demo_view_buffer_animation.c b/examples/gui/demo_view_buffer_animation.c index 51a4e425de..de55f25ebf 100644 --- a/examples/gui/demo_view_buffer_animation.c +++ b/examples/gui/demo_view_buffer_animation.c @@ -95,11 +95,11 @@ rtgui_view_t *demo_view_buffer_animation(rtgui_workbench_t* workbench) { rtgui_view_t *view; - view = demo_view(workbench, "DC 动画"); + view = demo_view(workbench, "DC 缓冲区动画"); if (view != RT_NULL) rtgui_widget_set_event_handler(RTGUI_WIDGET(view), animation_event_handler); - rtgui_font_get_metrics(RTGUI_WIDGET_FONT(RTGUI_WIDGET(view)), "飞线乱飞", &text_rect); + rtgui_font_get_metrics(RTGUI_WIDGET_FONT(RTGUI_WIDGET(view)), "缓冲动画", &text_rect); if (dc_buffer == RT_NULL) { rtgui_rect_t rect; @@ -113,7 +113,7 @@ rtgui_view_t *demo_view_buffer_animation(rtgui_workbench_t* workbench) rtgui_dc_fill_rect(dc_buffer, &rect); RTGUI_DC_FC(dc_buffer) = black; rect.x1 = 1; rect.y1 = 1; - rtgui_dc_draw_text(dc_buffer, "飞线乱飞", &rect); + rtgui_dc_draw_text(dc_buffer, "缓冲动画", &rect); } /* 启动定时器以触发动画 */ diff --git a/examples/gui/demo_view_dc_buffer.c b/examples/gui/demo_view_dc_buffer.c index 8cb35a608a..1b459b220a 100644 --- a/examples/gui/demo_view_dc_buffer.c +++ b/examples/gui/demo_view_dc_buffer.c @@ -69,6 +69,7 @@ rtgui_view_t *demo_view_dc_buffer(rtgui_workbench_t* workbench) dc_buffer = rtgui_dc_buffer_create(50, 50); RTGUI_DC_FC(dc_buffer) = blue; rtgui_dc_fill_rect(dc_buffer, &rect); + RTGUI_DC_FC(dc_buffer) = red; rtgui_dc_draw_circle(dc_buffer, 25, 25, 10); } diff --git a/examples/gui/demo_view_image.c b/examples/gui/demo_view_image.c index c68b56f347..a98a624aec 100644 --- a/examples/gui/demo_view_image.c +++ b/examples/gui/demo_view_image.c @@ -34,7 +34,7 @@ static void open_btn_onbutton(rtgui_widget_t* widget, struct rtgui_event* event) char path[32], image_type[8]; /* 设置文件路径的标签 */ - rtgui_filelist_get_fullpath(view, path, sizeof(path)); + rtgui_filelist_view_get_fullpath(view, path, sizeof(path)); if (image != RT_NULL) rtgui_image_destroy(image); rt_memset(image_type, 0, sizeof(image_type)); diff --git a/examples/gui/demo_workbench.c b/examples/gui/demo_workbench.c index 115d211e95..98da276719 100644 --- a/examples/gui/demo_workbench.c +++ b/examples/gui/demo_workbench.c @@ -37,9 +37,9 @@ static void workbench_entry(void* parameter) /* 鍒涘缓GUI搴旂敤闇瑕佺殑娑堟伅闃熷垪 */ #ifdef RTGUI_USING_SMALL_SIZE - mq = rt_mq_create("workbench", 32, 8, RT_IPC_FLAG_FIFO); + mq = rt_mq_create("workbench", 32, 32, RT_IPC_FLAG_FIFO); #else - mq = rt_mq_create("workbench", 256, 8, RT_IPC_FLAG_FIFO); + mq = rt_mq_create("workbench", 256, 32, RT_IPC_FLAG_FIFO); #endif /* 娉ㄥ唽褰撳墠绾跨▼涓篏UI绾跨▼ */ rtgui_thread_register(rt_thread_self(), mq); @@ -67,6 +67,7 @@ static void workbench_entry(void* parameter) demo_view_mywidget(workbench); demo_view_image(workbench); demo_listview_view(workbench); + demo_listview_icon_view(workbench); demo_fn_view(workbench); /* 鏄剧ず瑙嗗浘 */ diff --git a/examples/gui/mywidget.c b/examples/gui/mywidget.c index d41e3a77e7..3107f139e9 100644 --- a/examples/gui/mywidget.c +++ b/examples/gui/mywidget.c @@ -23,15 +23,15 @@ static void rtgui_mywidget_ondraw(struct rtgui_mywidget* me) y = (rect.y2 + rect.y1)/2; /* 缁樺埗鍗佸瓧鏋 */ - RTGUI_DC_BC(dc) = black; + RTGUI_DC_FC(dc) = black; rtgui_dc_draw_hline(dc, rect.x1, rect.x2, y); rtgui_dc_draw_vline(dc, x, rect.y1, rect.y2); /* 鏍规嵁鐘舵佺粯鍒跺渾鍦 */ if (me->status == MYWIDGET_STATUS_ON) - RTGUI_DC_BC(dc) = green; + RTGUI_DC_FC(dc) = green; else - RTGUI_DC_BC(dc) = red; + RTGUI_DC_FC(dc) = red; rtgui_dc_fill_circle(dc, x, y, 5); /* 缁撴潫缁樺浘 */