diff --git a/examples/rtgui_win/demo_gui_main.c b/examples/rtgui_win/demo_gui_main.c index f62624c3d1..ee86d80a29 100644 --- a/examples/rtgui_win/demo_gui_main.c +++ b/examples/rtgui_win/demo_gui_main.c @@ -1,5 +1,7 @@ /* * 这个一个RTGUI的例子,演示了如何创建一个RTGUI程序 + * 在rtgui_win这个分支中,没有toplevel控件,默认panel + * 作为toplevel级别控件,可以把它看作一个“桌面” */ #include #include @@ -12,6 +14,8 @@ #include #include +void demo_gui_win(PVOID wdt, rtgui_event_t *event); + rtgui_listbox_t *__lbox; static rtgui_listbox_item_t _demo_list[] = @@ -63,6 +67,9 @@ static void rtgui_panel_entry(void* parameter) 10,150,180,50, RTGUI_TEXTBOX_MULTI); + button = rtgui_button_create(panel, "win",140,90,50,25); + rtgui_button_set_onbutton(button,demo_gui_win); + /////////////////////////////////////////////////////// rtgui_panel_show(panel); diff --git a/examples/rtgui_win/demo_gui_win.c b/examples/rtgui_win/demo_gui_win.c new file mode 100644 index 0000000000..d2a99a36fe --- /dev/null +++ b/examples/rtgui_win/demo_gui_win.c @@ -0,0 +1,86 @@ +/* + * 这个例子演示了如何在一个线程中创建一个win + */ + +#include +#include +#include +#include +#include +#include +#include + +static rt_bool_t demo_win_inited = RT_FALSE; + + +static rt_bool_t demo_gui_win_event_handler(PVOID wdt, rtgui_event_t* event) +{ + + if(event->type == RTGUI_EVENT_PAINT) + { + + } + + /* 其他事件使用win默认的事件处理函数处理 */ + return rtgui_win_event_handler(wdt, event); +} + +static void gui_win_entry(void* parameter) +{ + const struct rtgui_graphic_driver* gd = rtgui_graphic_driver_get_default(); + struct rt_messagequeue *mq; + rtgui_win_t *win; + rtgui_button_t *button; + rtgui_point_t p; + rtgui_rect_t rect = {0,0,150,120}; + + /* 创建GUI应用需要的消息队列 */ + mq = rt_mq_create("demo_win", 256, 32, RT_IPC_FLAG_FIFO); + /* 注册当前线程 */ + rtgui_thread_register(rt_thread_self(), mq); + + /* 窗口居中 */ + rtgui_rect_moveto(&rect, (gd->width - rtgui_rect_width(rect))/2, (gd->height - rtgui_rect_height(rect))/2); + /* 创建窗口 */ + win = rtgui_win_create(RT_NULL,"demo_win",&rect,RTGUI_WIN_DEFAULT); + if(win == RT_NULL) return; + + /* 取得客户区坐标零点 */ + p = rtgui_win_get_client_zero(win); + rtgui_label_create(win, "hello world!", p.x+10, p.y+10, 100,25); + + button = rtgui_button_create(win, "Exit", 50,80,50,25); + rtgui_button_set_onbutton(button,rtgui_win_close); + + rtgui_widget_set_event_handler(win, demo_gui_win_event_handler); + + rtgui_win_show(win,RT_FALSE); + + /* 执行工作台事件循环 */ + rtgui_win_event_loop(win); + + demo_win_inited = RT_FALSE; + + /* 去注册GUI线程 */ + rtgui_thread_deregister(rt_thread_self()); + rt_mq_delete(mq); +} + +void demo_gui_win(PVOID wdt, rtgui_event_t *event) +{ + if(demo_win_inited == RT_FALSE) /* 避免重复初始化而做的保护 */ + { + struct rt_thread* tid; + + tid = rt_thread_create("demo_win", gui_win_entry, RT_NULL, 1024, 5, 10); + + if(tid != RT_NULL) rt_thread_startup(tid); + + demo_win_inited = RT_TRUE; + } +} + + + + + diff --git a/examples/rtgui_win/readme.txt b/examples/rtgui_win/readme.txt new file mode 100644 index 0000000000..410c590b81 --- /dev/null +++ b/examples/rtgui_win/readme.txt @@ -0,0 +1,3 @@ +这个文件夹下的例子对应于rtgui_win分支,分支地址是: +http://rt-thread.googlecode.com/svn/branches/rtgui_win/ +新建个文件夹,将SVN update地址设置成上面的地址即可获得rtgui_win分支的代码。 \ No newline at end of file