summaryrefslogtreecommitdiff
path: root/components/rtgui_win/include/rtgui
diff options
context:
space:
mode:
author[email protected] <[email protected]>2011-03-24 14:00:19 +0000
committer[email protected] <[email protected]>2011-03-24 14:00:19 +0000
commit0e93e6809c7beac4597148edc1dc09bcdf9a2ab3 (patch)
tree113765e7f8351d84226a3de04f13daf86ddd82f9 /components/rtgui_win/include/rtgui
parent96c53b49571adadd957df804f4f5e6698c14e3b3 (diff)
add rtgui_win subfield,Highlight the ease of use
git-svn-id: https://rt-thread.googlecode.com/svn/trunk@1345 bbd45198-f89e-11dd-88c7-29a3b14d5316
Diffstat (limited to 'components/rtgui_win/include/rtgui')
-rw-r--r--components/rtgui_win/include/rtgui/blit.h9
-rw-r--r--components/rtgui_win/include/rtgui/color.h104
-rw-r--r--components/rtgui_win/include/rtgui/dc.h197
-rw-r--r--components/rtgui_win/include/rtgui/dc_client.h27
-rw-r--r--components/rtgui_win/include/rtgui/dc_hw.h24
-rw-r--r--components/rtgui_win/include/rtgui/driver.h67
-rw-r--r--components/rtgui_win/include/rtgui/event.h341
-rw-r--r--components/rtgui_win/include/rtgui/filerw.h48
-rw-r--r--components/rtgui_win/include/rtgui/font.h116
-rw-r--r--components/rtgui_win/include/rtgui/image.h78
-rw-r--r--components/rtgui_win/include/rtgui/image_bmp.h19
-rw-r--r--components/rtgui_win/include/rtgui/image_hdc.h37
-rw-r--r--components/rtgui_win/include/rtgui/image_jpeg.h8
-rw-r--r--components/rtgui_win/include/rtgui/image_png.h21
-rw-r--r--components/rtgui_win/include/rtgui/image_xpm.h21
-rw-r--r--components/rtgui_win/include/rtgui/kbddef.h293
-rw-r--r--components/rtgui_win/include/rtgui/list.h66
-rw-r--r--components/rtgui_win/include/rtgui/region.h101
-rw-r--r--components/rtgui_win/include/rtgui/rtgui.h154
-rw-r--r--components/rtgui_win/include/rtgui/rtgui_config.h41
-rw-r--r--components/rtgui_win/include/rtgui/rtgui_object.h107
-rw-r--r--components/rtgui_win/include/rtgui/rtgui_server.h32
-rw-r--r--components/rtgui_win/include/rtgui/rtgui_system.h94
-rw-r--r--components/rtgui_win/include/rtgui/rtgui_theme.h80
-rw-r--r--components/rtgui_win/include/rtgui/rtgui_xml.h34
-rw-r--r--components/rtgui_win/include/rtgui/tree.h748
-rw-r--r--components/rtgui_win/include/rtgui/widgets/button.h84
-rw-r--r--components/rtgui_win/include/rtgui/widgets/checkbox.h35
-rw-r--r--components/rtgui_win/include/rtgui/widgets/combobox.h62
-rw-r--r--components/rtgui_win/include/rtgui/widgets/container.h50
-rw-r--r--components/rtgui_win/include/rtgui/widgets/dialog.h32
-rw-r--r--components/rtgui_win/include/rtgui/widgets/filelist_view.h60
-rw-r--r--components/rtgui_win/include/rtgui/widgets/iconbox.h58
-rw-r--r--components/rtgui_win/include/rtgui/widgets/label.h48
-rw-r--r--components/rtgui_win/include/rtgui/widgets/list_view.h76
-rw-r--r--components/rtgui_win/include/rtgui/widgets/listbox.h75
-rw-r--r--components/rtgui_win/include/rtgui/widgets/menu.h106
-rw-r--r--components/rtgui_win/include/rtgui/widgets/progressbar.h40
-rw-r--r--components/rtgui_win/include/rtgui/widgets/radiobox.h42
-rw-r--r--components/rtgui_win/include/rtgui/widgets/scrollbar.h92
-rw-r--r--components/rtgui_win/include/rtgui/widgets/slider.h40
-rw-r--r--components/rtgui_win/include/rtgui/widgets/staticline.h32
-rw-r--r--components/rtgui_win/include/rtgui/widgets/textbox.h78
-rw-r--r--components/rtgui_win/include/rtgui/widgets/view.h62
-rw-r--r--components/rtgui_win/include/rtgui/widgets/widget.h168
-rw-r--r--components/rtgui_win/include/rtgui/widgets/window.h130
46 files changed, 4237 insertions, 0 deletions
diff --git a/components/rtgui_win/include/rtgui/blit.h b/components/rtgui_win/include/rtgui/blit.h
new file mode 100644
index 0000000000..615e5b6d7e
--- /dev/null
+++ b/components/rtgui_win/include/rtgui/blit.h
@@ -0,0 +1,9 @@
+#ifndef __RTGUI_BLIT_H__
+#define __RTGUI_BLIT_H__
+
+#include <rtgui/rtgui.h>
+
+typedef void (*rtgui_blit_line_func)(rt_uint8_t* dst, rt_uint8_t* src, int line);
+rtgui_blit_line_func rtgui_blit_line_get(int dst_bpp, int src_bpp);
+
+#endif
diff --git a/components/rtgui_win/include/rtgui/color.h b/components/rtgui_win/include/rtgui/color.h
new file mode 100644
index 0000000000..d5b17b8e5e
--- /dev/null
+++ b/components/rtgui_win/include/rtgui/color.h
@@ -0,0 +1,104 @@
+/*
+ * File : color.h
+ * This file is part of RT-Thread RTOS
+ * COPYRIGHT (C) 2006 - 2009, RT-Thread Development Team
+ *
+ * The license and distribution terms for this file may be
+ * found in the file LICENSE in this distribution or at
+ * http://www.rt-thread.org/license/LICENSE
+ *
+ * Change Logs:
+ * Date Author Notes
+ * 2009-10-16 Bernard first version
+ */
+#ifndef __RTGUI_COLOR_H__
+#define __RTGUI_COLOR_H__
+
+#include <rtgui/rtgui.h>
+
+
+extern const rtgui_color_t default_foreground;
+extern const rtgui_color_t default_background;
+extern const rtgui_color_t selected_color;
+
+extern const rtgui_color_t red;
+extern const rtgui_color_t green;
+extern const rtgui_color_t blue;
+extern const rtgui_color_t black;
+extern const rtgui_color_t white;
+extern const rtgui_color_t yellow;
+extern const rtgui_color_t cyan;
+extern const rtgui_color_t purple;
+extern const rtgui_color_t dark;
+
+extern const rtgui_color_t high_light;
+extern const rtgui_color_t dark_grey;
+extern const rtgui_color_t light_grey;
+
+
+#define RTGUI_ARGB(a, r, g, b) \
+ ((rtgui_color_t)(((rt_uint8_t)(r)|\
+ (((unsigned)(rt_uint8_t)(g))<<8))|\
+ (((unsigned long)(rt_uint8_t)(b))<<16)|\
+ (((unsigned long)(rt_uint8_t)(a))<<24)))
+#define RTGUI_RGB(r, g, b) RTGUI_ARGB(255, (r), (g), (b))
+
+#define RTGUI_RGB_R(c) (((c) >> 0) & 0xFF)
+#define RTGUI_RGB_G(c) (((c) >> 8) & 0xFF)
+#define RTGUI_RGB_B(c) (((c) >> 16) & 0xFF)
+#define RTGUI_RGB_A(c) (((c) >> 24) & 0xFF)
+
+/*
+ * RTGUI default color format
+ * BBBB BBBB GGGG GGGG RRRR RRRR
+ */
+
+/* convert rtgui color to BBBBB_GGGGGG_RRRRR */
+rt_inline rt_uint16_t rtgui_color_to_565(rt_uint32_t c)
+{
+ rt_uint16_t pixel;
+
+ pixel = (rt_uint16_t)(((RTGUI_RGB_B(c)*31/255) << 11) | ((RTGUI_RGB_G(c)*63/255) << 5) | (RTGUI_RGB_R(c)*31/255));
+ return pixel;
+}
+
+rt_inline rt_uint32_t rtgui_color_from_565(rt_uint16_t pixel)
+{
+ rt_uint16_t r, g, b;
+ rtgui_color_t color;
+
+ r = pixel & 0x1f;
+ g = (pixel >> 5) & 0x3f;
+ b = (pixel >> 11) & 0x1f;
+
+ color = r * 255 / 31 + ((g * 255 / 63) << 8) + ((b * 255 / 31) << 16);
+
+ return color;
+}
+
+/* convert rtgui color to RRRRR_GGGGGG)BBBBB */
+rt_inline rt_uint16_t rtgui_color_to_565p(rt_uint32_t c)
+{
+ rt_uint16_t pixel;
+
+ pixel = (rt_uint16_t)(((RTGUI_RGB_R(c)*31/255) << 11) | ((RTGUI_RGB_G(c)*63/255) << 5) | (RTGUI_RGB_B(c)*31/255));
+ return pixel;
+}
+
+rt_inline rt_uint32_t rtgui_color_from_565p(rt_uint16_t pixel)
+{
+ rt_uint8_t r, g, b;
+ rtgui_color_t color;
+
+ r = (pixel >> 11) & 0x1f;
+ g = (pixel >> 5) & 0x3f;
+ b = pixel & 0x1f;
+
+ color = r * 255 / 31 + ((g * 255 / 63) << 8) + ((b * 255 / 31) << 16);
+
+ return color;
+}
+
+
+#endif
+
diff --git a/components/rtgui_win/include/rtgui/dc.h b/components/rtgui_win/include/rtgui/dc.h
new file mode 100644
index 0000000000..4239283e55
--- /dev/null
+++ b/components/rtgui_win/include/rtgui/dc.h
@@ -0,0 +1,197 @@
+/*
+ * File : dc.h
+ * This file is part of RT-Thread RTOS
+ * COPYRIGHT (C) 2006 - 2009, RT-Thread Development Team
+ *
+ * The license and distribution terms for this file may be
+ * found in the file LICENSE in this distribution or at
+ * http://www.rt-thread.org/license/LICENSE
+ *
+ * Change Logs:
+ * Date Author Notes
+ * 2009-10-16 Bernard first version
+ */
+#ifndef __RTGUI_DC_H__
+#define __RTGUI_DC_H__
+
+#include <rtgui/rtgui.h>
+#include <rtgui/font.h>
+#include <rtgui/driver.h>
+#include <rtgui/widgets/widget.h>
+
+enum rtgui_dc_type
+{
+ RTGUI_DC_HW,
+ RTGUI_DC_CLIENT,
+ RTGUI_DC_BUFFER,
+ RTGUI_DC_IMLIB2,
+};
+
+struct rtgui_dc_engine
+{
+ /* interface */
+ void (*draw_point)(struct rtgui_dc* dc, int x, int y);
+ void (*draw_color_point)(struct rtgui_dc* dc, int x, int y, rtgui_color_t color);
+ void (*draw_vline)(struct rtgui_dc* dc, int x, int y1, int y2);
+ void (*draw_hline)(struct rtgui_dc* dc, int x1, int x2, int y);
+ void (*fill_rect )(struct rtgui_dc* dc, rtgui_rect_t* rect);
+ void (*blit_line) (struct rtgui_dc* dc, int x1, int x2, int y, rt_uint8_t* line_data);
+ void (*blit )(struct rtgui_dc* dc, struct rtgui_point* dc_point, struct rtgui_dc* dest, rtgui_rect_t* rect);
+
+ /* set and get graphic context */
+ void (*set_gc)(struct rtgui_dc* dc, struct rtgui_gc *gc);
+ struct rtgui_gc* (*get_gc)(struct rtgui_dc* dc);
+
+ /* get dc visible */
+ rt_bool_t (*get_visible)(struct rtgui_dc* dc);
+
+ /* get dc rect */
+ void (*get_rect )(struct rtgui_dc* dc, rtgui_rect_t* rect);
+
+ rt_bool_t (*fini )(struct rtgui_dc* dc);
+};
+
+/* the abstract device context */
+struct rtgui_dc
+{
+ /* type of device context */
+ rt_uint32_t type;
+
+ /* dc engine */
+ const struct rtgui_dc_engine* engine;
+};
+
+#define RTGUI_DC_FC(dc) (rtgui_dc_get_gc(dc)->foreground)
+#define RTGUI_DC_BC(dc) (rtgui_dc_get_gc(dc)->background)
+#define RTGUI_DC_FONT(dc) (rtgui_dc_get_gc(dc)->font)
+#define RTGUI_DC_TEXTALIGN(dc) (rtgui_dc_get_gc(dc)->textalign)
+
+/* create a buffer dc */
+struct rtgui_dc* rtgui_dc_buffer_create(int width, int height);
+rt_uint8_t* rtgui_dc_buffer_get_pixel(struct rtgui_dc* dc);
+
+/* begin and end a drawing */
+struct rtgui_dc* rtgui_dc_begin_drawing(PVOID wdt);
+void rtgui_dc_end_drawing(struct rtgui_dc* dc);
+
+/* destroy a dc */
+void rtgui_dc_destory(struct rtgui_dc* dc);
+
+void rtgui_dc_draw_line (struct rtgui_dc* dc, int x1, int y1, int x2, int y2);
+void rtgui_dc_draw_rect (struct rtgui_dc* dc, struct rtgui_rect* rect);
+void rtgui_dc_fill_rect_forecolor(struct rtgui_dc* dc, struct rtgui_rect* rect);
+void rtgui_dc_draw_round_rect(struct rtgui_dc* dc, struct rtgui_rect* rect, int r);
+void rtgui_dc_fill_round_rect(struct rtgui_dc* dc, struct rtgui_rect* rect, int r);
+void rtgui_dc_draw_annulus(struct rtgui_dc *dc, rt_int16_t x, rt_int16_t y, rt_int16_t r1, rt_int16_t r2, rt_int16_t start, rt_int16_t end);
+void rtgui_dc_draw_sector(struct rtgui_dc *dc, rt_int16_t x, rt_int16_t y, rt_int16_t r, rt_int16_t start, rt_int16_t end);
+void rtgui_dc_fill_sector(struct rtgui_dc *dc, rt_int16_t x, rt_int16_t y, rt_int16_t r, rt_int16_t start, rt_int16_t end);
+
+void rtgui_dc_draw_text (struct rtgui_dc* dc, const char* text, struct rtgui_rect* rect);
+
+void rtgui_dc_draw_mono_bmp(struct rtgui_dc* dc, int x, int y, int w, int h, const rt_uint8_t* data);
+void rtgui_dc_draw_byte(struct rtgui_dc*dc, int x, int y, int h, const rt_uint8_t* data);
+void rtgui_dc_draw_word(struct rtgui_dc*dc, int x, int y, int h, const rt_uint8_t* data);
+
+void rtgui_dc_draw_border(struct rtgui_dc* dc, rtgui_rect_t* rect, int flag);
+void rtgui_dc_draw_horizontal_line(struct rtgui_dc* dc, int x1, int x2, int y);
+void rtgui_dc_draw_vertical_line(struct rtgui_dc* dc, int x, int y1, int y2);
+void rtgui_dc_draw_focus_rect(struct rtgui_dc* dc, rtgui_rect_t* rect);
+
+void rtgui_dc_draw_polygon(struct rtgui_dc* dc, const int *vx, const int *vy, int count);
+void rtgui_dc_fill_polygon(struct rtgui_dc* dc, const int* vx, const int* vy, int count);
+
+void rtgui_dc_draw_circle(struct rtgui_dc* dc, int x, int y, int r);
+void rtgui_dc_fill_circle(struct rtgui_dc* dc, rt_int16_t x, rt_int16_t y, rt_int16_t r);
+void rtgui_dc_draw_arc(struct rtgui_dc *dc, rt_int16_t x, rt_int16_t y, rt_int16_t r, rt_int16_t start, rt_int16_t end);
+
+void rtgui_dc_draw_ellipse(struct rtgui_dc* dc, rt_int16_t x, rt_int16_t y, rt_int16_t rx, rt_int16_t ry);
+void rtgui_dc_fill_ellipse(struct rtgui_dc *dc, rt_int16_t x, rt_int16_t y, rt_int16_t rx, rt_int16_t ry);
+
+/*
+ * dc inline function
+ *
+ * Note:
+ * In order to improve drawing speed, put most of common function of dc to inline
+ */
+
+/*
+ * draw a point on dc
+ */
+rt_inline void rtgui_dc_draw_point(struct rtgui_dc* dc, int x, int y)
+{
+ dc->engine->draw_point(dc, x, y);
+}
+
+/*
+ * draw a color point on dc
+ */
+rt_inline void rtgui_dc_draw_color_point(struct rtgui_dc* dc, int x, int y, rtgui_color_t color)
+{
+ dc->engine->draw_color_point(dc, x, y, color);
+}
+
+/*
+ * draw a vertical line on dc
+ */
+rt_inline void rtgui_dc_draw_vline(struct rtgui_dc* dc, int x, int y1, int y2)
+{
+ dc->engine->draw_vline(dc, x, y1, y2);
+}
+
+/*
+ * draw a horizontal line on dc
+ */
+rt_inline void rtgui_dc_draw_hline(struct rtgui_dc* dc, int x1, int x2, int y)
+{
+ dc->engine->draw_hline(dc, x1, x2, y);
+}
+
+/*
+ * fill a rect with background color
+ */
+rt_inline void rtgui_dc_fill_rect (struct rtgui_dc* dc, struct rtgui_rect* rect)
+{
+ dc->engine->fill_rect(dc, rect);
+}
+
+/*
+ * blit a dc on hardware dc
+ */
+rt_inline void rtgui_dc_blit(struct rtgui_dc* dc, struct rtgui_point* dc_point, struct rtgui_dc* dest, rtgui_rect_t* rect)
+{
+ dc->engine->blit(dc, dc_point, dest, rect);
+}
+
+/*
+ * set gc of dc
+ */
+rt_inline void rtgui_dc_set_gc(struct rtgui_dc* dc, rtgui_gc_t* gc)
+{
+ dc->engine->set_gc(dc, gc);
+}
+
+/*
+ * get gc of dc
+ */
+rt_inline rtgui_gc_t *rtgui_dc_get_gc(struct rtgui_dc* dc)
+{
+ return dc->engine->get_gc(dc);
+}
+
+/*
+ * get visible status of dc
+ */
+rt_inline rt_bool_t rtgui_dc_get_visible(struct rtgui_dc* dc)
+{
+ return dc->engine->get_visible(dc);
+}
+
+/*
+ * get rect of dc
+ */
+rt_inline void rtgui_dc_get_rect(struct rtgui_dc*dc, rtgui_rect_t* rect)
+{
+ dc->engine->get_rect(dc, rect);
+}
+
+#endif
diff --git a/components/rtgui_win/include/rtgui/dc_client.h b/components/rtgui_win/include/rtgui/dc_client.h
new file mode 100644
index 0000000000..297307c875
--- /dev/null
+++ b/components/rtgui_win/include/rtgui/dc_client.h
@@ -0,0 +1,27 @@
+/*
+ * File : dc_buffer.h
+ * This file is part of RT-Thread RTOS
+ * COPYRIGHT (C) 2006 - 2010, RT-Thread Development Team
+ *
+ * The license and distribution terms for this file may be
+ * found in the file LICENSE in this distribution or at
+ * http://www.rt-thread.org/license/LICENSE
+ *
+ * Change Logs:
+ * Date Author Notes
+ * 2010-04-10 Bernard first version
+ * 2010-06-14 Bernard embedded hardware dc to each widget
+ * 2010-08-09 Bernard rename hardware dc to client dc
+ */
+
+#ifndef __RTGUI_DC_CLIENT_H__
+#define __RTGUI_DC_CLIENT_H__
+
+#include <rtgui/dc.h>
+
+/* create a hardware dc */
+struct rtgui_dc* rtgui_dc_client_create(rtgui_widget_t* owner);
+void rtgui_dc_client_init(rtgui_widget_t* owner);
+
+#endif
+
diff --git a/components/rtgui_win/include/rtgui/dc_hw.h b/components/rtgui_win/include/rtgui/dc_hw.h
new file mode 100644
index 0000000000..f4c84dd755
--- /dev/null
+++ b/components/rtgui_win/include/rtgui/dc_hw.h
@@ -0,0 +1,24 @@
+/*
+ * File : dc_buffer.h
+ * This file is part of RT-Thread RTOS
+ * COPYRIGHT (C) 2006 - 2010, RT-Thread Development Team
+ *
+ * The license and distribution terms for this file may be
+ * found in the file LICENSE in this distribution or at
+ * http://www.rt-thread.org/license/LICENSE
+ *
+ * Change Logs:
+ * Date Author Notes
+ * 2010-04-10 Bernard first version
+ * 2010-06-14 Bernard embedded hardware dc to each widget
+ */
+#ifndef __RTGUI_DC_HW_H__
+#define __RTGUI_DC_HW_H__
+
+#include <rtgui/dc.h>
+
+/* create a hardware dc */
+struct rtgui_dc* rtgui_dc_hw_create(rtgui_widget_t* owner);
+
+#endif
+
diff --git a/components/rtgui_win/include/rtgui/driver.h b/components/rtgui_win/include/rtgui/driver.h
new file mode 100644
index 0000000000..9b3db0e19b
--- /dev/null
+++ b/components/rtgui_win/include/rtgui/driver.h
@@ -0,0 +1,67 @@
+/*
+ * File : driver.h
+ * This file is part of RTGUI in RT-Thread RTOS
+ * COPYRIGHT (C) 2006 - 2009, RT-Thread Development Team
+ *
+ * The license and distribution terms for this file may be
+ * found in the file LICENSE in this distribution or at
+ * http://www.rt-thread.org/license/LICENSE
+ *
+ * Change Logs:
+ * Date Author Notes
+ * 2009-10-04 Bernard first version
+ */
+#ifndef __RTGUI_DRIVER_H__
+#define __RTGUI_DRIVER_H__
+
+#include <rtgui/list.h>
+#include <rtgui/color.h>
+
+struct rtgui_graphic_driver
+{
+ /* driver name */
+ char* name;
+
+ /* byte per pixel */
+ rt_uint16_t byte_per_pixel;
+
+ /* screen width and height */
+ rt_uint16_t width;
+ rt_uint16_t height;
+
+ /* screen update */
+ void (*screen_update)(rtgui_rect_t* rect);
+
+ /* get video frame buffer */
+ rt_uint8_t* (*get_framebuffer)(void);
+
+ /* set and get pixel in (x, y) */
+ void (*set_pixel) (rtgui_color_t *c, rt_base_t x, rt_base_t y);
+ void (*get_pixel) (rtgui_color_t *c, rt_base_t x, rt_base_t y);
+
+ void (*draw_hline)(rtgui_color_t *c, rt_base_t x1, rt_base_t x2, rt_base_t y);
+ void (*draw_vline)(rtgui_color_t *c, rt_base_t x , rt_base_t y1, rt_base_t y2);
+
+ /* draw raw rt_hw_lcd_draw_hline */
+ void (*draw_raw_hline)(rt_uint8_t *pixels, rt_base_t x1, rt_base_t x2, rt_base_t y);
+
+ /* the driver list */
+ rtgui_list_t list;
+};
+
+#ifdef RTGUI_USING_GRAPHIC_DRIVER_LIST
+void rtgui_graphic_driver_add(struct rtgui_graphic_driver* driver);
+void rtgui_graphic_driver_remove(struct rtgui_graphic_driver* driver);
+
+struct rtgui_graphic_driver* rtgui_graphic_driver_find(char* name);
+#else
+void rtgui_graphic_driver_add(const struct rtgui_graphic_driver* driver);
+#endif
+
+const struct rtgui_graphic_driver* rtgui_graphic_driver_get_default(void);
+
+void rtgui_graphic_driver_get_rect(const struct rtgui_graphic_driver *driver, rtgui_rect_t *rect);
+void rtgui_graphic_driver_get_default_rect(rtgui_rect_t *rect);
+
+#endif
+
diff --git a/components/rtgui_win/include/rtgui/event.h b/components/rtgui_win/include/rtgui/event.h
new file mode 100644
index 0000000000..7f5241ab20
--- /dev/null
+++ b/components/rtgui_win/include/rtgui/event.h
@@ -0,0 +1,341 @@
+/*
+ * File : event.h
+ * This file is part of RTGUI in RT-Thread RTOS
+ * COPYRIGHT (C) 2006 - 2009, RT-Thread Development Team
+ *
+ * The license and distribution terms for this file may be
+ * found in the file LICENSE in this distribution or at
+ * http://www.rt-thread.org/license/LICENSE
+ *
+ * Change Logs:
+ * Date Author Notes
+ * 2009-10-04 Bernard first version
+ */
+#ifndef __RTGUI_EVENT_H__
+#define __RTGUI_EVENT_H__
+
+#include <rtgui/rtgui.h>
+#include <rtgui/rtgui_system.h>
+
+/* Use new name & namespace */
+typedef struct rtgui_event rtgui_event_t;
+typedef struct rtgui_event_win rtgui_event_win_t;
+typedef struct rtgui_event_win_move rtgui_event_win_move_t;
+typedef struct rtgui_event_win_resize rtgui_event_win_resize_t;
+
+typedef struct rtgui_event_set_wm rtgui_event_set_wm_t;
+typedef struct rtgui_event_update rtgui_event_update_t;
+typedef struct rtgui_event_monitor rtgui_event_monitor_t;
+typedef struct rtgui_event_paint rtgui_event_paint_t;
+typedef struct rtgui_event_timer rtgui_event_timer_t;
+typedef struct rtgui_event_clip rtgui_event_clip_t;
+
+typedef struct rtgui_event_mouse rtgui_event_mouse_t;
+typedef struct rtgui_event_kbd rtgui_event_kbd_t;
+typedef struct rtgui_event_current_pos rtgui_event_current_pos_t;//���������¼�
+typedef struct rtgui_event_backlight rtgui_event_backlight_t;//LCD����
+typedef struct rtgui_event_command rtgui_event_command_t;
+typedef struct rtgui_event_scrollbar rtgui_event_scrollbar_t;
+
+typedef struct rtgui_event_focused rtgui_event_focused_t;
+typedef struct rtgui_event_resize rtgui_event_resize_t;
+
+
+/* panel event NULL */
+
+/* window event */
+#define RTGUI_EVENT_PANEL_ATTACH 0 /* attach to a panel */
+#define RTGUI_EVENT_PANEL_DETACH 1 /* detach from a panel */
+#define RTGUI_EVENT_PANEL_SHOW 2 /* show in a panel */
+#define RTGUI_EVENT_PANEL_HIDE 3 /* hide from a panel */
+#define RTGUI_EVENT_PANEL_INFO 4 /* panel information */
+#define RTGUI_EVENT_PANEL_RESIZE 5 /* resize panel */
+#define RTGUI_EVENT_PANEL_FULLSCREEN 6 /* to full screen */
+#define RTGUI_EVENT_PANEL_NORMAL 7 /* to normal screen */
+
+#define RTGUI_EVENT_WIN_CREATE 8 /* create a window */
+#define RTGUI_EVENT_WIN_DESTROY 9 /* destroy a window */
+#define RTGUI_EVENT_WIN_SHOW 10 /* show a window */
+#define RTGUI_EVENT_WIN_HIDE 11 /* hide a window */
+#define RTGUI_EVENT_WIN_ACTIVATE 12 /* activate a window */
+#define RTGUI_EVENT_WIN_DEACTIVATE 13 /* deactivate a window */
+#define RTGUI_EVENT_WIN_CLOSE 14 /* close a window */
+#define RTGUI_EVENT_WIN_MAX 15 /* max a window */
+#define RTGUI_EVENT_WIN_MIN 16 /* min a window */
+#define RTGUI_EVENT_WIN_MOVE 17 /* move a window */
+#define RTGUI_EVENT_WIN_RESIZE 18 /* resize a window */
+#define RTGUI_EVENT_UPDATE 19 /* update a rect */
+#define RTGUI_EVENT_PAINT 23 /* paint on screen */
+#define RTGUI_EVENT_TIMER 24 /* timer 0x17 */
+/* clip rect information */
+#define RTGUI_EVENT_CLIP 25 /* ��������Ϣ */
+/* mouse and keyboard event */
+#define RTGUI_EVENT_MOUSE_MOTION 26 /* ������� */
+#define RTGUI_EVENT_MOUSE_BUTTON 27 /* ����� */
+#define RTGUI_EVENT_KBD 28 /* keyboard info 0x1B*/
+/* user command event */
+#define RTGUI_EVENT_COMMAND 29 /* �û����� */
+/* widget event */
+#define RTGUI_EVENT_FOCUSED 30 /* �ؼ����� */
+#define RTGUI_EVENT_SCROLLED 31 /* scroll bar scrolled */
+#define RTGUI_EVENT_RESIZE 32 /* widget resize */
+#define RTGUI_EVENT_CURRENT_POS 33 /* ���µ�ǰ����� */
+#define RTGUI_EVENT_BACKLIGHT 34 /* Һ�������� */
+
+enum {
+ RTGUI_STATUS_OK = 0, /* status ok */
+ RTGUI_STATUS_ERROR, /* generic error */
+ RTGUI_STATUS_NRC, /* no resource */
+};
+
+struct rtgui_event
+{
+ /* the event type */
+ rt_uint16_t type;
+ /* user field of event */
+ rt_uint16_t user;
+
+ /* the event sender */
+ struct rt_thread* sender;
+
+ /* mailbox to acknowledge request */
+ struct rt_mailbox* ack;
+};
+
+#define RTGUI_EVENT(e) ((rtgui_event_t*)(e))
+
+#define RTGUI_EVENT_INIT(e, t) do \
+{ \
+ (e)->type = (t); \
+ (e)->user = 0; \
+ (e)->sender = rt_thread_self(); \
+ (e)->ack = RT_NULL; \
+} while(0)
+
+/*
+ * RTGUI Window Event
+ */
+struct rtgui_event_win
+{
+ rtgui_event_t parent;
+
+ /* the window id */
+ rtgui_win_t* wid;
+};
+
+struct rtgui_event_win_move
+{
+ rtgui_event_t parent;
+
+ /* the window id */
+ rtgui_win_t* wid;
+
+ rt_int16_t x, y;
+};
+
+struct rtgui_event_win_resize
+{
+ rtgui_event_t parent;
+
+ /* the window id */
+ rtgui_win_t* wid;
+
+ rtgui_rect_t rect;
+};
+
+/* window event init */
+#define RTGUI_EVENT_WIN_CREATE_INIT(e) RTGUI_EVENT_INIT(&((e)->parent), RTGUI_EVENT_WIN_CREATE)
+#define RTGUI_EVENT_WIN_DESTROY_INIT(e) RTGUI_EVENT_INIT(&((e)->parent), RTGUI_EVENT_WIN_DESTROY)
+#define RTGUI_EVENT_WIN_SHOW_INIT(e) RTGUI_EVENT_INIT(&((e)->parent), RTGUI_EVENT_WIN_SHOW)
+#define RTGUI_EVENT_WIN_HIDE_INIT(e) RTGUI_EVENT_INIT(&((e)->parent), RTGUI_EVENT_WIN_HIDE)
+#define RTGUI_EVENT_WIN_ACTIVATE_INIT(e) RTGUI_EVENT_INIT(&((e)->parent), RTGUI_EVENT_WIN_ACTIVATE)
+#define RTGUI_EVENT_WIN_DEACTIVATE_INIT(e) RTGUI_EVENT_INIT(&((e)->parent), RTGUI_EVENT_WIN_DEACTIVATE)
+#define RTGUI_EVENT_WIN_CLOSE_INIT(e) RTGUI_EVENT_INIT(&((e)->parent), RTGUI_EVENT_WIN_CLOSE)
+#define RTGUI_EVENT_WIN_MAX_INIT(e) RTGUI_EVENT_INIT(&((e)->parent), RTGUI_EVENT_WIN_MAX)
+#define RTGUI_EVENT_WIN_MIN_INIT(e) RTGUI_EVENT_INIT(&((e)->parent), RTGUI_EVENT_WIN_MIN)
+#define RTGUI_EVENT_WIN_MOVE_INIT(e) RTGUI_EVENT_INIT(&((e)->parent), RTGUI_EVENT_WIN_MOVE)
+#define RTGUI_EVENT_WIN_RESIZE_INIT(e) RTGUI_EVENT_INIT(&((e)->parent), RTGUI_EVENT_WIN_RESIZE)
+
+/*
+ * RTGUI Other Event
+ */
+struct rtgui_event_update
+{
+ rtgui_event_t parent;
+
+ /* the update rect */
+ rtgui_rect_t rect;
+};
+
+struct rtgui_event_monitor
+{
+ rtgui_event_t parent;
+
+ /* the monitor rect */
+ rtgui_rect_t rect;
+
+ /* under panel */
+ rtgui_panel_t* panel;
+
+ /* or under window */
+ rtgui_win_t* wid;
+};
+
+struct rtgui_event_paint
+{
+ rtgui_event_t parent;
+ rtgui_win_t* wid; /* destination window */
+ rt_bool_t bfull;//����ȫ��,���Ǹ����ӿؼ�
+};
+
+struct rtgui_event_timer
+{
+ rtgui_event_t parent;
+
+ rtgui_timer_t *timer;
+};
+
+struct rtgui_event_clip
+{
+ rtgui_event_t parent;
+ /* destination window */
+ rtgui_win_t* wid;
+ /* the number of rects */
+ rt_uint32_t num_rect;
+ /* rtgui_rect_t *rects */
+};
+#define RTGUI_EVENT_GET_RECT(e, i) &(((rtgui_rect_t*)(e + 1))[i])
+
+#define RTGUI_EVENT_UPDATE_INIT(e) RTGUI_EVENT_INIT(&((e)->parent), RTGUI_EVENT_UPDATE)
+#define RTGUI_EVENT_CLIP_INIT(e) RTGUI_EVENT_INIT(&((e)->parent), RTGUI_EVENT_CLIP)
+#define RTGUI_EVENT_PAINT_INIT(e) RTGUI_EVENT_INIT(&((e)->parent), RTGUI_EVENT_PAINT)
+#define RTGUI_EVENT_TIMER_INIT(e) RTGUI_EVENT_INIT(&((e)->parent), RTGUI_EVENT_TIMER)
+
+/*
+ * RTGUI Mouse and Keyboard Event
+ */
+struct rtgui_event_mouse
+{
+ rtgui_event_t parent;
+
+ rtgui_win_t* wid; /* destination window */
+
+ rt_uint16_t x, y;
+ rt_uint16_t button;
+};
+
+#define RTGUI_MOUSE_BUTTON_RIGHT 0x01
+#define RTGUI_MOUSE_BUTTON_LEFT 0x02
+#define RTGUI_MOUSE_BUTTON_MIDDLE 0x03
+#define RTGUI_MOUSE_BUTTON_WHEELUP 0x04
+#define RTGUI_MOUSE_BUTTON_WHEELDOWN 0x08
+
+#define RTGUI_MOUSE_BUTTON_DOWN 0x10
+#define RTGUI_MOUSE_BUTTON_UP 0x20
+
+struct rtgui_event_kbd
+{
+ rtgui_event_t parent;
+
+ rtgui_win_t* wid; /* destination window */
+
+ rt_uint16_t type; /* key down or up */
+ rt_uint16_t key; /* current key */
+ rt_uint16_t mod; /* current key modifiers */
+ rt_uint16_t unicode; /* translated character */
+};
+
+struct rtgui_event_current_pos
+{
+ rtgui_event_t parent;
+};
+
+//Һ��������
+struct rtgui_event_backlight
+{
+ rtgui_event_t parent;
+ rt_uint16_t light;
+};
+
+#define RTGUI_KBD_IS_SET_CTRL(e) ((e)->mod & (RTGUI_KMOD_LCTRL | RTGUI_KMOD_RCTRL))
+#define RTGUI_KBD_IS_SET_ALT(e) ((e)->mod & (RTGUI_KMOD_LALT | RTGUI_KMOD_RALT))
+#define RTGUI_KBD_IS_SET_SHIFT(e) ((e)->mod & (RTGUI_KMOD_LSHIFT| RTGUI_KMOD_RSHIFT))
+#define RTGUI_KBD_IS_UP(e) ((e)->type == RTGUI_KEYUP)
+#define RTGUI_KBD_IS_DOWN(e) ((e)->type == RTGUI_KEYDOWN)
+
+#define RTGUI_EVENT_MOUSE_MOTION_INIT(e) RTGUI_EVENT_INIT(&((e)->parent), RTGUI_EVENT_MOUSE_MOTION)
+#define RTGUI_EVENT_MOUSE_BUTTON_INIT(e) RTGUI_EVENT_INIT(&((e)->parent), RTGUI_EVENT_MOUSE_BUTTON)
+#define RTGUI_EVENT_KBD_INIT(e) RTGUI_EVENT_INIT(&((e)->parent), RTGUI_EVENT_KBD)
+#define RTGUI_EVENT_CURRENT_POS_INIT(e) RTGUI_EVENT_INIT(&((e)->parent), RTGUI_EVENT_CURRENT_POS)
+#define RTGUI_EVENT_BACKLIGHT_INIT(e) RTGUI_EVENT_INIT(&((e)->parent), RTGUI_EVENT_BACKLIGHT)
+
+struct rtgui_event_command
+{
+ rtgui_event_t parent;
+
+ /* command type */
+ rt_int32_t type;
+
+ /* command id */
+ rt_int32_t command;
+
+ /* command string */
+ char command_string[RTGUI_NAME_MAX];
+};
+#define RTGUI_EVENT_COMMAND_INIT(e) RTGUI_EVENT_INIT(&((e)->parent), RTGUI_EVENT_COMMAND)
+
+#define RTGUI_CMD_UNKNOWN 0x00
+#define RTGUI_CMD_WM_CLOSE 0x10
+
+#define RTGUI_CMD_USER_INT 0x20
+#define RTGUI_CMD_USER_STRING 0x21
+
+/************************************************************************/
+/* Widget Event */
+/************************************************************************/
+#define RTGUI_WIDGET_EVENT_INIT(e, t) do \
+{ \
+ (e)->type = (t); \
+ (e)->sender = RT_NULL; \
+ (e)->ack = RT_NULL; \
+} while(0)
+
+/*
+ * RTGUI Scrollbar Event
+ */
+struct rtgui_event_scrollbar
+{
+ rtgui_event_t parent;
+
+ rt_uint8_t event;
+};
+#define RTGUI_SCROLL_LINEUP 0x01
+#define RTGUI_SCROLL_LINEDOWN 0x02
+#define RTGUI_SCROLL_PAGEUP 0x03
+#define RTGUI_SCROLL_PAGEDOWN 0x04
+#define RTGUI_EVENT_SCROLLED_INIT(e) RTGUI_EVENT_INIT(&((e)->parent), RTGUI_EVENT_SCROLLED)
+
+/*
+ * RTGUI Widget Focused Event
+ */
+struct rtgui_event_focused
+{
+ rtgui_event_t parent;
+
+ rtgui_widget_t* widget;
+};
+#define RTGUI_EVENT_FOCUSED_INIT(e) RTGUI_EVENT_INIT(&((e)->parent), RTGUI_EVENT_FOCUSED)
+
+/*
+ * RTGUI Widget Resize Event
+ */
+struct rtgui_event_resize
+{
+ rtgui_event_t parent;
+ rt_int16_t x, y;
+ rt_int16_t w, h;
+};
+#define RTGUI_EVENT_RESIZE_INIT(e) RTGUI_EVENT_INIT(&((e)->parent), RTGUI_EVENT_RESIZE)
+
+#endif
+
diff --git a/components/rtgui_win/include/rtgui/filerw.h b/components/rtgui_win/include/rtgui/filerw.h
new file mode 100644
index 0000000000..95e419621f
--- /dev/null
+++ b/components/rtgui_win/include/rtgui/filerw.h
@@ -0,0 +1,48 @@
+/*
+ * File : filerw.h
+ * This file is part of RT-Thread RTOS
+ * COPYRIGHT (C) 2006 - 2009, RT-Thread Development Team
+ *
+ * The license and distribution terms for this file may be
+ * found in the file LICENSE in this distribution or at
+ * http://www.rt-thread.org/license/LICENSE
+ *
+ * Change Logs:
+ * Date Author Notes
+ * 2009-10-16 Bernard first version
+ */
+#ifndef __RTGUI_FILERW_H__
+#define __RTGUI_FILERW_H__
+
+#include <rtgui/rtgui.h>
+
+#define RTGUI_FILE_SEEK_SET 0
+#define RTGUI_FILE_SEEK_CUR 1
+#define RTGUI_FILE_SEEK_END 2
+
+typedef struct rtgui_filerw rtgui_filerw_t;
+
+struct rtgui_filerw
+{
+ int (*seek) (struct rtgui_filerw *context, rt_off_t offset, int whence);
+ int (*read) (struct rtgui_filerw *context, void *buffer, rt_size_t size, rt_size_t count);
+ int (*write)(struct rtgui_filerw *context, const void *buffer, rt_size_t size, rt_size_t count);
+ int (*tell) (struct rtgui_filerw *context);
+ int (*eof) (struct rtgui_filerw *context);
+ int (*close)(struct rtgui_filerw *context);
+};
+
+struct rtgui_filerw* rtgui_filerw_create_file(const char *filename, const char *mode);
+struct rtgui_filerw* rtgui_filerw_create_mem(const rt_uint8_t *data, rt_size_t size);
+
+int rtgui_filerw_seek (struct rtgui_filerw *context, rt_off_t offset, int whence);
+int rtgui_filerw_read (struct rtgui_filerw *context, void *buffer, rt_size_t size, rt_size_t count);
+int rtgui_filerw_write(struct rtgui_filerw *context, const void *buffer, rt_size_t size, rt_size_t count);
+int rtgui_filerw_tell (struct rtgui_filerw *context);
+int rtgui_filerw_eof (struct rtgui_filerw *context);
+int rtgui_filerw_close(struct rtgui_filerw *context);
+
+/* get memory data from filerw memory object */
+const rt_uint8_t* rtgui_filerw_mem_getdata(struct rtgui_filerw* context);
+
+#endif
diff --git a/components/rtgui_win/include/rtgui/font.h b/components/rtgui_win/include/rtgui/font.h
new file mode 100644
index 0000000000..f56de6ae4e
--- /dev/null
+++ b/components/rtgui_win/include/rtgui/font.h
@@ -0,0 +1,116 @@
+/*
+ * File : font.h
+ * This file is part of RT-Thread RTOS
+ * COPYRIGHT (C) 2006 - 2009, RT-Thread Development Team
+ *
+ * The license and distribution terms for this file may be
+ * found in the file LICENSE in this distribution or at
+ * http://www.rt-thread.org/license/LICENSE
+ *
+ * Change Logs:
+ * Date Author Notes
+ * 2009-10-16 Bernard first version
+ */
+#ifndef __RTGUI_FONT_H__
+#define __RTGUI_FONT_H__
+
+#include <rtgui/rtgui.h>
+#include <rtgui/list.h>
+
+extern rtgui_font_t rtgui_font_asc12,rtgui_font_asc16,font_dotum;
+
+struct rtgui_font_engine
+{
+ /* font engine function */
+ void (*font_init)(rtgui_font_t* font);
+ void (*font_load)(rtgui_font_t* font);
+
+ void (*font_draw_text)(rtgui_font_t* font, rtgui_dc_t *dc, const char* text, rt_uint32_t len, rtgui_rect_t* rect);
+ void (*font_get_metrics)(rtgui_font_t* font, const char* text, rtgui_rect_t* rect);
+};
+
+/*
+ * bitmap font engine
+ */
+/* bitmap font private data */
+struct rtgui_font_bitmap
+{
+ /* bitmap data */
+ const rt_uint8_t* bmp;
+ const rt_uint8_t* char_width; /* each character width, NULL for fixed font */
+ const rt_uint32_t* offset; /* offset for each character */
+
+ rt_uint16_t width;
+ rt_uint16_t height;
+
+ rt_uint8_t first_char;
+ rt_uint8_t last_char;
+};
+extern const struct rtgui_font_engine bmp_font_engine;
+
+#include <rtgui/tree.h>
+SPLAY_HEAD(cache_tree, hz_cache);
+struct hz_cache
+{
+ SPLAY_ENTRY(hz_cache) hz_node;
+
+ rt_uint16_t hz_id;
+};
+
+struct rtgui_hz_file_font
+{
+ struct cache_tree cache_root;
+ rt_uint16_t cache_size;
+
+ /* font size */
+ rt_uint16_t font_size;
+ rt_uint16_t font_data_size;
+
+ /* file descriptor */
+ int fd;
+
+ /* font file name */
+ const char* font_fn;
+};
+extern struct rtgui_font_engine rtgui_hz_file_font_engine;
+
+struct rtgui_font
+{
+ /* font name */
+ char* family;
+
+ /* font height */
+ rt_uint16_t height;
+
+ /* refer count */
+ rt_uint32_t refer_count;
+
+ /* font engine */
+ const struct rtgui_font_engine* engine;
+
+ /* font private data */
+ void* data;
+
+ /* the font list */
+ rtgui_list_t list;
+};
+typedef struct rtgui_font rtgui_font_t;
+
+void rtgui_font_system_init(void);
+void rtgui_font_system_add_font(rtgui_font_t* font);
+void rtgui_font_system_remove_font(rtgui_font_t* font);
+rtgui_font_t* rtgui_font_default(void);
+void rtgui_font_set_defaut(rtgui_font_t* font);
+
+rtgui_font_t* rtgui_font_refer(const rt_uint8_t* family, rt_uint16_t height);
+void rtgui_font_derefer(rtgui_font_t* font);
+
+/* draw a text */
+void rtgui_font_draw(rtgui_font_t* font, rtgui_dc_t *dc, const char* text, rt_uint32_t len, rtgui_rect_t* rect);
+int rtgui_font_get_string_width(rtgui_font_t* font, const char* text);//ȡ���ַ����Ŀ���
+int rtgui_font_get_font_width(rtgui_font_t* font); //ȡ������Ŀ���
+int rtgui_font_get_font_height(rtgui_font_t* font);//ȡ������ĸ߶�
+void rtgui_font_get_string_rect(rtgui_font_t* font, const char* text, rtgui_rect_t* rect);//ȡ���ַ����ľ�������
+void rtgui_font_get_metrics(struct rtgui_font* font, const char* text, rtgui_rect_t* rect);
+
+#endif
diff --git a/components/rtgui_win/include/rtgui/image.h b/components/rtgui_win/include/rtgui/image.h
new file mode 100644
index 0000000000..8a2611cd87
--- /dev/null
+++ b/components/rtgui_win/include/rtgui/image.h
@@ -0,0 +1,78 @@
+/*
+ * File : image.h
+ * This file is part of RT-Thread RTOS
+ * COPYRIGHT (C) 2006 - 2009, RT-Thread Development Team
+ *
+ * The license and distribution terms for this file may be
+ * found in the file LICENSE in this distribution or at
+ * http://www.rt-thread.org/license/LICENSE
+ *
+ * Change Logs:
+ * Date Author Notes
+ * 2009-10-16 Bernard first version
+ */
+#ifndef __RTGUI_IMAGE_H__
+#define __RTGUI_IMAGE_H__
+
+#include <rtgui/list.h>
+#include <rtgui/dc.h>
+#include <rtgui/driver.h>
+#include <rtgui/color.h>
+#include <rtgui/filerw.h>
+#include <rtgui/region.h>
+
+typedef struct rtgui_image rtgui_image_t;
+
+struct rtgui_image_engine
+{
+ const char* name; //��������,ͼ������
+ rtgui_list_t list;
+
+ /* image engine function */
+ rt_bool_t (*image_check)(struct rtgui_filerw* file);
+
+ rt_bool_t (*image_load)(rtgui_image_t* image, struct rtgui_filerw* file, rt_bool_t load);
+ void (*image_unload)(rtgui_image_t* image);
+
+ void (*image_blit)(rtgui_image_t *image, rtgui_dc_t *dc, rtgui_rect_t *rect);
+ void (*image_paste)(rtgui_image_t *image, rtgui_dc_t *dc, rtgui_rect_t *rect, rtgui_color_t shield_color);
+};
+
+struct rtgui_image_palette
+{
+ rtgui_color_t* colors;
+ rt_uint32_t ncolors;
+};
+typedef struct rtgui_image_palette rtgui_image_palette_t;
+
+struct rtgui_image
+{
+ /* image metricsͼ��Ĵ�С */
+ rt_uint16_t w, h;
+
+ /* image engine ͼ������ */
+ const struct rtgui_image_engine* engine;
+
+ /* image palette */
+ rtgui_image_palette_t* palette;
+
+ /* image private data ͼ��˽������ */
+ void* data;
+};
+
+/* init rtgui image system */
+void rtgui_system_image_init(void);
+
+rtgui_image_t* rtgui_image_create_from_file(const char* type, const char* filename, rt_bool_t load);
+rtgui_image_t* rtgui_image_create_from_mem(const char* type, const rt_uint8_t* data, rt_size_t length, rt_bool_t load);
+void rtgui_image_destroy(rtgui_image_t* image);
+
+/* register an image engine */
+void rtgui_image_register_engine(struct rtgui_image_engine* engine);
+
+/* blit an image */
+void rtgui_image_blit(rtgui_image_t* image, rtgui_dc_t *dc, rtgui_rect_t* rect);
+void rtgui_image_paste(rtgui_image_t *image, rtgui_dc_t *dc, rtgui_rect_t *rect, rtgui_color_t shield_color);
+struct rtgui_image_palette* rtgui_image_palette_create(rt_uint32_t ncolors);
+
+#endif
diff --git a/components/rtgui_win/include/rtgui/image_bmp.h b/components/rtgui_win/include/rtgui/image_bmp.h
new file mode 100644
index 0000000000..1dbcccff90
--- /dev/null
+++ b/components/rtgui_win/include/rtgui/image_bmp.h
@@ -0,0 +1,19 @@
+/*
+ * File : image_bmp.h
+ * This file is part of RT-Thread RTOS
+ * COPYRIGHT (C) 2006 - 2009, RT-Thread Development Team
+ *
+ * The license and distribution terms for this file may be
+ * found in the file LICENSE in this distribution or at
+ * http://www.rt-thread.org/license/LICENSE
+ *
+ * Change Logs:
+ * Date Author Notes
+ * 2010-08-10 Bernard first version
+ */
+#ifndef __RTGUI_IMAGE_BMP_H__
+#define __RTGUI_IMAGE_BMP_H__
+
+void rtgui_image_bmp_init(void);
+
+#endif
diff --git a/components/rtgui_win/include/rtgui/image_hdc.h b/components/rtgui_win/include/rtgui/image_hdc.h
new file mode 100644
index 0000000000..aa91609058
--- /dev/null
+++ b/components/rtgui_win/include/rtgui/image_hdc.h
@@ -0,0 +1,37 @@
+/*
+ * File : image_xpm.h
+ * This file is part of RT-Thread RTOS
+ * COPYRIGHT (C) 2006 - 2009, RT-Thread Development Team
+ *
+ * The license and distribution terms for this file may be
+ * found in the file LICENSE in this distribution or at
+ * http://www.rt-thread.org/license/LICENSE
+ *
+ * Change Logs:
+ * Date Author Notes
+ * 2009-10-16 Bernard first version
+ */
+#ifndef __RTGUI_IMAGE_HDC_H__
+#define __RTGUI_IMAGE_HDC_H__
+
+#include <rtgui/image.h>
+
+struct rtgui_image_hdcmm
+{
+ rtgui_image_t parent;
+
+ /* hdc image information */
+ rt_uint16_t byte_per_pixel;
+ rt_uint16_t pitch;
+
+ rt_uint8_t *pixels;
+};
+
+void rtgui_image_hdc_init(void);
+extern const struct rtgui_image_engine rtgui_image_hdcmm_engine;
+
+#define HDC_HEADER_SIZE (5 * 4)
+#define RTGUI_IMAGE_HDC_DEF(bpp, w, h, pixels) \
+ {{w, h, &rtgui_image_hdcmm_engine, RT_NULL}, bpp, (bpp * w), ((rt_uint8_t*)pixels + HDC_HEADER_SIZE)}
+
+#endif
diff --git a/components/rtgui_win/include/rtgui/image_jpeg.h b/components/rtgui_win/include/rtgui/image_jpeg.h
new file mode 100644
index 0000000000..d89d1ed290
--- /dev/null
+++ b/components/rtgui_win/include/rtgui/image_jpeg.h
@@ -0,0 +1,8 @@
+#ifndef __RTGUI_IMAGE_JPEG_H__
+#define __RTGUI_IMAGE_JPEG_H__
+
+#include <image.h>
+
+void rtgui_image_jpeg_init(void);
+
+#endif
diff --git a/components/rtgui_win/include/rtgui/image_png.h b/components/rtgui_win/include/rtgui/image_png.h
new file mode 100644
index 0000000000..5722e72e97
--- /dev/null
+++ b/components/rtgui_win/include/rtgui/image_png.h
@@ -0,0 +1,21 @@
+/*
+ * File : image_png.h
+ * This file is part of RT-Thread RTOS
+ * COPYRIGHT (C) 2006 - 2009, RT-Thread Development Team
+ *
+ * The license and distribution terms for this file may be
+ * found in the file LICENSE in this distribution or at
+ * http://www.rt-thread.org/license/LICENSE
+ *
+ * Change Logs:
+ * Date Author Notes
+ * 2009-10-16 Bernard first version
+ */
+#ifndef __RTGUI_IMAGE_PNG_H__
+#define __RTGUI_IMAGE_PNG_H__
+
+#include <image.h>
+
+void rtgui_image_png_init(void);
+
+#endif
diff --git a/components/rtgui_win/include/rtgui/image_xpm.h b/components/rtgui_win/include/rtgui/image_xpm.h
new file mode 100644
index 0000000000..e580327f6d
--- /dev/null
+++ b/components/rtgui_win/include/rtgui/image_xpm.h
@@ -0,0 +1,21 @@
+/*
+ * File : image_xpm.h
+ * This file is part of RT-Thread RTOS
+ * COPYRIGHT (C) 2006 - 2009, RT-Thread Development Team
+ *
+ * The license and distribution terms for this file may be
+ * found in the file LICENSE in this distribution or at
+ * http://www.rt-thread.org/license/LICENSE
+ *
+ * Change Logs:
+ * Date Author Notes
+ * 2009-10-16 Bernard first version
+ */
+#ifndef __RTGUI_IMAGE_XPM_H__
+#define __RTGUI_IMAGE_XPM_H__
+
+#include <rtgui/image.h>
+
+void rtgui_image_xpm_init(void);
+
+#endif
diff --git a/components/rtgui_win/include/rtgui/kbddef.h b/components/rtgui_win/include/rtgui/kbddef.h
new file mode 100644
index 0000000000..650e67314d
--- /dev/null
+++ b/components/rtgui_win/include/rtgui/kbddef.h
@@ -0,0 +1,293 @@
+/*
+ * File : kbddef.h
+ * This file is part of RT-Thread RTOS
+ * COPYRIGHT (C) 2006 - 2009, RT-Thread Development Team
+ *
+ * The license and distribution terms for this file may be
+ * found in the file LICENSE in this distribution or at
+ * http://www.rt-thread.org/license/LICENSE
+ *
+ * Change Logs:
+ * Date Author Notes
+ * 2009-10-16 Bernard first version
+ */
+#ifndef __KBD_DEF_H__
+#define __KBD_DEF_H__
+
+/* The keyboard key have been cleverly chosen to map to ASCII */
+typedef enum
+{
+ RTGUIK_UNKNOWN = 0,
+ RTGUIK_FIRST = 0,
+ RTGUIK_BACKSPACE = 8,
+ RTGUIK_TAB = 9,
+ RTGUIK_CLEAR = 12,
+ RTGUIK_RETURN = 13,
+ RTGUIK_PAUSE = 19,
+ RTGUIK_ESCAPE = 27,
+ RTGUIK_SPACE = 32,
+ RTGUIK_EXCLAIM = 33,
+ RTGUIK_QUOTEDBL = 34,
+ RTGUIK_HASH = 35,
+ RTGUIK_DOLLAR = 36,
+ RTGUIK_AMPERSAND = 38,
+ RTGUIK_QUOTE = 39,
+ RTGUIK_LEFTPAREN = 40,
+ RTGUIK_RIGHTPAREN = 41,
+ RTGUIK_ASTERISK = 42,
+ RTGUIK_PLUS = 43,
+ RTGUIK_COMMA = 44,
+ RTGUIK_MINUS = 45,
+ RTGUIK_PERIOD = 46,
+ RTGUIK_SLASH = 47,
+ RTGUIK_0 = 48,
+ RTGUIK_1 = 49,
+ RTGUIK_2 = 50,
+ RTGUIK_3 = 51,
+ RTGUIK_4 = 52,
+ RTGUIK_5 = 53,
+ RTGUIK_6 = 54,
+ RTGUIK_7 = 55,
+ RTGUIK_8 = 56,
+ RTGUIK_9 = 57,
+ RTGUIK_COLON = 58,
+ RTGUIK_SEMICOLON = 59,
+ RTGUIK_LESS = 60,
+ RTGUIK_EQUALS = 61,
+ RTGUIK_GREATER = 62,
+ RTGUIK_QUESTION = 63,
+ RTGUIK_AT = 64,
+
+ /*
+ Skip uppercase letters
+ */
+ RTGUIK_LEFTBRACKET = 91,
+ RTGUIK_BACKSLASH = 92,
+ RTGUIK_RIGHTBRACKET = 93,
+ RTGUIK_CARET = 94,
+ RTGUIK_UNDERSCORE = 95,
+ RTGUIK_BACKQUOTE = 96,
+ RTGUIK_a = 97,
+ RTGUIK_b = 98,
+ RTGUIK_c = 99,
+ RTGUIK_d = 100,
+ RTGUIK_e = 101,
+ RTGUIK_f = 102,
+ RTGUIK_g = 103,
+ RTGUIK_h = 104,
+ RTGUIK_i = 105,
+ RTGUIK_j = 106,
+ RTGUIK_k = 107,
+ RTGUIK_l = 108,
+ RTGUIK_m = 109,
+ RTGUIK_n = 110,
+ RTGUIK_o = 111,
+ RTGUIK_p = 112,
+ RTGUIK_q = 113,
+ RTGUIK_r = 114,
+ RTGUIK_s = 115,
+ RTGUIK_t = 116,
+ RTGUIK_u = 117,
+ RTGUIK_v = 118,
+ RTGUIK_w = 119,
+ RTGUIK_x = 120,
+ RTGUIK_y = 121,
+ RTGUIK_z = 122,
+ RTGUIK_DELETE = 127,
+
+ /* International keyboard */
+ RTGUIK_WORLD_0 = 160, /* 0xA0 */
+ RTGUIK_WORLD_1 = 161,
+ RTGUIK_WORLD_2 = 162,
+ RTGUIK_WORLD_3 = 163,
+ RTGUIK_WORLD_4 = 164,
+ RTGUIK_WORLD_5 = 165,
+ RTGUIK_WORLD_6 = 166,
+ RTGUIK_WORLD_7 = 167,
+ RTGUIK_WORLD_8 = 168,
+ RTGUIK_WORLD_9 = 169,
+ RTGUIK_WORLD_10 = 170,
+ RTGUIK_WORLD_11 = 171,
+ RTGUIK_WORLD_12 = 172,
+ RTGUIK_WORLD_13 = 173,
+ RTGUIK_WORLD_14 = 174,
+ RTGUIK_WORLD_15 = 175,
+ RTGUIK_WORLD_16 = 176,
+ RTGUIK_WORLD_17 = 177,
+ RTGUIK_WORLD_18 = 178,
+ RTGUIK_WORLD_19 = 179,
+ RTGUIK_WORLD_20 = 180,
+ RTGUIK_WORLD_21 = 181,
+ RTGUIK_WORLD_22 = 182,
+ RTGUIK_WORLD_23 = 183,
+ RTGUIK_WORLD_24 = 184,
+ RTGUIK_WORLD_25 = 185,
+ RTGUIK_WORLD_26 = 186,
+ RTGUIK_WORLD_27 = 187,
+ RTGUIK_WORLD_28 = 188,
+ RTGUIK_WORLD_29 = 189,
+ RTGUIK_WORLD_30 = 190,
+ RTGUIK_WORLD_31 = 191,
+ RTGUIK_WORLD_32 = 192,
+ RTGUIK_WORLD_33 = 193,
+ RTGUIK_WORLD_34 = 194,
+ RTGUIK_WORLD_35 = 195,
+ RTGUIK_WORLD_36 = 196,
+ RTGUIK_WORLD_37 = 197,
+ RTGUIK_WORLD_38 = 198,
+ RTGUIK_WORLD_39 = 199,
+ RTGUIK_WORLD_40 = 200,
+ RTGUIK_WORLD_41 = 201,
+ RTGUIK_WORLD_42 = 202,
+ RTGUIK_WORLD_43 = 203,
+ RTGUIK_WORLD_44 = 204,
+ RTGUIK_WORLD_45 = 205,
+ RTGUIK_WORLD_46 = 206,
+ RTGUIK_WORLD_47 = 207,
+ RTGUIK_WORLD_48 = 208,
+ RTGUIK_WORLD_49 = 209,
+ RTGUIK_WORLD_50 = 210,
+ RTGUIK_WORLD_51 = 211,
+ RTGUIK_WORLD_52 = 212,
+ RTGUIK_WORLD_53 = 213,
+ RTGUIK_WORLD_54 = 214,
+ RTGUIK_WORLD_55 = 215,
+ RTGUIK_WORLD_56 = 216,
+ RTGUIK_WORLD_57 = 217,
+ RTGUIK_WORLD_58 = 218,
+ RTGUIK_WORLD_59 = 219,
+ RTGUIK_WORLD_60 = 220,
+ RTGUIK_WORLD_61 = 221,
+ RTGUIK_WORLD_62 = 222,
+ RTGUIK_WORLD_63 = 223,
+ RTGUIK_WORLD_64 = 224,
+ RTGUIK_WORLD_65 = 225,
+ RTGUIK_WORLD_66 = 226,
+ RTGUIK_WORLD_67 = 227,
+ RTGUIK_WORLD_68 = 228,
+ RTGUIK_WORLD_69 = 229,
+ RTGUIK_WORLD_70 = 230,
+ RTGUIK_WORLD_71 = 231,
+ RTGUIK_WORLD_72 = 232,
+ RTGUIK_WORLD_73 = 233,
+ RTGUIK_WORLD_74 = 234,
+ RTGUIK_WORLD_75 = 235,
+ RTGUIK_WORLD_76 = 236,
+ RTGUIK_WORLD_77 = 237,
+ RTGUIK_WORLD_78 = 238,
+ RTGUIK_WORLD_79 = 239,
+ RTGUIK_WORLD_80 = 240,
+ RTGUIK_WORLD_81 = 241,
+ RTGUIK_WORLD_82 = 242,
+ RTGUIK_WORLD_83 = 243,
+ RTGUIK_WORLD_84 = 244,
+ RTGUIK_WORLD_85 = 245,
+ RTGUIK_WORLD_86 = 246,
+ RTGUIK_WORLD_87 = 247,
+ RTGUIK_WORLD_88 = 248,
+ RTGUIK_WORLD_89 = 249,
+ RTGUIK_WORLD_90 = 250,
+ RTGUIK_WORLD_91 = 251,
+ RTGUIK_WORLD_92 = 252,
+ RTGUIK_WORLD_93 = 253,
+ RTGUIK_WORLD_94 = 254,
+ RTGUIK_WORLD_95 = 255, /* 0xFF */
+
+ /* Numeric keypad */
+ RTGUIK_KP0 = 256,
+ RTGUIK_KP1 = 257,
+ RTGUIK_KP2 = 258,
+ RTGUIK_KP3 = 259,
+ RTGUIK_KP4 = 260,
+ RTGUIK_KP5 = 261,
+ RTGUIK_KP6 = 262,
+ RTGUIK_KP7 = 263,
+ RTGUIK_KP8 = 264,
+ RTGUIK_KP9 = 265,
+ RTGUIK_KP_PERIOD = 266,
+ RTGUIK_KP_DIVIDE = 267, /* ��/ */
+ RTGUIK_KP_MULTIPLY = 268, /* ��* */
+ RTGUIK_KP_MINUS = 269, /* ��- */
+ RTGUIK_KP_PLUS = 270, /* ��+ */
+ RTGUIK_KP_ENTER = 271,
+ RTGUIK_KP_EQUALS = 272, /* ����= */
+
+ /* Arrows + Home/End pad */
+ RTGUIK_UP = 273,
+ RTGUIK_DOWN = 274,
+ RTGUIK_RIGHT = 275,
+ RTGUIK_LEFT = 276,
+ RTGUIK_INSERT = 277,
+ RTGUIK_HOME = 278,
+ RTGUIK_END = 279,
+ RTGUIK_PAGEUP = 280,
+ RTGUIK_PAGEDOWN = 281,
+
+ /* Function keys */
+ RTGUIK_F1 = 282,
+ RTGUIK_F2 = 283,
+ RTGUIK_F3 = 284,
+ RTGUIK_F4 = 285,
+ RTGUIK_F5 = 286,
+ RTGUIK_F6 = 287,
+ RTGUIK_F7 = 288,
+ RTGUIK_F8 = 289,
+ RTGUIK_F9 = 290,
+ RTGUIK_F10 = 291,
+ RTGUIK_F11 = 292,
+ RTGUIK_F12 = 293,
+ RTGUIK_F13 = 294,
+ RTGUIK_F14 = 295,
+ RTGUIK_F15 = 296,
+
+ /* Key state modifier keys */
+ RTGUIK_NUMLOCK = 300,
+ RTGUIK_CAPSLOCK = 301,
+ RTGUIK_SCROLLOCK = 302,
+ RTGUIK_RSHIFT = 303,
+ RTGUIK_LSHIFT = 304,
+ RTGUIK_RCTRL = 305,
+ RTGUIK_LCTRL = 306,
+ RTGUIK_RALT = 307,
+ RTGUIK_LALT = 308,
+ RTGUIK_RMETA = 309,
+ RTGUIK_LMETA = 310,
+ RTGUIK_LSUPER = 311, /* Left "Windows" key */
+ RTGUIK_RSUPER = 312, /* Right "Windows" key */
+ RTGUIK_MODE = 313, /* "Alt Gr" key */
+ RTGUIK_COMPOSE = 314, /* Multi-key compose key */
+
+ /* Miscellaneous function keys */
+ RTGUIK_HELP = 315,
+ RTGUIK_PRINT = 316,
+ RTGUIK_SYSREQ = 317,
+ RTGUIK_BREAK = 318,
+ RTGUIK_MENU = 319,
+ RTGUIK_POWER = 320, /* Power key */
+
+ RTGUIK_LAST
+} RTGUI_KBD_KEY;
+
+/* Enumeration of valid key mods (possibly OR'd together) */
+typedef enum {
+ RTGUI_KMOD_NONE = 0x0000,
+ RTGUI_KMOD_LSHIFT = 0x0001,
+ RTGUI_KMOD_RSHIFT = 0x0002,
+ RTGUI_KMOD_LCTRL = 0x0040,
+ RTGUI_KMOD_RCTRL = 0x0080,
+ RTGUI_KMOD_LALT = 0x0100,
+ RTGUI_KMOD_RALT = 0x0200,
+ RTGUI_KMOD_LMETA = 0x0400,
+ RTGUI_KMOD_RMETA = 0x0800,
+ RTGUI_KMOD_NUM = 0x1000,
+ RTGUI_KMOD_CAPS = 0x2000,
+ RTGUI_KMOD_MODE = 0x4000,
+ RTGUI_KMOD_RESERVED = 0x8000
+} RTGUI_KBD_MOD;
+
+typedef enum {
+ RTGUI_KEYDOWN, /* Keys pressed */
+ RTGUI_KEYUP, /* Keys released */
+} RTGUI_KBD_TYPE;
+
+#endif
diff --git a/components/rtgui_win/include/rtgui/list.h b/components/rtgui_win/include/rtgui/list.h
new file mode 100644
index 0000000000..eb8afb62ea
--- /dev/null
+++ b/components/rtgui_win/include/rtgui/list.h
@@ -0,0 +1,66 @@
+/*
+ * File : list.h
+ * This file is part of RT-Thread RTOS
+ * COPYRIGHT (C) 2006 - 2009, RT-Thread Development Team
+ *
+ * The license and distribution terms for this file may be
+ * found in the file LICENSE in this distribution or at
+ * http://www.rt-thread.org/license/LICENSE
+ *
+ * Change Logs:
+ * Date Author Notes
+ * 2009-10-16 Bernard first version
+ */
+#ifndef __RTGUI_LIST_H__
+#define __RTGUI_LIST_H__
+
+#include <rtgui/rtgui.h>
+
+typedef struct rtgui_list_node rtgui_list_t;/* (template),ע����CCList������ */
+
+struct rtgui_list_node
+{
+ rtgui_list_t* next;
+};
+rt_inline void rtgui_list_init(rtgui_list_t *l)
+{
+ l->next = (rtgui_list_t *)0;
+}
+
+rt_inline void rtgui_list_append(rtgui_list_t *l, rtgui_list_t *n)
+{
+ rtgui_list_t* node;
+
+ node = l;
+ while(node->next) node = node->next;
+
+ /* append the node to the tail */
+ node->next = n;
+ n->next = (rtgui_list_t*) 0;
+}
+
+rt_inline void list_insert(rtgui_list_t *l, rtgui_list_t *n)
+{
+ n->next = l->next;
+ l->next = n;
+}
+
+rt_inline rtgui_list_t* rtgui_list_remove(rtgui_list_t *l, rtgui_list_t *n)
+{
+ /* remove slist head */
+ rtgui_list_t* node = l;
+ while(node->next && node->next != n) node = node->next;
+
+ /* remove node */
+ if(node->next != (rtgui_list_t *)0) node->next = node->next->next;
+
+ return l;
+}
+
+#define rtgui_list_entry(node, type, member) \
+ ((type *)((char*)(node)-(unsigned long)(&((type *)0)->member)))
+
+#define rtgui_list_foreach(node, list) \
+ for((node) = (list)->next; (node) != RT_NULL; (node) = (node)->next)
+
+#endif
diff --git a/components/rtgui_win/include/rtgui/region.h b/components/rtgui_win/include/rtgui/region.h
new file mode 100644
index 0000000000..8cd14eb83b
--- /dev/null
+++ b/components/rtgui_win/include/rtgui/region.h
@@ -0,0 +1,101 @@
+/*
+ * File : region.h
+ * This file is part of RT-Thread RTOS
+ * COPYRIGHT (C) 2006 - 2009, RT-Thread Development Team
+ *
+ * The license and distribution terms for this file may be
+ * found in the file LICENSE in this distribution or at
+ * http://www.rt-thread.org/license/LICENSE
+ *
+ * Change Logs:
+ * Date Author Notes
+ * 2009-10-16 Bernard first version
+ */
+#ifndef __RTGUI_REGION_H__
+#define __RTGUI_REGION_H__
+
+#include <rtgui/rtgui.h>
+
+#if defined(__cplusplus) || defined(c_plusplus)
+extern "C" {
+#endif
+
+typedef struct rtgui_region_data rtgui_region_data_t;
+
+struct rtgui_region_data
+{
+ rt_uint32_t size;
+ rt_uint32_t numRects;
+ /* XXX: And why, exactly, do we have this bogus struct definition? */
+ /* rtgui_rect_t rects[size]; in memory but not explicitly declared */
+};
+
+typedef struct rtgui_region
+{
+ rtgui_rect_t extents;
+ rtgui_region_data_t *data;
+}rtgui_region_t;
+
+typedef enum
+{
+ RTGUI_REGION_STATUS_FAILURE,
+ RTGUI_REGION_STATUS_SUCCESS
+}rtgui_region_status_t;
+
+/* creation/destruction */
+
+void rtgui_region_init(rtgui_region_t *region);
+void rtgui_region_init_rect(rtgui_region_t *region, int x, int y, unsigned int width, unsigned int height);
+void rtgui_region_init_with_extents(rtgui_region_t *region, const rtgui_rect_t *extents);
+void rtgui_region_fini (rtgui_region_t *region);
+
+void rtgui_region_translate (rtgui_region_t *region, int x, int y);
+
+rtgui_region_status_t rtgui_region_copy (rtgui_region_t *dest, rtgui_region_t *source);
+
+rtgui_region_status_t rtgui_region_intersect (rtgui_region_t *newReg, rtgui_region_t *reg1, rtgui_region_t *reg2);
+rtgui_region_status_t rtgui_region_intersect_rect (rtgui_region_t *newReg, rtgui_region_t *reg1, rtgui_rect_t *rect);
+rtgui_region_status_t rtgui_region_union (rtgui_region_t *newReg, rtgui_region_t *reg1, rtgui_region_t *reg2);
+rtgui_region_status_t rtgui_region_union_rect(rtgui_region_t *dest, rtgui_region_t *source, rtgui_rect_t* rect);
+rtgui_region_status_t rtgui_region_subtract (rtgui_region_t *regD, rtgui_region_t *regM, rtgui_region_t *regS);
+rtgui_region_status_t rtgui_region_subtract_rect (rtgui_region_t *regD, rtgui_region_t *regM, rtgui_rect_t* rect);
+rtgui_region_status_t rtgui_region_inverse (rtgui_region_t *newReg, rtgui_region_t *reg1, rtgui_rect_t *invRect);
+
+int rtgui_region_num_rects (rtgui_region_t *region);
+
+rtgui_rect_t* rtgui_region_rects (rtgui_region_t *region);
+
+#define RTGUI_REGION_OUT 0
+#define RTGUI_REGION_IN 1
+#define RTGUI_REGION_PART 2
+
+int rtgui_region_contains_point (rtgui_region_t *region, int x, int y, rtgui_rect_t *box);
+int rtgui_region_contains_rectangle (rtgui_region_t *rtgui_region_t, rtgui_rect_t *prect);
+
+int rtgui_region_not_empty (rtgui_region_t *region);
+rtgui_rect_t *rtgui_region_extents (rtgui_region_t *region);
+
+rtgui_region_status_t rtgui_region_append (rtgui_region_t *dest, rtgui_region_t *region);
+rtgui_region_status_t rtgui_region_validate (rtgui_region_t *badreg, int *pOverlap);
+
+void rtgui_region_reset(rtgui_region_t *region, rtgui_rect_t* rect);
+void rtgui_region_empty (rtgui_region_t *region);
+void rtgui_region_dump(rtgui_region_t* region);
+int rtgui_region_is_flat(rtgui_region_t* region);
+
+/* rect functions */
+extern rtgui_rect_t rtgui_empty_rect;
+
+void rtgui_rect_moveto(rtgui_rect_t *rect, int x, int y);
+void rtgui_rect_moveto_align(rtgui_rect_t *rect, rtgui_rect_t *to, int align);
+void rtgui_rect_inflate(rtgui_rect_t *rect, int d);
+void rtgui_rect_intersect(rtgui_rect_t *src, rtgui_rect_t *dest);
+int rtgui_rect_contains_point(const rtgui_rect_t *rect, int x, int y);
+int rtgui_rect_is_intersect(const rtgui_rect_t *rect1, const rtgui_rect_t *rect2);
+int rtgui_rect_is_equal(const rtgui_rect_t *rect1, const rtgui_rect_t *rect2);
+
+#if defined(__cplusplus) || defined(c_plusplus)
+}
+#endif
+
+#endif /* _PIXMAN_H_ */
diff --git a/components/rtgui_win/include/rtgui/rtgui.h b/components/rtgui_win/include/rtgui/rtgui.h
new file mode 100644
index 0000000000..f68954bd7d
--- /dev/null
+++ b/components/rtgui_win/include/rtgui/rtgui.h
@@ -0,0 +1,154 @@
+/*
+ * File : rtgui.h
+ * This file is part of RTGUI in RT-Thread RTOS
+ * COPYRIGHT (C) 2006 - 2009, RT-Thread Development Team
+ *
+ * The license and distribution terms for this file may be
+ * found in the file LICENSE in this distribution or at
+ * http://www.rt-thread.org/license/LICENSE
+ *
+ * Change Logs:
+ * Date Author Notes
+ * 2009-10-04 Bernard first version
+ */
+#ifndef __RT_GUI_H__
+#define __RT_GUI_H__
+
+#include <rtthread.h>
+#include <rtgui/rtgui_config.h>
+#include <string.h>
+
+#define RT_INT16_MAX 32767
+#define RT_INT16_MIN (-RT_INT16_MAX-1)
+
+#define SELECTED_HEIGHT 20 //��ѡ���еĸ߶�
+
+#define RT_COUNT(array) sizeof(array)/sizeof(array[0])
+
+/* Use new name & namespace */
+typedef struct rtgui_point rtgui_point_t;
+typedef struct rtgui_rect rtgui_rect_t;
+typedef rt_uint32_t rtgui_color_t;
+typedef struct rtgui_event rtgui_event_t;
+typedef struct rtgui_font rtgui_font_t;
+typedef struct rtgui_dc rtgui_dc_t;
+typedef struct rtgui_gc rtgui_gc_t;
+
+typedef void* PVOID;
+typedef struct rtgui_type rtgui_type_t;
+typedef struct rtgui_object rtgui_object_t;
+typedef struct rtgui_widget rtgui_widget_t;
+typedef struct rtgui_panel rtgui_panel_t;
+typedef struct rtgui_container rtgui_container_t;
+typedef struct rtgui_win rtgui_win_t;
+typedef struct rtgui_staticline rtgui_staticline_t;
+typedef struct rtgui_label rtgui_label_t;
+typedef struct rtgui_textbox rtgui_textbox_t;
+typedef struct rtgui_button rtgui_button_t;
+typedef struct rtgui_view rtgui_view_t;
+typedef struct rtgui_checkbox rtgui_checkbox_t;
+typedef struct rtgui_radiobox rtgui_radiobox_t;
+typedef struct rtgui_listbox rtgui_listbox_t;
+typedef struct rtgui_list_view rtgui_list_view_t;
+typedef struct rtgui_fileview rtgui_filelist_view_t;
+typedef struct rtgui_scrollbar rtgui_scrollbar_t;
+typedef struct rtgui_iconbox rtgui_iconbox_t;
+typedef struct rtgui_menu_item rtgui_menu_item_t;
+typedef struct rtgui_menu rtgui_menu_t;
+typedef struct rtgui_combo rtgui_combo_t;
+
+
+typedef rt_bool_t (*rtgui_event_handler_ptr)(PVOID wdt, rtgui_event_t* event);
+
+struct rtgui_point
+{
+ rt_int16_t x, y;
+};
+
+struct rtgui_rect
+{
+ rt_int16_t x1, y1, x2, y2;
+};
+
+extern rtgui_point_t rtgui_empty_point;
+
+#define rtgui_rect_width(r) ((r).x2 - (r).x1)
+#define rtgui_rect_height(r) ((r).y2 - (r).y1)
+
+struct rtgui_gc
+{
+ /* foreground and background color */
+ rtgui_color_t foreground, background;
+
+ /* text style */
+ rt_uint16_t textstyle;
+ /* text align */
+ rt_uint16_t textalign;
+
+ /* font */
+ struct rtgui_font* font;
+};
+
+enum RTGUI_MARGIN_STYLE
+{
+ RTGUI_MARGIN_LEFT = 0x01,
+ RTGUI_MARGIN_RIGHT = 0x02,
+ RTGUI_MARGIN_TOP = 0x04,
+ RTGUI_MARGIN_BOTTOM = 0x08,
+ RTGUI_MARGIN_ALL = (RTGUI_MARGIN_LEFT | RTGUI_MARGIN_RIGHT | RTGUI_MARGIN_TOP | RTGUI_MARGIN_BOTTOM)
+};
+
+enum RTGUI_BORDER_STYLE
+{
+ RTGUI_BORDER_NONE = 0,
+ RTGUI_BORDER_SIMPLE,
+ RTGUI_BORDER_RAISE,
+ RTGUI_BORDER_SUNKEN,
+ RTGUI_BORDER_BOX,
+ RTGUI_BORDER_STATIC,
+ RTGUI_BORDER_EXTRA,
+ RTGUI_BORDER_UP,
+ RTGUI_BORDER_DOWN
+};
+
+#define RTGUI_BORDER_DEFAULT_WIDTH 2
+#define RTGUI_WIDGET_DEFAULT_MARGIN 3
+
+enum RTGUI_ORIENTATION
+{
+ RTGUI_HORIZONTAL = 0x01,
+ RTGUI_VERTICAL = 0x02,
+ RTGUI_ORIENTATION_BOTH = RTGUI_HORIZONTAL | RTGUI_VERTICAL
+};
+
+enum RTGUI_ALIGN
+{
+ RTGUI_ALIGN_NOT = 0x00,
+ RTGUI_ALIGN_CENTER_HORIZONTAL = 0x01,
+ RTGUI_ALIGN_LEFT = RTGUI_ALIGN_NOT,
+ RTGUI_ALIGN_TOP = RTGUI_ALIGN_NOT,
+ RTGUI_ALIGN_RIGHT = 0x02,
+ RTGUI_ALIGN_BOTTOM = 0x04,
+ RTGUI_ALIGN_CENTER_VERTICAL = 0x08,
+ RTGUI_ALIGN_EXPAND = 0x10,
+ RTGUI_ALIGN_STRETCH = 0x20,
+};
+
+enum RTGUI_TEXTSTYLE
+{
+ RTGUI_TEXTSTYLE_NORMAL = 0x00,
+ RTGUI_TEXTSTYLE_DRAW_BACKGROUND = 0x01,
+ RTGUI_TEXTSTYLE_SHADOW = 0x02,
+ RTGUI_TEXTSTYLE_OUTLINE = 0x04,
+};
+
+enum RTGUI_MODAL_CODE
+{
+ RTGUI_MODAL_OK,
+ RTGUI_MODAL_CANCEL
+};
+typedef enum RTGUI_MODAL_CODE rtgui_modal_code_t;
+
+#include <rtgui/rtgui_object.h>
+
+#endif
diff --git a/components/rtgui_win/include/rtgui/rtgui_config.h b/components/rtgui_win/include/rtgui/rtgui_config.h
new file mode 100644
index 0000000000..ecdd03fc67
--- /dev/null
+++ b/components/rtgui_win/include/rtgui/rtgui_config.h
@@ -0,0 +1,41 @@
+/*
+ * File : rtgui_config.h
+ * This file is part of RT-Thread RTOS
+ * COPYRIGHT (C) 2006 - 2009, RT-Thread Development Team
+ *
+ * The license and distribution terms for this file may be
+ * found in the file LICENSE in this distribution or at
+ * http://www.rt-thread.org/license/LICENSE
+ *
+ * Change Logs:
+ * Date Author Notes
+ * 2009-10-16 Bernard first version
+ * 2010-02-08 Bernard move some RTGUI options to bsp
+ */
+
+#ifndef __RTGUI_CONFIG_H__
+#define __RTGUI_CONFIG_H__
+
+/* RTGUI options */
+
+/* native running under RT-Thread */
+#ifndef RT_USING_DFS
+ #undef RTGUI_USING_DFS_FILERW
+ #undef RTGUI_USING_HZ_FILE
+#endif
+
+#define RTGUI_USING_WINMOVE
+
+//#define RTGUI_IMAGE_BMP
+
+#define RTGUI_DEFAULT_FONT_SIZE 16
+
+#define RTGUI_SVR_THREAD_PRIORITY 3
+#define RTGUI_SVR_THREAD_TIMESLICE 5
+#ifdef RTGUI_USING_SMALL_SIZE
+#define RTGUI_SVR_THREAD_STACK_SIZE 1024
+#else
+#define RTGUI_SVR_THREAD_STACK_SIZE 4096
+#endif
+
+#endif
diff --git a/components/rtgui_win/include/rtgui/rtgui_object.h b/components/rtgui_win/include/rtgui/rtgui_object.h
new file mode 100644
index 0000000000..1ff0c6c947
--- /dev/null
+++ b/components/rtgui_win/include/rtgui/rtgui_object.h
@@ -0,0 +1,107 @@
+/*
+ * File : rtgui_object.h
+ * This file is part of RTGUI in RT-Thread RTOS
+ * COPYRIGHT (C) 2006 - 2009, RT-Thread Development Team
+ *
+ * The license and distribution terms for this file may be
+ * found in the file LICENSE in this distribution or at
+ * http://www.rt-thread.org/license/LICENSE
+ *
+ * Change Logs:
+ * Date Author Notes
+ * 2009-10-04 Bernard first version
+ */
+#ifndef __RTGUI_OBJECT_H__
+#define __RTGUI_OBJECT_H__
+
+
+#include <rtthread.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* rtgui object type */
+#define RTGUI_CONTAINER_OF(obj, type, member) \
+ ((type *)((char *)(obj) - (unsigned long)(&((type *)0)->member)))
+
+/** Casts the function pointer to an rtgui_constructor */
+#define RTGUI_CONSTRUCTOR(c) ((rtgui_constructor_t)(c))
+/** Casts the function pointer to an rtgui_constructor */
+#define RTGUI_DESTRUCTOR(d) ((rtgui_destructor_t)(d))
+
+/* pre-definetion */
+typedef struct rtgui_type rtgui_type_t;
+typedef struct rtgui_object rtgui_object_t;
+
+typedef void (*rtgui_constructor_t)(rtgui_object_t *object);
+typedef void (*rtgui_destructor_t)(rtgui_object_t *object);
+
+/* rtgui type structure */
+struct rtgui_type
+{
+ /* type name */
+ char* name;
+
+ /* hierarchy and depth */
+ rtgui_type_t **hierarchy;
+ int hierarchy_depth;
+
+ /* constructor and destructor */
+ rtgui_constructor_t constructor;
+ rtgui_destructor_t destructor;
+
+ /* size of type */
+ int size;
+};
+typedef struct rtgui_type rtgui_type_t;
+
+rtgui_type_t *rtgui_type_create(const char *type_name, rtgui_type_t *parent_type,
+ int type_size, rtgui_constructor_t c,
+ rtgui_destructor_t d);
+void rtgui_type_destroy(rtgui_type_t *type);
+
+void rtgui_type_object_construct(rtgui_type_t *type, rtgui_object_t *object);
+void rtgui_type_destructors_call(rtgui_type_t *type, rtgui_object_t *object);
+rt_bool_t rtgui_type_inherits_from(rtgui_type_t *type, rtgui_type_t *parent);
+rtgui_type_t *rtgui_type_parent_type_get(rtgui_type_t *type);
+const char *rtgui_type_name_get(rtgui_type_t *type);
+rtgui_type_t *GetTypeFromName(const char *name);
+
+#ifdef RTGUI_USING_CAST_CHECK
+ #define RTGUI_OBJECT_CAST(obj, rtgui_type_t, c_type) \
+ ((c_type *)rtgui_object_check_cast((rtgui_object_t *)(obj), (rtgui_type_t)))
+#else
+ #define RTGUI_OBJECT_CAST(obj, rtgui_type_t, c_type) ((c_type *)(obj))
+#endif
+
+#define RTGUI_OBJECT_CHECK_TYPE(_obj, _type) \
+ (rtgui_type_inherits_from(((rtgui_object_t *)(_obj))->type, (_type)))
+
+/** Gets the type of an object */
+#define RTGUI_OBJECT_TYPE (rtgui_object_type_get())
+/** Casts the object to an rtgui_object_t */
+#define RTGUI_OBJECT(obj) (RTGUI_OBJECT_CAST((obj), RTGUI_OBJECT_TYPE, rtgui_object_t))
+/** Checks if the object is an rtgui_Object */
+#define RTGUI_IS_OBJECT(obj) (RTGUI_OBJECT_CHECK_TYPE((obj), RTGUI_OBJECT_TYPE))
+
+/* rtgui base object */
+struct rtgui_object
+{
+ /* object type */
+ rtgui_type_t* type;
+
+ rt_bool_t is_static;
+};
+rtgui_type_t *rtgui_object_type_get(void);
+
+rtgui_object_t *rtgui_object_create(rtgui_type_t *object_type);
+void rtgui_object_destroy(rtgui_object_t *object);
+
+rtgui_object_t *rtgui_object_check_cast(rtgui_object_t *object, rtgui_type_t *type);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/components/rtgui_win/include/rtgui/rtgui_server.h b/components/rtgui_win/include/rtgui/rtgui_server.h
new file mode 100644
index 0000000000..234d433eb8
--- /dev/null
+++ b/components/rtgui_win/include/rtgui/rtgui_server.h
@@ -0,0 +1,32 @@
+/*
+ * File : rtgui_server.h
+ * This file is part of RTGUI in RT-Thread RTOS
+ * COPYRIGHT (C) 2006 - 2009, RT-Thread Development Team
+ *
+ * The license and distribution terms for this file may be
+ * found in the file LICENSE in this distribution or at
+ * http://www.rt-thread.org/license/LICENSE
+ *
+ * Change Logs:
+ * Date Author Notes
+ * 2009-10-04 Bernard first version
+ */
+#ifndef __RTGUI_SERVER_H__
+#define __RTGUI_SERVER_H__
+
+#include <rtgui/list.h>
+
+/* RTGUI server definitions */
+
+#define WINTITLE_HEIGHT 20
+#define WINTITLE_BORDER_SIZE 2
+
+/* top win manager init */
+void rtgui_win_init(void);
+void rtgui_server_init(void);
+
+/* post an event to server */
+void rtgui_server_post_event(rtgui_event_t* event, rt_size_t size);
+
+#endif
+
diff --git a/components/rtgui_win/include/rtgui/rtgui_system.h b/components/rtgui_win/include/rtgui/rtgui_system.h
new file mode 100644
index 0000000000..655834d68b
--- /dev/null
+++ b/components/rtgui_win/include/rtgui/rtgui_system.h
@@ -0,0 +1,94 @@
+/*
+ * File : rtgui_system.h
+ * This file is part of RTGUI in RT-Thread RTOS
+ * COPYRIGHT (C) 2006 - 2009, RT-Thread Development Team
+ *
+ * The license and distribution terms for this file may be
+ * found in the file LICENSE in this distribution or at
+ * http://www.rt-thread.org/license/LICENSE
+ *
+ * Change Logs:
+ * Date Author Notes
+ * 2009-10-04 Bernard first version
+ */
+#ifndef __RTGUI_SYSTEM_H__
+#define __RTGUI_SYSTEM_H__
+
+#include <rtthread.h>
+#include <rtgui/rtgui.h>
+
+#ifdef RTGUI_USING_SMALL_SIZE
+#define RTGUI_EVENT_BUFFER_SIZE 64
+#else
+#define RTGUI_EVENT_BUFFER_SIZE 256
+#endif
+
+struct rtgui_thread
+{
+ /* the thread id */
+ struct rt_thread* tid;
+
+ /* the message queue of thread */
+ struct rt_messagequeue* mq;
+
+ /* the owner of thread */
+ PVOID widget;
+ /* event buffer */
+ rt_uint8_t event_buffer[RTGUI_EVENT_BUFFER_SIZE];
+
+ /* on idle event handler */
+ void (*on_idle)(PVOID wdt, rtgui_event_t *event);
+};
+typedef struct rtgui_thread rtgui_thread_t;
+
+typedef struct rtgui_timer rtgui_timer_t;
+typedef void (*rtgui_timeout_func)(rtgui_timer_t* timer, void* parameter);
+typedef void (*rtgui_idle_func)(PVOID wdt, rtgui_event_t *event);
+
+struct rtgui_timer
+{
+ /* context thread id */
+ struct rt_thread* tid;
+ /* rt timer */
+ struct rt_timer timer;
+
+ /* timeout function and user data */
+ rtgui_timeout_func timeout;
+ void* user_data;
+};
+
+
+rtgui_timer_t* rtgui_timer_create(rt_int32_t time, rt_int32_t flag, rtgui_timeout_func timeout, void* parameter);
+void rtgui_timer_destory(rtgui_timer_t* timer);
+
+void rtgui_timer_start(rtgui_timer_t* timer);
+void rtgui_timer_stop(rtgui_timer_t* timer);
+
+void rtgui_thread_register(struct rt_thread* tid, struct rt_messagequeue* mq);
+void rtgui_thread_deregister(struct rt_thread* tid);
+rtgui_thread_t* rtgui_thread_self(void);
+void rtgui_thread_set_onidle(rtgui_idle_func onidle);
+rtgui_idle_func rtgui_thread_get_onidle(void);
+
+struct rt_thread* rtgui_thread_get_server(void);
+
+void rtgui_thread_set_widget(PVOID widget);
+PVOID rtgui_thread_get_widget(void);
+
+rt_err_t rtgui_thread_send(struct rt_thread* tid, rtgui_event_t* event, rt_size_t event_size);
+rt_err_t rtgui_thread_send_urgent(struct rt_thread* tid, rtgui_event_t* event, rt_size_t event_size);
+rt_err_t rtgui_thread_send_sync(struct rt_thread* tid, rtgui_event_t* event, rt_size_t event_size);
+rt_err_t rtgui_thread_recv(rtgui_event_t* event, rt_size_t event_size);
+rt_err_t rtgui_thread_recv_nosuspend(rtgui_event_t* event, rt_size_t event_size);
+rt_err_t rtgui_thread_recv_filter(rt_uint32_t type, rtgui_event_t* event, rt_size_t event_size);
+rt_err_t rtgui_thread_ack(rtgui_event_t* event, rt_err_t errcode);
+
+/* rtgui system initialization function */
+void rtgui_system_server_init(void);
+
+void* rtgui_malloc(rt_size_t size);
+void rtgui_free(void* ptr);
+void* rtgui_realloc(void* ptr, rt_size_t size);
+
+#endif
+
diff --git a/components/rtgui_win/include/rtgui/rtgui_theme.h b/components/rtgui_win/include/rtgui/rtgui_theme.h
new file mode 100644
index 0000000000..2fddf29951
--- /dev/null
+++ b/components/rtgui_win/include/rtgui/rtgui_theme.h
@@ -0,0 +1,80 @@
+/*
+ * File : rtgui_theme.h
+ * This file is part of RTGUI in RT-Thread RTOS
+ * COPYRIGHT (C) 2006 - 2009, RT-Thread Development Team
+ *
+ * The license and distribution terms for this file may be
+ * found in the file LICENSE in this distribution or at
+ * http://www.rt-thread.org/license/LICENSE
+ *
+ * Change Logs:
+ * Date Author Notes
+ * 2009-10-04 Bernard first version
+ */
+#ifndef __RTGUI_THEME_H__
+#define __RTGUI_THEME_H__
+
+#include <rtgui/rtgui.h>
+
+#define CHECK_BOX_W 13
+#define CHECK_BOX_H 13
+
+#define RADIO_BOX_W 12
+#define RADIO_BOX_H 12
+
+#include <rtgui/widgets/widget.h>
+#include <rtgui/widgets/container.h>
+#include <rtgui/widgets/label.h>
+#include <rtgui/widgets/button.h>
+#include <rtgui/widgets/textbox.h>
+#include <rtgui/widgets/iconbox.h>
+#include <rtgui/widgets/checkbox.h>
+#include <rtgui/widgets/radiobox.h>
+#include <rtgui/widgets/listbox.h>
+#include <rtgui/widgets/scrollbar.h>
+#include <rtgui/widgets/slider.h>
+#include <rtgui/widgets/progressbar.h>
+#include <rtgui/widgets/staticline.h>
+#include <rtgui/widgets/window.h>
+#include <rtgui/widgets/view.h>
+#include <rtgui/widgets/menu.h>
+#include <rtgui/widgets/combobox.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+void rtgui_system_theme_init(void);
+
+void rtgui_theme_draw_win_closebox(rtgui_win_t *win);
+void rtgui_theme_draw_win_maxbox(rtgui_win_t *win);
+void rtgui_theme_draw_win_minbox(rtgui_win_t *win);
+void rtgui_theme_draw_win_title(rtgui_win_t *win);
+void rtgui_theme_draw_win(rtgui_win_t* win);
+void rtgui_theme_draw_button(rtgui_button_t* btn);
+void rtgui_theme_draw_label(rtgui_label_t* label);
+void rtgui_theme_draw_textbox(rtgui_textbox_t* box);
+void rtgui_theme_draw_iconbox(rtgui_iconbox_t* iconbox);
+void rtgui_theme_draw_checkbox(rtgui_checkbox_t* checkbox);
+void rtgui_theme_draw_radiobutton(rtgui_radiobox_t* rbox, rt_uint32_t index);
+void rtgui_theme_draw_radiobox(rtgui_radiobox_t* rbox);
+void rtgui_theme_draw_menu(rtgui_menu_t* menu);
+void rtgui_theme_draw_menu_item(rtgui_menu_t* menu, rtgui_menu_item_t *item);
+void rtgui_theme_draw_slider(rtgui_slider_t* slider);
+void rtgui_theme_draw_scrollbar(rtgui_scrollbar_t* bar);
+void rtgui_theme_draw_progressbar(rtgui_progressbar_t* bar);
+void rtgui_theme_draw_staticline(rtgui_staticline_t* sline);
+
+void rtgui_theme_draw_selected(rtgui_dc_t *dc, rtgui_color_t *color, rtgui_rect_t *rect);
+
+rtgui_color_t rtgui_theme_default_bc(void);//default black ground color
+rtgui_color_t rtgui_theme_default_fc(void);
+void rtgui_theme_draw_panel(rtgui_panel_t *panel);
+void rtgui_theme_draw_combo(rtgui_combo_t *cbo);
+void rtgui_theme_draw_combo_downarrow(rtgui_combo_t *cbo);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/components/rtgui_win/include/rtgui/rtgui_xml.h b/components/rtgui_win/include/rtgui/rtgui_xml.h
new file mode 100644
index 0000000000..abdc5c79af
--- /dev/null
+++ b/components/rtgui_win/include/rtgui/rtgui_xml.h
@@ -0,0 +1,34 @@
+#ifndef __RTGUI_XML_H__
+#define __RTGUI_XML_H__
+
+#include <rtgui/rtgui.h>
+
+/* Types of events: start element, end element, text, attr name, attr
+ val and start/end document. Other events can be ignored! */
+enum {
+ EVENT_START = 0, /* Start tag */
+ EVENT_END, /* End tag */
+ EVENT_TEXT, /* Text */
+ EVENT_NAME, /* Attribute name */
+ EVENT_VAL, /* Attribute value */
+ EVENT_END_DOC, /* End of document */
+ EVENT_COPY, /* Internal only; copies to internal buffer */
+ EVENT_NONE /* Internal only; should never see this event */
+};
+
+/* xml structure typedef */
+typedef struct rtgui_xml rtgui_xml_t;
+typedef int (*XML_handle)(rt_uint8_t event, const char* text, rt_size_t len, void* user);
+
+/* create a xml parser context */
+rtgui_xml_t* rtgui_xml_create(rt_size_t buffer_size, XML_handle handler, void* user);
+/* destroy a xml parser context */
+void rtgui_xml_destroy(rtgui_xml_t* rtgui_xml);
+
+/* parse xml buffer */
+int rtgui_xml_parse(rtgui_xml_t* rtgui_xml, const char* buf, rt_size_t len);
+
+/* event string */
+const char* rtgui_xml_event_str(rt_uint8_t event);
+
+#endif
diff --git a/components/rtgui_win/include/rtgui/tree.h b/components/rtgui_win/include/rtgui/tree.h
new file mode 100644
index 0000000000..f447c3c382
--- /dev/null
+++ b/components/rtgui_win/include/rtgui/tree.h
@@ -0,0 +1,748 @@
+/* $NetBSD: tree.h,v 1.8 2004/03/28 19:38:30 provos Exp $ */
+/* $OpenBSD: tree.h,v 1.7 2002/10/17 21:51:54 art Exp $ */
+/* $FreeBSD$ */
+
+/*-
+ * Copyright 2002 Niels Provos <[email protected]>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef _SYS_TREE_H_
+#define _SYS_TREE_H_
+
+#ifndef NULL
+#define NULL NULL
+#endif
+// #include <sys/cdefs.h>
+
+/*
+ * This file defines data structures for different types of trees:
+ * splay trees and red-black trees.
+ *
+ * A splay tree is a self-organizing data structure. Every operation
+ * on the tree causes a splay to happen. The splay moves the requested
+ * node to the root of the tree and partly rebalances it.
+ *
+ * This has the benefit that request locality causes faster lookups as
+ * the requested nodes move to the top of the tree. On the other hand,
+ * every lookup causes memory writes.
+ *
+ * The Balance Theorem bounds the total access time for m operations
+ * and n inserts on an initially empty tree as O((m + n)lg n). The
+ * amortized cost for a sequence of m accesses to a splay tree is O(lg n);
+ *
+ * A red-black tree is a binary search tree with the node color as an
+ * extra attribute. It fulfills a set of conditions:
+ * - every search path from the root to a leaf consists of the
+ * same number of black nodes,
+ * - each red node (except for the root) has a black parent,
+ * - each leaf node is black.
+ *
+ * Every operation on a red-black tree is bounded as O(lg n).
+ * The maximum height of a red-black tree is 2lg (n+1).
+ */
+
+#define SPLAY_HEAD(name, type) \
+struct name { \
+ struct type *sph_root; /* root of the tree */ \
+}
+
+#define SPLAY_INITIALIZER(root) \
+ { RT_NULL }
+
+#define SPLAY_INIT(root) do { \
+ (root)->sph_root = RT_NULL; \
+} while(/*CONSTCOND*/ 0)
+
+#define SPLAY_ENTRY(type) \
+struct { \
+ struct type *spe_left; /* left element */ \
+ struct type *spe_right; /* right element */ \
+}
+
+#define SPLAY_LEFT(elm, field) (elm)->field.spe_left
+#define SPLAY_RIGHT(elm, field) (elm)->field.spe_right
+#define SPLAY_ROOT(head) (head)->sph_root
+#define SPLAY_EMPTY(head) (SPLAY_ROOT(head) == RT_NULL)
+
+/* SPLAY_ROTATE_{LEFT,RIGHT} expect that tmp hold SPLAY_{RIGHT,LEFT} */
+#define SPLAY_ROTATE_RIGHT(head, tmp, field) do { \
+ SPLAY_LEFT((head)->sph_root, field) = SPLAY_RIGHT(tmp, field); \
+ SPLAY_RIGHT(tmp, field) = (head)->sph_root; \
+ (head)->sph_root = tmp; \
+} while(/*CONSTCOND*/ 0)
+
+#define SPLAY_ROTATE_LEFT(head, tmp, field) do { \
+ SPLAY_RIGHT((head)->sph_root, field) = SPLAY_LEFT(tmp, field); \
+ SPLAY_LEFT(tmp, field) = (head)->sph_root; \
+ (head)->sph_root = tmp; \
+} while(/*CONSTCOND*/ 0)
+
+#define SPLAY_LINKLEFT(head, tmp, field) do { \
+ SPLAY_LEFT(tmp, field) = (head)->sph_root; \
+ tmp = (head)->sph_root; \
+ (head)->sph_root = SPLAY_LEFT((head)->sph_root, field); \
+} while(/*CONSTCOND*/ 0)
+
+#define SPLAY_LINKRIGHT(head, tmp, field) do { \
+ SPLAY_RIGHT(tmp, field) = (head)->sph_root; \
+ tmp = (head)->sph_root; \
+ (head)->sph_root = SPLAY_RIGHT((head)->sph_root, field); \
+} while(/*CONSTCOND*/ 0)
+
+#define SPLAY_ASSEMBLE(head, node, left, right, field) do { \
+ SPLAY_RIGHT(left, field) = SPLAY_LEFT((head)->sph_root, field); \
+ SPLAY_LEFT(right, field) = SPLAY_RIGHT((head)->sph_root, field);\
+ SPLAY_LEFT((head)->sph_root, field) = SPLAY_RIGHT(node, field); \
+ SPLAY_RIGHT((head)->sph_root, field) = SPLAY_LEFT(node, field); \
+} while(/*CONSTCOND*/ 0)
+
+/* Generates prototypes and inline functions */
+
+#define SPLAY_PROTOTYPE(name, type, field, cmp) \
+void name##_SPLAY(struct name *, struct type *); \
+void name##_SPLAY_MINMAX(struct name *, int); \
+struct type *name##_SPLAY_INSERT(struct name *, struct type *); \
+struct type *name##_SPLAY_REMOVE(struct name *, struct type *); \
+ \
+/* Finds the node with the same key as elm */ \
+static __inline struct type * \
+name##_SPLAY_FIND(struct name *head, struct type *elm) \
+{ \
+ if(SPLAY_EMPTY(head)) \
+ return(RT_NULL); \
+ name##_SPLAY(head, elm); \
+ if((cmp)(elm, (head)->sph_root) == 0) \
+ return (head->sph_root); \
+ return (RT_NULL); \
+} \
+ \
+static __inline struct type * \
+name##_SPLAY_NEXT(struct name *head, struct type *elm) \
+{ \
+ name##_SPLAY(head, elm); \
+ if(SPLAY_RIGHT(elm, field) != RT_NULL) { \
+ elm = SPLAY_RIGHT(elm, field); \
+ while(SPLAY_LEFT(elm, field) != RT_NULL) { \
+ elm = SPLAY_LEFT(elm, field); \
+ } \
+ } else \
+ elm = RT_NULL; \
+ return (elm); \
+} \
+ \
+static __inline struct type * \
+name##_SPLAY_MIN_MAX(struct name *head, int val) \
+{ \
+ name##_SPLAY_MINMAX(head, val); \
+ return (SPLAY_ROOT(head)); \
+}
+
+/* Main splay operation.
+ * Moves node close to the key of elm to top
+ */
+#define SPLAY_GENERATE(name, type, field, cmp) \
+struct type * \
+name##_SPLAY_INSERT(struct name *head, struct type *elm) \
+{ \
+ if(SPLAY_EMPTY(head)) { \
+ SPLAY_LEFT(elm, field) = SPLAY_RIGHT(elm, field) = RT_NULL; \
+ } else { \
+ int __comp; \
+ name##_SPLAY(head, elm); \
+ __comp = (cmp)(elm, (head)->sph_root); \
+ if(__comp < 0) { \
+ SPLAY_LEFT(elm, field) = SPLAY_LEFT((head)->sph_root, field);\
+ SPLAY_RIGHT(elm, field) = (head)->sph_root; \
+ SPLAY_LEFT((head)->sph_root, field) = RT_NULL; \
+ } else if(__comp > 0) { \
+ SPLAY_RIGHT(elm, field) = SPLAY_RIGHT((head)->sph_root, field);\
+ SPLAY_LEFT(elm, field) = (head)->sph_root; \
+ SPLAY_RIGHT((head)->sph_root, field) = RT_NULL; \
+ } else \
+ return ((head)->sph_root); \
+ } \
+ (head)->sph_root = (elm); \
+ return (RT_NULL); \
+} \
+ \
+struct type * \
+name##_SPLAY_REMOVE(struct name *head, struct type *elm) \
+{ \
+ struct type *__tmp; \
+ if(SPLAY_EMPTY(head)) \
+ return (RT_NULL); \
+ name##_SPLAY(head, elm); \
+ if((cmp)(elm, (head)->sph_root) == 0) { \
+ if(SPLAY_LEFT((head)->sph_root, field) == RT_NULL) { \
+ (head)->sph_root = SPLAY_RIGHT((head)->sph_root, field);\
+ } else { \
+ __tmp = SPLAY_RIGHT((head)->sph_root, field); \
+ (head)->sph_root = SPLAY_LEFT((head)->sph_root, field);\
+ name##_SPLAY(head, elm); \
+ SPLAY_RIGHT((head)->sph_root, field) = __tmp; \
+ } \
+ return (elm); \
+ } \
+ return (RT_NULL); \
+} \
+ \
+void \
+name##_SPLAY(struct name *head, struct type *elm) \
+{ \
+ struct type __node, *__left, *__right, *__tmp; \
+ int __comp; \
+\
+ SPLAY_LEFT(&__node, field) = SPLAY_RIGHT(&__node, field) = RT_NULL;\
+ __left = __right = &__node; \
+\
+ while((__comp = (cmp)(elm, (head)->sph_root)) != 0) { \
+ if(__comp < 0) { \
+ __tmp = SPLAY_LEFT((head)->sph_root, field); \
+ if(__tmp == RT_NULL) \
+ break; \
+ if((cmp)(elm, __tmp) < 0){ \
+ SPLAY_ROTATE_RIGHT(head, __tmp, field); \
+ if(SPLAY_LEFT((head)->sph_root, field) == RT_NULL)\
+ break; \
+ } \
+ SPLAY_LINKLEFT(head, __right, field); \
+ } else if(__comp > 0) { \
+ __tmp = SPLAY_RIGHT((head)->sph_root, field); \
+ if(__tmp == RT_NULL) \
+ break; \
+ if((cmp)(elm, __tmp) > 0){ \
+ SPLAY_ROTATE_LEFT(head, __tmp, field); \
+ if(SPLAY_RIGHT((head)->sph_root, field) == RT_NULL)\
+ break; \
+ } \
+ SPLAY_LINKRIGHT(head, __left, field); \
+ } \
+ } \
+ SPLAY_ASSEMBLE(head, &__node, __left, __right, field); \
+} \
+ \
+/* Splay with either the minimum or the maximum element \
+ * Used to find minimum or maximum element in tree. \
+ */ \
+void name##_SPLAY_MINMAX(struct name *head, int __comp) \
+{ \
+ struct type __node, *__left, *__right, *__tmp; \
+\
+ SPLAY_LEFT(&__node, field) = SPLAY_RIGHT(&__node, field) = RT_NULL;\
+ __left = __right = &__node; \
+\
+ while(1) { \
+ if(__comp < 0) { \
+ __tmp = SPLAY_LEFT((head)->sph_root, field); \
+ if(__tmp == RT_NULL) \
+ break; \
+ if(__comp < 0){ \
+ SPLAY_ROTATE_RIGHT(head, __tmp, field); \
+ if(SPLAY_LEFT((head)->sph_root, field) == RT_NULL)\
+ break; \
+ } \
+ SPLAY_LINKLEFT(head, __right, field); \
+ } else if(__comp > 0) { \
+ __tmp = SPLAY_RIGHT((head)->sph_root, field); \
+ if(__tmp == RT_NULL) \
+ break; \
+ if(__comp > 0) { \
+ SPLAY_ROTATE_LEFT(head, __tmp, field); \
+ if(SPLAY_RIGHT((head)->sph_root, field) == RT_NULL)\
+ break; \
+ } \
+ SPLAY_LINKRIGHT(head, __left, field); \
+ } \
+ } \
+ SPLAY_ASSEMBLE(head, &__node, __left, __right, field); \
+}
+
+#define SPLAY_NEGINF -1
+#define SPLAY_INF 1
+
+#define SPLAY_INSERT(name, x, y) name##_SPLAY_INSERT(x, y)
+#define SPLAY_REMOVE(name, x, y) name##_SPLAY_REMOVE(x, y)
+#define SPLAY_FIND(name, x, y) name##_SPLAY_FIND(x, y)
+#define SPLAY_NEXT(name, x, y) name##_SPLAY_NEXT(x, y)
+#define SPLAY_MIN(name, x) (SPLAY_EMPTY(x) ? RT_NULL \
+ : name##_SPLAY_MIN_MAX(x, SPLAY_NEGINF))
+#define SPLAY_MAX(name, x) (SPLAY_EMPTY(x) ? RT_NULL \
+ : name##_SPLAY_MIN_MAX(x, SPLAY_INF))
+
+#define SPLAY_FOREACH(x, name, head) \
+ for((x) = SPLAY_MIN(name, head); \
+ (x) != RT_NULL; \
+ (x) = SPLAY_NEXT(name, head, x))
+
+/* Macros that define a red-black tree */
+#define RB_HEAD(name, type) \
+struct name { \
+ struct type *rbh_root; /* root of the tree */ \
+}
+
+#define RB_INITIALIZER(root) \
+ { RT_NULL }
+
+#define RB_INIT(root) do { \
+ (root)->rbh_root = RT_NULL; \
+} while(/*CONSTCOND*/ 0)
+
+#define RB_BLACK 0
+#define RB_RED 1
+#define RB_ENTRY(type) \
+struct { \
+ struct type *rbe_left; /* left element */ \
+ struct type *rbe_right; /* right element */ \
+ struct type *rbe_parent; /* parent element */ \
+ int rbe_color; /* node color */ \
+}
+
+#define RB_LEFT(elm, field) (elm)->field.rbe_left
+#define RB_RIGHT(elm, field) (elm)->field.rbe_right
+#define RB_PARENT(elm, field) (elm)->field.rbe_parent
+#define RB_COLOR(elm, field) (elm)->field.rbe_color
+#define RB_ROOT(head) (head)->rbh_root
+#define RB_EMPTY(head) (RB_ROOT(head) == RT_NULL)
+
+#define RB_SET(elm, parent, field) do { \
+ RB_PARENT(elm, field) = parent; \
+ RB_LEFT(elm, field) = RB_RIGHT(elm, field) = RT_NULL; \
+ RB_COLOR(elm, field) = RB_RED; \
+} while(/*CONSTCOND*/ 0)
+
+#define RB_SET_BLACKRED(black, red, field) do { \
+ RB_COLOR(black, field) = RB_BLACK; \
+ RB_COLOR(red, field) = RB_RED; \
+} while(/*CONSTCOND*/ 0)
+
+#ifndef RB_AUGMENT
+#define RB_AUGMENT(x) do {} while(0)
+#endif
+
+#define RB_ROTATE_LEFT(head, elm, tmp, field) do { \
+ (tmp) = RB_RIGHT(elm, field); \
+ if((RB_RIGHT(elm, field) = RB_LEFT(tmp, field)) != RT_NULL) { \
+ RB_PARENT(RB_LEFT(tmp, field), field) = (elm); \
+ } \
+ RB_AUGMENT(elm); \
+ if((RB_PARENT(tmp, field) = RB_PARENT(elm, field)) != RT_NULL) { \
+ if((elm) == RB_LEFT(RB_PARENT(elm, field), field)) \
+ RB_LEFT(RB_PARENT(elm, field), field) = (tmp); \
+ else \
+ RB_RIGHT(RB_PARENT(elm, field), field) = (tmp); \
+ } else \
+ (head)->rbh_root = (tmp); \
+ RB_LEFT(tmp, field) = (elm); \
+ RB_PARENT(elm, field) = (tmp); \
+ RB_AUGMENT(tmp); \
+ if((RB_PARENT(tmp, field))) \
+ RB_AUGMENT(RB_PARENT(tmp, field)); \
+} while(/*CONSTCOND*/ 0)
+
+#define RB_ROTATE_RIGHT(head, elm, tmp, field) do { \
+ (tmp) = RB_LEFT(elm, field); \
+ if((RB_LEFT(elm, field) = RB_RIGHT(tmp, field)) != RT_NULL) { \
+ RB_PARENT(RB_RIGHT(tmp, field), field) = (elm); \
+ } \
+ RB_AUGMENT(elm); \
+ if((RB_PARENT(tmp, field) = RB_PARENT(elm, field)) != RT_NULL) { \
+ if((elm) == RB_LEFT(RB_PARENT(elm, field), field)) \
+ RB_LEFT(RB_PARENT(elm, field), field) = (tmp); \
+ else \
+ RB_RIGHT(RB_PARENT(elm, field), field) = (tmp); \
+ } else \
+ (head)->rbh_root = (tmp); \
+ RB_RIGHT(tmp, field) = (elm); \
+ RB_PARENT(elm, field) = (tmp); \
+ RB_AUGMENT(tmp); \
+ if((RB_PARENT(tmp, field))) \
+ RB_AUGMENT(RB_PARENT(tmp, field)); \
+} while(/*CONSTCOND*/ 0)
+
+/* Generates prototypes and inline functions */
+#define RB_PROTOTYPE(name, type, field, cmp) \
+ RB_PROTOTYPE_INTERNAL(name, type, field, cmp,)
+#define RB_PROTOTYPE_STATIC(name, type, field, cmp) \
+ RB_PROTOTYPE_INTERNAL(name, type, field, cmp, __unused static)
+#define RB_PROTOTYPE_INTERNAL(name, type, field, cmp, attr) \
+attr void name##_RB_INSERT_COLOR(struct name *, struct type *); \
+attr void name##_RB_REMOVE_COLOR(struct name *, struct type *, struct type *);\
+attr struct type *name##_RB_REMOVE(struct name *, struct type *); \
+attr struct type *name##_RB_INSERT(struct name *, struct type *); \
+attr struct type *name##_RB_FIND(struct name *, struct type *); \
+attr struct type *name##_RB_NFIND(struct name *, struct type *); \
+attr struct type *name##_RB_NEXT(struct type *); \
+attr struct type *name##_RB_PREV(struct type *); \
+attr struct type *name##_RB_MINMAX(struct name *, int); \
+ \
+
+/* Main rb operation.
+ * Moves node close to the key of elm to top
+ */
+#define RB_GENERATE(name, type, field, cmp) \
+ RB_GENERATE_INTERNAL(name, type, field, cmp,)
+#define RB_GENERATE_STATIC(name, type, field, cmp) \
+ RB_GENERATE_INTERNAL(name, type, field, cmp, __unused static)
+#define RB_GENERATE_INTERNAL(name, type, field, cmp, attr) \
+attr void \
+name##_RB_INSERT_COLOR(struct name *head, struct type *elm) \
+{ \
+ struct type *parent, *gparent, *tmp; \
+ while((parent = RB_PARENT(elm, field)) != RT_NULL && \
+ RB_COLOR(parent, field) == RB_RED) { \
+ gparent = RB_PARENT(parent, field); \
+ if(parent == RB_LEFT(gparent, field)) { \
+ tmp = RB_RIGHT(gparent, field); \
+ if(tmp && RB_COLOR(tmp, field) == RB_RED) { \
+ RB_COLOR(tmp, field) = RB_BLACK; \
+ RB_SET_BLACKRED(parent, gparent, field);\
+ elm = gparent; \
+ continue; \
+ } \
+ if(RB_RIGHT(parent, field) == elm) { \
+ RB_ROTATE_LEFT(head, parent, tmp, field);\
+ tmp = parent; \
+ parent = elm; \
+ elm = tmp; \
+ } \
+ RB_SET_BLACKRED(parent, gparent, field); \
+ RB_ROTATE_RIGHT(head, gparent, tmp, field); \
+ } else { \
+ tmp = RB_LEFT(gparent, field); \
+ if(tmp && RB_COLOR(tmp, field) == RB_RED) { \
+ RB_COLOR(tmp, field) = RB_BLACK; \
+ RB_SET_BLACKRED(parent, gparent, field);\
+ elm = gparent; \
+ continue; \
+ } \
+ if(RB_LEFT(parent, field) == elm) { \
+ RB_ROTATE_RIGHT(head, parent, tmp, field);\
+ tmp = parent; \
+ parent = elm; \
+ elm = tmp; \
+ } \
+ RB_SET_BLACKRED(parent, gparent, field); \
+ RB_ROTATE_LEFT(head, gparent, tmp, field); \
+ } \
+ } \
+ RB_COLOR(head->rbh_root, field) = RB_BLACK; \
+} \
+ \
+attr void \
+name##_RB_REMOVE_COLOR(struct name *head, struct type *parent, struct type *elm) \
+{ \
+ struct type *tmp; \
+ while((elm == RT_NULL || RB_COLOR(elm, field) == RB_BLACK) && \
+ elm != RB_ROOT(head)) { \
+ if(RB_LEFT(parent, field) == elm) { \
+ tmp = RB_RIGHT(parent, field); \
+ if(RB_COLOR(tmp, field) == RB_RED) { \
+ RB_SET_BLACKRED(tmp, parent, field); \
+ RB_ROTATE_LEFT(head, parent, tmp, field);\
+ tmp = RB_RIGHT(parent, field); \
+ } \
+ if((RB_LEFT(tmp, field) == RT_NULL || \
+ RB_COLOR(RB_LEFT(tmp, field), field) == RB_BLACK) &&\
+ (RB_RIGHT(tmp, field) == RT_NULL || \
+ RB_COLOR(RB_RIGHT(tmp, field), field) == RB_BLACK)) {\
+ RB_COLOR(tmp, field) = RB_RED; \
+ elm = parent; \
+ parent = RB_PARENT(elm, field); \
+ } else { \
+ if(RB_RIGHT(tmp, field) == RT_NULL || \
+ RB_COLOR(RB_RIGHT(tmp, field), field) == RB_BLACK) {\
+ struct type *oleft; \
+ if((oleft = RB_LEFT(tmp, field)) \
+ != RT_NULL) \
+ RB_COLOR(oleft, field) = RB_BLACK;\
+ RB_COLOR(tmp, field) = RB_RED; \
+ RB_ROTATE_RIGHT(head, tmp, oleft, field);\
+ tmp = RB_RIGHT(parent, field); \
+ } \
+ RB_COLOR(tmp, field) = RB_COLOR(parent, field);\
+ RB_COLOR(parent, field) = RB_BLACK; \
+ if(RB_RIGHT(tmp, field)) \
+ RB_COLOR(RB_RIGHT(tmp, field), field) = RB_BLACK;\
+ RB_ROTATE_LEFT(head, parent, tmp, field);\
+ elm = RB_ROOT(head); \
+ break; \
+ } \
+ } else { \
+ tmp = RB_LEFT(parent, field); \
+ if(RB_COLOR(tmp, field) == RB_RED) { \
+ RB_SET_BLACKRED(tmp, parent, field); \
+ RB_ROTATE_RIGHT(head, parent, tmp, field);\
+ tmp = RB_LEFT(parent, field); \
+ } \
+ if((RB_LEFT(tmp, field) == RT_NULL || \
+ RB_COLOR(RB_LEFT(tmp, field), field) == RB_BLACK) &&\
+ (RB_RIGHT(tmp, field) == RT_NULL || \
+ RB_COLOR(RB_RIGHT(tmp, field), field) == RB_BLACK)) {\
+ RB_COLOR(tmp, field) = RB_RED; \
+ elm = parent; \
+ parent = RB_PARENT(elm, field); \
+ } else { \
+ if(RB_LEFT(tmp, field) == RT_NULL || \
+ RB_COLOR(RB_LEFT(tmp, field), field) == RB_BLACK) {\
+ struct type *oright; \
+ if((oright = RB_RIGHT(tmp, field)) \
+ != RT_NULL) \
+ RB_COLOR(oright, field) = RB_BLACK;\
+ RB_COLOR(tmp, field) = RB_RED; \
+ RB_ROTATE_LEFT(head, tmp, oright, field);\
+ tmp = RB_LEFT(parent, field); \
+ } \
+ RB_COLOR(tmp, field) = RB_COLOR(parent, field);\
+ RB_COLOR(parent, field) = RB_BLACK; \
+ if(RB_LEFT(tmp, field)) \
+ RB_COLOR(RB_LEFT(tmp, field), field) = RB_BLACK;\
+ RB_ROTATE_RIGHT(head, parent, tmp, field);\
+ elm = RB_ROOT(head); \
+ break; \
+ } \
+ } \
+ } \
+ if(elm) \
+ RB_COLOR(elm, field) = RB_BLACK; \
+} \
+ \
+attr struct type * \
+name##_RB_REMOVE(struct name *head, struct type *elm) \
+{ \
+ struct type *child, *parent, *old = elm; \
+ int color; \
+ if(RB_LEFT(elm, field) == RT_NULL) \
+ child = RB_RIGHT(elm, field); \
+ else if(RB_RIGHT(elm, field) == RT_NULL) \
+ child = RB_LEFT(elm, field); \
+ else { \
+ struct type *left; \
+ elm = RB_RIGHT(elm, field); \
+ while((left = RB_LEFT(elm, field)) != RT_NULL) \
+ elm = left; \
+ child = RB_RIGHT(elm, field); \
+ parent = RB_PARENT(elm, field); \
+ color = RB_COLOR(elm, field); \
+ if(child) \
+ RB_PARENT(child, field) = parent; \
+ if(parent) { \
+ if(RB_LEFT(parent, field) == elm) \
+ RB_LEFT(parent, field) = child; \
+ else \
+ RB_RIGHT(parent, field) = child; \
+ RB_AUGMENT(parent); \
+ } else \
+ RB_ROOT(head) = child; \
+ if(RB_PARENT(elm, field) == old) \
+ parent = elm; \
+ (elm)->field = (old)->field; \
+ if(RB_PARENT(old, field)) { \
+ if(RB_LEFT(RB_PARENT(old, field), field) == old)\
+ RB_LEFT(RB_PARENT(old, field), field) = elm;\
+ else \
+ RB_RIGHT(RB_PARENT(old, field), field) = elm;\
+ RB_AUGMENT(RB_PARENT(old, field)); \
+ } else \
+ RB_ROOT(head) = elm; \
+ RB_PARENT(RB_LEFT(old, field), field) = elm; \
+ if(RB_RIGHT(old, field)) \
+ RB_PARENT(RB_RIGHT(old, field), field) = elm; \
+ if(parent) { \
+ left = parent; \
+ do { \
+ RB_AUGMENT(left); \
+ } while((left = RB_PARENT(left, field)) != RT_NULL); \
+ } \
+ goto color; \
+ } \
+ parent = RB_PARENT(elm, field); \
+ color = RB_COLOR(elm, field); \
+ if(child) \
+ RB_PARENT(child, field) = parent; \
+ if(parent) { \
+ if(RB_LEFT(parent, field) == elm) \
+ RB_LEFT(parent, field) = child; \
+ else \
+ RB_RIGHT(parent, field) = child; \
+ RB_AUGMENT(parent); \
+ } else \
+ RB_ROOT(head) = child; \
+color: \
+ if(color == RB_BLACK) \
+ name##_RB_REMOVE_COLOR(head, parent, child); \
+ return (old); \
+} \
+ \
+/* Inserts a node into the RB tree */ \
+attr struct type * \
+name##_RB_INSERT(struct name *head, struct type *elm) \
+{ \
+ struct type *tmp; \
+ struct type *parent = RT_NULL; \
+ int comp = 0; \
+ tmp = RB_ROOT(head); \
+ while(tmp) { \
+ parent = tmp; \
+ comp = (cmp)(elm, parent); \
+ if(comp < 0) \
+ tmp = RB_LEFT(tmp, field); \
+ else if(comp > 0) \
+ tmp = RB_RIGHT(tmp, field); \
+ else \
+ return (tmp); \
+ } \
+ RB_SET(elm, parent, field); \
+ if(parent != RT_NULL) { \
+ if(comp < 0) \
+ RB_LEFT(parent, field) = elm; \
+ else \
+ RB_RIGHT(parent, field) = elm; \
+ RB_AUGMENT(parent); \
+ } else \
+ RB_ROOT(head) = elm; \
+ name##_RB_INSERT_COLOR(head, elm); \
+ return (RT_NULL); \
+} \
+ \
+/* Finds the node with the same key as elm */ \
+attr struct type * \
+name##_RB_FIND(struct name *head, struct type *elm) \
+{ \
+ struct type *tmp = RB_ROOT(head); \
+ int comp; \
+ while(tmp) { \
+ comp = cmp(elm, tmp); \
+ if(comp < 0) \
+ tmp = RB_LEFT(tmp, field); \
+ else if(comp > 0) \
+ tmp = RB_RIGHT(tmp, field); \
+ else \
+ return (tmp); \
+ } \
+ return (RT_NULL); \
+} \
+ \
+/* Finds the first node greater than or equal to the search key */ \
+attr struct type * \
+name##_RB_NFIND(struct name *head, struct type *elm) \
+{ \
+ struct type *tmp = RB_ROOT(head); \
+ struct type *res = RT_NULL; \
+ int comp; \
+ while(tmp) { \
+ comp = cmp(elm, tmp); \
+ if(comp < 0) { \
+ res = tmp; \
+ tmp = RB_LEFT(tmp, field); \
+ } \
+ else if(comp > 0) \
+ tmp = RB_RIGHT(tmp, field); \
+ else \
+ return (tmp); \
+ } \
+ return (res); \
+} \
+ \
+/* ARGSUSED */ \
+attr struct type * \
+name##_RB_NEXT(struct type *elm) \
+{ \
+ if(RB_RIGHT(elm, field)) { \
+ elm = RB_RIGHT(elm, field); \
+ while(RB_LEFT(elm, field)) \
+ elm = RB_LEFT(elm, field); \
+ } else { \
+ if(RB_PARENT(elm, field) && \
+ (elm == RB_LEFT(RB_PARENT(elm, field), field))) \
+ elm = RB_PARENT(elm, field); \
+ else { \
+ while(RB_PARENT(elm, field) && \
+ (elm == RB_RIGHT(RB_PARENT(elm, field), field)))\
+ elm = RB_PARENT(elm, field); \
+ elm = RB_PARENT(elm, field); \
+ } \
+ } \
+ return (elm); \
+} \
+ \
+/* ARGSUSED */ \
+attr struct type * \
+name##_RB_PREV(struct type *elm) \
+{ \
+ if(RB_LEFT(elm, field)) { \
+ elm = RB_LEFT(elm, field); \
+ while(RB_RIGHT(elm, field)) \
+ elm = RB_RIGHT(elm, field); \
+ } else { \
+ if(RB_PARENT(elm, field) && \
+ (elm == RB_RIGHT(RB_PARENT(elm, field), field))) \
+ elm = RB_PARENT(elm, field); \
+ else { \
+ while(RB_PARENT(elm, field) && \
+ (elm == RB_LEFT(RB_PARENT(elm, field), field)))\
+ elm = RB_PARENT(elm, field); \
+ elm = RB_PARENT(elm, field); \
+ } \
+ } \
+ return (elm); \
+} \
+ \
+attr struct type * \
+name##_RB_MINMAX(struct name *head, int val) \
+{ \
+ struct type *tmp = RB_ROOT(head); \
+ struct type *parent = RT_NULL; \
+ while(tmp) { \
+ parent = tmp; \
+ if(val < 0) \
+ tmp = RB_LEFT(tmp, field); \
+ else \
+ tmp = RB_RIGHT(tmp, field); \
+ } \
+ return (parent); \
+}
+
+#define RB_NEGINF -1
+#define RB_INF 1
+
+#define RB_INSERT(name, x, y) name##_RB_INSERT(x, y)
+#define RB_REMOVE(name, x, y) name##_RB_REMOVE(x, y)
+#define RB_FIND(name, x, y) name##_RB_FIND(x, y)
+#define RB_NFIND(name, x, y) name##_RB_NFIND(x, y)
+#define RB_NEXT(name, x, y) name##_RB_NEXT(y)
+#define RB_PREV(name, x, y) name##_RB_PREV(y)
+#define RB_MIN(name, x) name##_RB_MINMAX(x, RB_NEGINF)
+#define RB_MAX(name, x) name##_RB_MINMAX(x, RB_INF)
+
+#define RB_FOREACH(x, name, head) \
+ for((x) = RB_MIN(name, head); \
+ (x) != RT_NULL; \
+ (x) = name##_RB_NEXT(x))
+
+#define RB_FOREACH_REVERSE(x, name, head) \
+ for((x) = RB_MAX(name, head); \
+ (x) != RT_NULL; \
+ (x) = name##_RB_PREV(x))
+
+#endif /* _SYS_TREE_H_ */
diff --git a/components/rtgui_win/include/rtgui/widgets/button.h b/components/rtgui_win/include/rtgui/widgets/button.h
new file mode 100644
index 0000000000..a0fa703168
--- /dev/null
+++ b/components/rtgui_win/include/rtgui/widgets/button.h
@@ -0,0 +1,84 @@
+/*
+ * File : button.h
+ * This file is part of RT-Thread RTOS
+ * COPYRIGHT (C) 2006 - 2009, RT-Thread Development Team
+ *
+ * The license and distribution terms for this file may be
+ * found in the file LICENSE in this distribution or at
+ * http://www.rt-thread.org/license/LICENSE
+ *
+ * Change Logs:
+ * Date Author Notes
+ * 2009-10-16 Bernard first version
+ */
+#ifndef __RTGUI_BUTTON_H__
+#define __RTGUI_BUTTON_H__
+
+#include <rtgui/image.h>
+#include <rtgui/widgets/widget.h>
+#include <rtgui/widgets/label.h>
+#include <rtgui/kbddef.h>
+#include <rtgui/color.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * @defgroup rtgui_button_t
+ * @{
+ */
+
+/** Gets the type of a button */
+#define RTGUI_BUTTON_TYPE (rtgui_button_type_get())
+/** Casts the object to an rtgui_button_t */
+#define RTGUI_BUTTON(obj) (RTGUI_OBJECT_CAST((obj), RTGUI_BUTTON_TYPE, rtgui_button_t))
+/** Checks if the object is an rtgui_button_t */
+#define RTGUI_IS_BUTTON(obj) (RTGUI_OBJECT_CHECK_TYPE((obj), RTGUI_BUTTON_TYPE))
+
+#define RTGUI_BUTTON_FLAG_PRESS 0x01
+#define RTGUI_BUTTON_FLAG_DEFAULT 0x02
+
+#define RTGUI_BUTTON_TYPE_NORMAL 0x00
+#define RTGUI_BUTTON_TYPE_PUSH 0x10
+
+/*
+ * the button widget
+ */
+struct rtgui_button
+{
+ /* inherit from label */
+ rtgui_label_t parent;
+
+ /* button flag */
+ rt_uint32_t flag;
+
+ /* pressed and unpressed image */
+ rtgui_image_t *image;
+
+ /* click button event handler */
+ void (*on_button)(PVOID wdt, rtgui_event_t *event);
+};
+typedef struct rtgui_button rtgui_button_t;
+typedef void (*rtgui_onbutton_func_t)(PVOID wdt, rtgui_event_t *event);
+
+rtgui_type_t *rtgui_button_type_get(void);
+
+rtgui_button_t* rtgui_button_create(PVOID parent,char* text,int left,int top,int w,int h);
+void rtgui_button_destroy(rtgui_button_t* btn);
+
+void rtgui_button_set_image(rtgui_button_t* btn, rtgui_image_t* image);
+
+void rtgui_button_set_onbutton(rtgui_button_t* btn, rtgui_onbutton_func_t func);
+
+rt_bool_t rtgui_button_event_handler(PVOID wdt, rtgui_event_t* event);
+
+void rtgui_button_set_text(rtgui_button_t* button, const char* text);
+
+/** @} */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/components/rtgui_win/include/rtgui/widgets/checkbox.h b/components/rtgui_win/include/rtgui/widgets/checkbox.h
new file mode 100644
index 0000000000..fed9c6cbd8
--- /dev/null
+++ b/components/rtgui_win/include/rtgui/widgets/checkbox.h
@@ -0,0 +1,35 @@
+#ifndef __RTGUI_CHECKBOX_H__
+#define __RTGUI_CHECKBOX_H__
+
+#include <rtgui/rtgui.h>
+
+
+#define RTGUI_CHECKBOX_TYPE (rtgui_checkbox_type_get())
+#define RTGUI_CHECKBOX(obj) (RTGUI_OBJECT_CAST((obj), RTGUI_CHECKBOX_TYPE, rtgui_checkbox_t))
+#define RTGUI_IS_CHECKBOX(obj) (RTGUI_OBJECT_CHECK_TYPE((obj), RTGUI_CHECKBOX_TYPE))
+
+//#define RTGUI_CHECKBOX_STATUS_CHECKED 1
+//#define RTGUI_CHECKBOX_STATUS_UNCHECKED 0
+
+struct rtgui_checkbox
+{
+ /* inherit from label */
+ rtgui_label_t parent;
+
+ /* check box status */
+ int value;
+};
+typedef struct rtgui_checkbox rtgui_checkbox_t;
+
+rtgui_type_t *rtgui_checkbox_type_get(void);
+
+rtgui_checkbox_t* rtgui_checkbox_create(PVOID wdt,const char* text, rt_bool_t checked,rtgui_color_t fc,int left,int top);
+void rtgui_checkbox_destroy(rtgui_checkbox_t* checkbox);
+
+void rtgui_checkbox_set_checked(rtgui_checkbox_t* checkbox, rt_bool_t checked);
+rt_bool_t rtgui_checkbox_get_checked(rtgui_checkbox_t* checkbox);
+
+rt_bool_t rtgui_checkbox_event_handler(PVOID wdt, rtgui_event_t* event);
+void rtgui_checkbox_set_text(rtgui_checkbox_t *box, const char* text);
+
+#endif
diff --git a/components/rtgui_win/include/rtgui/widgets/combobox.h b/components/rtgui_win/include/rtgui/widgets/combobox.h
new file mode 100644
index 0000000000..3da90e1389
--- /dev/null
+++ b/components/rtgui_win/include/rtgui/widgets/combobox.h
@@ -0,0 +1,62 @@
+#ifndef __RTGUI_COMBO_H__
+#define __RTGUI_COMBO_H__
+
+#include <rtgui/rtgui.h>
+#include <rtgui/rtgui_system.h>
+#include <rtgui/widgets/widget.h>
+#include <rtgui/widgets/textbox.h>
+#include <rtgui/widgets/button.h>
+#include <rtgui/widgets/view.h>
+#include <rtgui/widgets/listbox.h>
+
+#define RTGUI_COMBOBOX_HEIGHT 24
+#define RTGUI_COMBOBOX_BUTTON_WIDTH 16
+
+#define RTGUI_COMBO_STYLE_DOWNARROW_UP 0x01
+#define RTGUI_COMBO_STYLE_DOWNARROW_DOWN 0x02
+
+typedef struct rtgui_combo rtgui_combo_t;
+
+/** Gets the type of a textbox */
+#define RTGUI_COMBOBOX_TYPE (rtgui_combo_type_get())
+/** Casts the object to a rtgui_textbox_t */
+#define RTGUI_COMBOBOX(obj) (RTGUI_OBJECT_CAST((obj), RTGUI_COMBOBOX_TYPE, rtgui_combo_t))
+/** Checks if the object is a rtgui_textbox_t */
+#define RTGUI_IS_COMBOBOX(obj) (RTGUI_OBJECT_CHECK_TYPE((obj), RTGUI_COMBOBOX_TYPE))
+
+typedef struct rtgui_combo_item
+{
+ char *name;
+}rtgui_combo_item_t;
+
+struct rtgui_combo
+{
+ rtgui_container_t parent;
+
+ /* widget private data */
+ rt_uint32_t style;
+
+ rtgui_textbox_t *tbox;
+ rtgui_listbox_t *lbox;
+
+ /* call back */
+ void (*on_selected) (PVOID wdt, rtgui_event_t* event);
+ rt_uint32_t (*get_count)(rtgui_combo_t* box);
+ void (*add_string)(rtgui_combo_t* box,char* string);
+};
+
+
+rtgui_type_t *rtgui_combo_type_get(void);
+rtgui_combo_t* rtgui_combo_create(PVOID parent,const char* text,int left,int top,int w,int h);
+void rtgui_combo_destroy(rtgui_combo_t* cbo);
+
+void rtgui_combo_set_onitem(rtgui_combo_t* cbo, rtgui_event_handler_ptr func);
+rt_bool_t rtgui_combo_event_handler(PVOID wdt, rtgui_event_t* event);
+rt_bool_t rtgui_combo_onitem(PVOID wdt, rtgui_event_t* event);
+void rtgui_combo_set_items(rtgui_combo_t* cbo, rtgui_listbox_item_t* items, rt_uint32_t count);
+
+rt_uint32_t rtgui_combo_get_select(rtgui_combo_t* cbo);
+char* rtgui_combo_get_string(rtgui_combo_t* cbo);
+
+#endif
+
diff --git a/components/rtgui_win/include/rtgui/widgets/container.h b/components/rtgui_win/include/rtgui/widgets/container.h
new file mode 100644
index 0000000000..abf90af16b
--- /dev/null
+++ b/components/rtgui_win/include/rtgui/widgets/container.h
@@ -0,0 +1,50 @@
+/*
+ * File : box.h
+ * This file is part of RT-Thread RTOS
+ * COPYRIGHT (C) 2006 - 2009, RT-Thread Development Team
+ *
+ * The license and distribution terms for this file may be
+ * found in the file LICENSE in this distribution or at
+ * http://www.rt-thread.org/license/LICENSE
+ *
+ * Change Logs:
+ * Date Author Notes
+ * 2009-10-16 Bernard first version
+ */
+#ifndef __RTGUI_BOX_H__
+#define __RTGUI_BOX_H__
+
+#include <rtgui/widgets/widget.h>
+#include <rtgui/event.h>
+
+/** Gets the type of a box */
+#define RTGUI_CONTAINER_TYPE (rtgui_container_type_get())
+/** Casts the object to a rtgui_container_t */
+#define RTGUI_CONTAINER(obj) (RTGUI_OBJECT_CAST((obj), RTGUI_CONTAINER_TYPE, rtgui_container_t))
+/** Checks if the object is a rtgui_container_t */
+#define RTGUI_IS_CONTAINER(obj) (RTGUI_OBJECT_CHECK_TYPE((obj), RTGUI_CONTAINER_TYPE))
+
+struct rtgui_container
+{
+ /* inherit from widget */
+ rtgui_widget_t parent;
+
+ rtgui_widget_t *focused;
+ rtgui_list_t children;
+};
+typedef struct rtgui_container rtgui_container_t;
+
+rtgui_type_t *rtgui_container_type_get(void);
+
+void rtgui_container_add_child(PVOID cbox, PVOID wdt);
+void rtgui_container_remove_child(rtgui_container_t *box, PVOID wdt);
+void rtgui_container_destroy_children(rtgui_container_t *box);
+rtgui_widget_t* rtgui_container_get_first_child(rtgui_container_t* box);
+
+rt_bool_t rtgui_container_event_handler(PVOID wdt, rtgui_event_t* event);
+
+rt_bool_t rtgui_container_dispatch_event(rtgui_container_t *box, rtgui_event_t* event);
+rt_bool_t rtgui_container_dispatch_mouse_event(rtgui_container_t *box, rtgui_event_mouse_t* event);
+
+
+#endif
diff --git a/components/rtgui_win/include/rtgui/widgets/dialog.h b/components/rtgui_win/include/rtgui/widgets/dialog.h
new file mode 100644
index 0000000000..7790aff028
--- /dev/null
+++ b/components/rtgui_win/include/rtgui/widgets/dialog.h
@@ -0,0 +1,32 @@
+#ifndef __DIALOG_H__
+#define __DIALOG_H__
+
+/* �򿪶Ի����е�һЩ���� */
+struct OpenDlgSt
+{
+ char* path; //����·��
+ char* filename; //�ļ�(��)����
+ rt_uint32_t size;//�ļ���С/�ļ����µ��ļ�����
+ rt_uint32_t type;//�ļ�����:�ļ�/�ļ���
+ char* pattern; //�����;
+
+ rtgui_filelist_view_t* fview;
+ rtgui_textbox_t* tbox_path; //�ؼ�ָ��
+ rtgui_textbox_t* tbox_filename;
+ rtgui_combo_t* cbox_pattern;
+};
+
+
+rtgui_win_t* rtgui_win_get_win_by_widget(PVOID wdt);
+void OpenFileDialog(PVOID wdt, rtgui_event_t* event);
+void NewFileDialog(PVOID wdt, rtgui_event_t *event);
+void SaveFileDialog(PVOID wdt, rtgui_event_t *event);
+
+void GoToTopFolder(PVOID wdt, rtgui_event_t *event);
+void GoToSubFolder(PVOID wdt, rtgui_event_t *event);
+
+
+
+
+#endif
+
diff --git a/components/rtgui_win/include/rtgui/widgets/filelist_view.h b/components/rtgui_win/include/rtgui/widgets/filelist_view.h
new file mode 100644
index 0000000000..d669f064b1
--- /dev/null
+++ b/components/rtgui_win/include/rtgui/widgets/filelist_view.h
@@ -0,0 +1,60 @@
+#ifndef __RTGUI_FILELIST_VIEW_H__
+#define __RTGUI_FILELIST_VIEW_H__
+
+#include <rtgui/widgets/view.h>
+#include <rtgui/widgets/scrollbar.h>
+#include <rtgui/kbddef.h>
+#include <rtgui/color.h>
+
+#define RTGUI_FITEM_FILE 0x0
+#define RTGUI_FITEM_DIR 0x1
+
+
+typedef struct rtgui_fileview rtgui_filelist_view_t;
+
+/** Gets the type of a filelist view */
+#define RTGUI_FILELIST_VIEW_TYPE (rtgui_filelist_view_type_get())
+/** Casts the object to a filelist */
+#define RTGUI_FILELIST_VIEW(obj) (RTGUI_OBJECT_CAST((obj), RTGUI_FILELIST_VIEW_TYPE, rtgui_filelist_view_t))
+/** Checks if the object is a filelist view */
+#define RTGUI_IS_FILELIST_VIEW(obj) (RTGUI_OBJECT_CHECK_TYPE((obj), RTGUI_FILELIST_VIEW_TYPE))
+
+
+typedef struct rtgui_file_item
+{
+ char* name;
+ rt_uint32_t type;
+ rt_uint32_t size;
+}rtgui_filelist_view_item_t;
+
+struct rtgui_fileview
+{
+ rtgui_container_t parent;
+
+ /* widget private data */
+ char* current_dir; //��ǰ�ļ���current_dir
+ char* pattern; //���������
+
+ rt_int16_t item_per_page; //ÿҳ����ʾ����
+ rt_int16_t item_count; //������
+
+ rt_int16_t frist_aloc;/* frist item */
+ rt_int16_t now_aloc; /* now item */
+ rt_int16_t old_aloc; /* old item */
+
+ rtgui_scrollbar_t *sbar; //����
+
+ rtgui_filelist_view_item_t *items; /* items array */
+};
+
+rtgui_type_t *rtgui_filelist_view_type_get(void);
+
+rtgui_filelist_view_t* rtgui_filelist_view_create(PVOID parent, const char* directory, const char* pattern, int left, int top, int w, int h);
+void rtgui_filelist_view_destroy(rtgui_filelist_view_t* view);
+
+rt_bool_t rtgui_filelist_view_event_handler(PVOID wdt, rtgui_event_t* event);
+void rtgui_filelist_view_set_directory(rtgui_filelist_view_t* view, const char* directory);
+void rtgui_filelist_view_on_enter(rtgui_filelist_view_t* fview);
+void rtgui_filelist_view_get_fullpath(rtgui_filelist_view_t* view, char* path, rt_size_t len);
+
+#endif
diff --git a/components/rtgui_win/include/rtgui/widgets/iconbox.h b/components/rtgui_win/include/rtgui/widgets/iconbox.h
new file mode 100644
index 0000000000..ef82d58a7a
--- /dev/null
+++ b/components/rtgui_win/include/rtgui/widgets/iconbox.h
@@ -0,0 +1,58 @@
+/*
+ * File : iconbox.h
+ * This file is part of RT-Thread RTOS
+ * COPYRIGHT (C) 2006 - 2009, RT-Thread Development Team
+ *
+ * The license and distribution terms for this file may be
+ * found in the file LICENSE in this distribution or at
+ * http://www.rt-thread.org/license/LICENSE
+ *
+ * Change Logs:
+ * Date Author Notes
+ * 2009-10-16 Bernard first version
+ */
+#ifndef __RTGUI_ICONBOX_H__
+#define __RTGUI_ICONBOX_H__
+
+#include <rtgui/rtgui.h>
+#include <topwin.h>
+#include <rtgui/image.h>
+#include <rtgui/font.h>
+#include <rtgui/widgets/widget.h>
+
+/** Gets the type of a iconbox */
+#define RTGUI_ICONBOX_TYPE (rtgui_iconbox_type_get())
+/** Casts the object to a rtgui_iconbox_t */
+#define RTGUI_ICONBOX(obj) (RTGUI_OBJECT_CAST((obj), RTGUI_ICONBOX_TYPE, rtgui_iconbox_t))
+/** Checks if the object is a rtgui_iconbox_t */
+#define RTGUI_IS_ICONBOX(obj) (RTGUI_OBJECT_CHECK_TYPE((obj), RTGUI_ICONBOX_TYPE))
+
+#define RTGUI_ICONBOX_NOTEXT 0x00
+#define RTGUI_ICONBOX_TEXT_RIGHT 0x01
+#define RTGUI_ICONBOX_TEXT_BELOW 0x02
+
+#define RTGUI_ICONBOX_AREA 76
+
+struct rtgui_iconbox
+{
+ rtgui_widget_t parent; /* inherit from widget */
+
+ rtgui_image_t* image; /* widget private data */
+ char *text;
+ void (*call)(void);
+ rt_uint32_t text_position;
+
+ rt_bool_t selected;
+};
+typedef struct rtgui_iconbox rtgui_iconbox_t;
+
+rtgui_type_t *rtgui_iconbox_type_get(void);
+
+rtgui_iconbox_t* rtgui_iconbox_create(PVOID parent, rtgui_image_t* image, const char* text, int position);
+void rtgui_iconbox_destroy(rtgui_iconbox_t* iconbox);
+
+rt_bool_t rtgui_iconbox_event_handler(PVOID wdt, rtgui_event_t* event);
+
+void rtgui_iconbox_set_text_position(rtgui_iconbox_t* iconbox, int position);
+
+#endif
diff --git a/components/rtgui_win/include/rtgui/widgets/label.h b/components/rtgui_win/include/rtgui/widgets/label.h
new file mode 100644
index 0000000000..ddc447edc3
--- /dev/null
+++ b/components/rtgui_win/include/rtgui/widgets/label.h
@@ -0,0 +1,48 @@
+/*
+ * File : label.h
+ * This file is part of RT-Thread RTOS
+ * COPYRIGHT (C) 2006 - 2009, RT-Thread Development Team
+ *
+ * The license and distribution terms for this file may be
+ * found in the file LICENSE in this distribution or at
+ * http://www.rt-thread.org/license/LICENSE
+ *
+ * Change Logs:
+ * Date Author Notes
+ * 2009-10-16 Bernard first version
+ */
+#ifndef __RTGUI_LABEL_H__
+#define __RTGUI_LABEL_H__
+
+#include <rtgui/rtgui.h>
+#include <rtgui/widgets/widget.h>
+
+/** Gets the type of a button */
+#define RTGUI_LABEL_TYPE (rtgui_label_type_get())
+/** Casts the object to an rtgui_label_t */
+#define RTGUI_LABEL(obj) (RTGUI_OBJECT_CAST((obj), RTGUI_LABEL_TYPE, rtgui_label_t))
+/** Checks if the object is an rtgui_label_t */
+#define RTGUI_IS_LABEL(obj) (RTGUI_OBJECT_CHECK_TYPE((obj), RTGUI_LABEL_TYPE))
+
+/*
+ * the label widget
+ */
+struct rtgui_label
+{
+ rtgui_widget_t parent;
+ /* label */
+ char* text;
+};
+typedef struct rtgui_label rtgui_label_t;
+
+rtgui_type_t *rtgui_label_type_get(void);
+
+rtgui_label_t* rtgui_label_create(PVOID wdt, const char* text, int left, int top, int w, int h);
+void rtgui_label_destroy(rtgui_label_t* label);
+
+rt_bool_t rtgui_label_event_handler(PVOID wdt, rtgui_event_t* event);
+
+void rtgui_label_set_text(rtgui_label_t* label, const char* text);
+char* rtgui_label_get_text(rtgui_label_t* label);
+
+#endif
diff --git a/components/rtgui_win/include/rtgui/widgets/list_view.h b/components/rtgui_win/include/rtgui/widgets/list_view.h
new file mode 100644
index 0000000000..2af23061b3
--- /dev/null
+++ b/components/rtgui_win/include/rtgui/widgets/list_view.h
@@ -0,0 +1,76 @@
+/*
+ * File : list_view.h
+ * This file is part of RTGUI in RT-Thread RTOS
+ * COPYRIGHT (C) 2010, RT-Thread Development Team
+ *
+ * The license and distribution terms for this file may be
+ * found in the file LICENSE in this distribution or at
+ * http://www.rt-thread.org/license/LICENSE
+ *
+ * Change Logs:
+ * Date Author Notes
+ * 2010-01-06 Bernard first version
+ */
+
+#ifndef __RTGUI_LIST_VIEW_H__
+#define __RTGUI_LIST_VIEW_H__
+
+#include <rtgui/rtgui.h>
+#include <rtgui/kbddef.h>
+#include <rtgui/color.h>
+#include <rtgui/event.h>
+#include <rtgui/widgets/view.h>
+
+typedef void (*item_action)(void* parameter);
+typedef struct rtgui_list_item rtgui_list_view_item_t;
+struct rtgui_list_item
+{
+ char* name;
+ rtgui_image_t *image;
+ item_action action;
+ void *parameter;
+};
+
+/** Gets the type of a list view */
+#define RTGUI_LIST_VIEW_TYPE (rtgui_list_view_type_get())
+/** Casts the object to a rtgui_list_view_t */
+#define RTGUI_LIST_VIEW(obj) (RTGUI_OBJECT_CAST((obj), RTGUI_LIST_VIEW_TYPE, rtgui_list_view_t))
+/** Checks if the object is a rtgui_list_view_t */
+#define RTGUI_IS_LIST_VIEW(obj) (RTGUI_OBJECT_CHECK_TYPE((obj), RTGUI_LIST_VIEW_TYPE))
+
+#define RTGUI_LIST_VIEW_LIST 0x00
+#define RTGUI_LIST_VIEW_ICON 0x01
+#define RTGUI_LIST_VIEW_REPORT 0x02
+
+struct rtgui_list_view
+{
+ rtgui_view_t parent;
+
+ /* widget private data */
+ /* list item */
+ const rtgui_list_view_item_t* items;
+
+ /* layout flag */
+ rt_uint16_t flag;
+
+ /* total number of items */
+ rt_uint16_t item_count;
+ /* the number of item in a page */
+ rt_uint16_t page;
+ /* current item */
+ rt_int16_t item_current;
+
+ /* icon layout */
+ rt_uint32_t row_items, col_items;
+};
+typedef struct rtgui_list_view rtgui_list_view_t;
+
+rtgui_type_t *rtgui_list_view_type_get(void);
+
+rtgui_list_view_t* rtgui_list_view_create(PVOID parent,const rtgui_list_view_item_t* items, rt_uint16_t count, int left,int top,int w,int h, rt_uint16_t flag);
+void rtgui_list_view_destroy(rtgui_list_view_t* view);
+
+rt_bool_t rtgui_list_view_event_handler(PVOID wdt, rtgui_event_t* event);
+
+#endif
+
diff --git a/components/rtgui_win/include/rtgui/widgets/listbox.h b/components/rtgui_win/include/rtgui/widgets/listbox.h
new file mode 100644
index 0000000000..3b86eef281
--- /dev/null
+++ b/components/rtgui_win/include/rtgui/widgets/listbox.h
@@ -0,0 +1,75 @@
+/*
+ * File : listbox.h
+ * This file is part of RTGUI in RT-Thread RTOS
+ * COPYRIGHT (C) 2010, RT-Thread Development Team
+ *
+ * The license and distribution terms for this file may be
+ * found in the file LICENSE in this distribution or at
+ * http://www.rt-thread.org/license/LICENSE
+ *
+ * Change Logs:
+ * Date Author Notes
+ * 2010-01-06 Bernard first version
+ */
+
+#ifndef __RTGUI_LISTBOX_H__
+#define __RTGUI_LISTBOX_H__
+
+#include <rtgui/rtgui.h>
+#include <rtgui/kbddef.h>
+#include <rtgui/color.h>
+#include <rtgui/image.h>
+
+struct rtgui_listbox_item
+{
+ char *name;
+ rtgui_image_t *image;
+};
+typedef struct rtgui_listbox_item rtgui_listbox_item_t;
+/** Gets the type of a list box */
+#define RTGUI_LISTBOX_TYPE (rtgui_listbox_type_get())
+/** Casts the object to a filelist */
+#define RTGUI_LISTBOX(obj) (RTGUI_OBJECT_CAST((obj), RTGUI_LISTBOX_TYPE, rtgui_listbox_t))
+/** Checks if the object is a filelist box */
+#define RTGUI_IS_LISTBOX(obj) (RTGUI_OBJECT_CHECK_TYPE((obj), RTGUI_LISTBOX_TYPE))
+
+typedef struct rtgui_listbox rtgui_listbox_t;
+
+struct rtgui_listbox
+{
+ rtgui_container_t parent;
+
+ /* widget private data */
+ rt_int16_t item_per_page; /* the number of item in a page */
+ rt_int16_t item_count; /* total number of items */
+ rt_int16_t item_size; /* item size */
+ rt_int16_t frist_aloc; /* frist item */
+ rt_int16_t now_aloc; /* now item */
+ rt_int16_t old_aloc; /* old item */
+ rt_bool_t ispopup; /* �ǵ��������б� */
+ PVOID widgetlnk; /* ���ӵĿؼ� */
+ rtgui_scrollbar_t *sbar;
+ rtgui_listbox_item_t *items; /* items array */
+
+ /* item event handler */
+ rt_bool_t (*on_item)(PVOID wdt, rtgui_event_t* event);
+
+ rt_uint32_t (*get_count)(rtgui_listbox_t* box);
+ void (*add_item)(rtgui_listbox_t* box, rtgui_listbox_item_t* item);
+};
+
+
+rtgui_type_t *rtgui_listbox_type_get(void);
+
+rtgui_listbox_t* rtgui_listbox_create(PVOID wdt, int left,int top,int w,int h,rt_uint32_t style);
+void rtgui_listbox_destroy(rtgui_listbox_t* box);
+
+void rtgui_listbox_update(rtgui_listbox_t* box);
+rt_bool_t rtgui_listbox_event_handler(PVOID wdt, rtgui_event_t* event);
+void rtgui_listbox_set_onitem(rtgui_listbox_t* box, rtgui_event_handler_ptr func);
+void rtgui_listbox_set_items(rtgui_listbox_t* box, rtgui_listbox_item_t* items, rt_uint32_t count);
+
+void rtgui_listbox_delete_item(rtgui_listbox_t* box, rt_uint32_t item_num);
+
+#endif
+
diff --git a/components/rtgui_win/include/rtgui/widgets/menu.h b/components/rtgui_win/include/rtgui/widgets/menu.h
new file mode 100644
index 0000000000..591d8a682a
--- /dev/null
+++ b/components/rtgui_win/include/rtgui/widgets/menu.h
@@ -0,0 +1,106 @@
+/*
+ * File : view.h
+ * This file is part of RT-Thread RTOS
+ * COPYRIGHT (C) 2006 - 2009, RT-Thread Development Team
+ *
+ * The license and distribution terms for this file may be
+ * found in the file LICENSE in this distribution or at
+ * http://www.rt-thread.org/license/LICENSE
+ *
+ * Change Logs:
+ * Date Author Notes
+ * 2009-10-16 Bernard first version
+ */
+#ifndef __RTGUI_MENU_H__
+#define __RTGUI_MENU_H__
+
+#include <rtgui/rtgui.h>
+#include <rtgui/image.h>
+#include <rtgui/widgets/widget.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef int HMENU;
+
+#define RTGUI_MENU_HEIGHT 43 /*�˵���߶�*/
+#define RTGUI_MENU_BORDER 2
+
+#define RTGUI_MENU_IMAGE_W 24
+#define RTGUI_MENU_IMAGE_H 24
+
+#define ITEM (System,Name,ID) \
+rtgui_menu_append(hPopupMenu_##System, MF_ENABLED, ID, Name);
+
+/*�˵����־*/
+#define RTGUI_MENU_POPUP 0x00000080L
+
+typedef struct rtgui_menu_item rtgui_menu_item_t; //��ͨ�˵�
+typedef struct rtgui_menu rtgui_menu_t;//�˵�
+
+
+/** Gets the type of a view */
+#define RTGUI_MENU_TYPE (rtgui_menu_type_get())
+/** Casts the object to an rtgui_view_t */
+#define RTGUI_MENU(obj) (RTGUI_OBJECT_CAST((obj), RTGUI_MENU_TYPE, rtgui_menu_t))
+/** Checks if the object is an rtgui_view_t */
+#define RTGUI_IS_MENU(obj) (RTGUI_OBJECT_CHECK_TYPE((obj), RTGUI_MENU_TYPE))
+
+struct rtgui_menu
+{
+ rtgui_widget_t parent;
+ char* name;
+ /* ���ڸ�����ͼ�IJ���,��������ͼ,ȥ����Щ����û��Ӱ�� */
+ rt_uint32_t orient; /* ����� */
+ rt_uint32_t item_size; /* �˵���ߴ� */
+ rt_uint16_t item_count; /* �˵����� */
+
+ rtgui_menu_item_t* current_item; /* ��ǰ�IJ˵��� */
+ rtgui_menu_item_t* forego_item; /* ��һ���˵��� */
+
+ /*�¼��˵��� */
+ rtgui_menu_item_t* head; /*ͷ*/
+ rtgui_menu_item_t* tail; /*β*/
+ /*�ϼ��˵��� */
+ rtgui_menu_item_t* farther;
+};
+
+struct rtgui_menu_item
+{
+ char* caption; //�˵���
+ rt_uint32_t item_id;
+ rt_uint32_t type; //�˵��Ĵ�������
+ rt_uint32_t shortcut;
+ rt_bool_t bexit; //���øò˵����Ƿ��˳��˵�
+
+ rtgui_menu_item_t* next;
+ rtgui_menu_item_t* prev;
+
+ rtgui_image_t* image; //�󶨵�ͼ��
+ rtgui_menu_t* sub_menu; //�Ӳ˵�
+
+ void(*func_updown)(rtgui_menu_t *menu); //��UP/DOWN����֮�����еĺ���
+ void(*func_enter)(void); //��ȷ�Ϻ�ִ�еĺ���
+};
+
+rtgui_type_t *rtgui_menu_type_get(void);
+
+rtgui_menu_t* rtgui_menu_create(PVOID parent, const char* name);
+void rtgui_menu_destroy(rtgui_menu_t* menu);
+
+
+HMENU rtgui_menu_popup_create (void);
+rt_bool_t rtgui_menu_append(rtgui_menu_t *menu,rt_uint32_t flags,rt_uint32_t ID,char * caption);
+void rtgui_menu_popup_delete(rtgui_menu_t* menu);
+rtgui_menu_t* rtgui_menu_item_delete(rtgui_menu_t* menu,rtgui_menu_item_t* pItem);
+void rtgui_menu_on_down(rtgui_menu_t* menu);
+void rtgui_menu_on_up(rtgui_menu_t* menu);
+void rtgui_menu_on_exit(rtgui_menu_t* menu);
+void rtgui_menu_set_selected(rtgui_menu_t* menu, int selected);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/components/rtgui_win/include/rtgui/widgets/progressbar.h b/components/rtgui_win/include/rtgui/widgets/progressbar.h
new file mode 100644
index 0000000000..c2133a93dd
--- /dev/null
+++ b/components/rtgui_win/include/rtgui/widgets/progressbar.h
@@ -0,0 +1,40 @@
+#ifndef __RTGUI_PROGRESSBAR_H__
+#define __RTGUI_PROGRESSBAR_H__
+
+#include <rtgui/rtgui.h>
+
+typedef struct rtgui_progressbar rtgui_progressbar_t;
+
+/** Gets the type of a progressbar */
+#define RTGUI_PROGRESSBAR_TYPE (rtgui_progressbar_type_get())
+/** Casts the object to a rtgui_progressbar */
+#define RTGUI_PROGRESSBAR(obj) (RTGUI_OBJECT_CAST((obj), RTGUI_PROGRESSBAR_TYPE, rtgui_progressbar_t))
+/** Checks if the object is a rtgui_progressbar */
+#define RTGUI_IS_PROGRESSBAR(obj) (RTGUI_OBJECT_CHECK_TYPE((obj), RTGUI_PROGRESSBAR_TYPE))
+
+#define DEFAULT_WIDTH 100
+#define DEFAULT_HEIGHT 20
+
+struct rtgui_progressbar
+{
+ rtgui_widget_t parent;
+
+ int orient;
+
+ int range;
+ int position;
+};
+
+rtgui_type_t *rtgui_progressbar_type_get(void);
+
+rtgui_progressbar_t* rtgui_progressbar_create(PVOID parent, int orient, int range, int left, int top, int w, int h);
+void rtgui_progressbar_destroy(rtgui_progressbar_t* p_bar);
+
+rt_bool_t rtgui_progressbar_event_handler(PVOID wdt, rtgui_event_t* event);
+
+void rtgui_progressbar_set_value(rtgui_progressbar_t *p_bar, int value);
+int rtgui_progressbar_get_value(rtgui_progressbar_t *p_bar);
+void rtgui_progressbar_set_range(rtgui_progressbar_t *p_bar, int range);
+int rtgui_progressbar_get_range(rtgui_progressbar_t *p_bar);
+
+#endif
diff --git a/components/rtgui_win/include/rtgui/widgets/radiobox.h b/components/rtgui_win/include/rtgui/widgets/radiobox.h
new file mode 100644
index 0000000000..3856c98bff
--- /dev/null
+++ b/components/rtgui_win/include/rtgui/widgets/radiobox.h
@@ -0,0 +1,42 @@
+#ifndef __RTGUI_RADIOBOX_H__
+#define __RTGUI_RADIOBOX_H__
+
+#include <rtgui/rtgui.h>
+#include <rtgui/kbddef.h>
+#include <rtgui/widgets/container.h>
+
+/** Gets the type of a rbox */
+#define RTGUI_RADIOBOX_TYPE (rtgui_radiobox_type_get())
+/** Casts the object to an rtgui_radiobox_t */
+#define RTGUI_RADIOBOX(obj) (RTGUI_OBJECT_CAST((obj), RTGUI_RADIOBOX_TYPE, rtgui_radiobox_t))
+/** Checks if the object is an rtgui_radiobox_t */
+#define RTGUI_IS_RADIOBOX(obj) (RTGUI_OBJECT_CHECK_TYPE((obj), RTGUI_RADIOBOX_TYPE))
+
+struct rtgui_radiobox
+{
+ rtgui_container_t parent;
+
+ char* name;
+
+ rt_uint32_t orient;
+ rt_uint32_t item_count;
+ rt_bool_t item_sel;
+
+ char **items;
+};
+
+typedef struct rtgui_radiobox rtgui_radiobox_t;
+
+rtgui_type_t *rtgui_radiobox_type_get(void);
+
+rtgui_radiobox_t* rtgui_radiobox_create(PVOID parent, const char* name, int orient, char **items, int count,
+ int left, int top, int w, int h);
+void rtgui_radiobox_destroy(rtgui_radiobox_t* rbox);
+
+void rtgui_radiobox_set_selection(rtgui_radiobox_t* rbox, int selection);
+int rtgui_radiobox_get_selection(rtgui_radiobox_t* rbox);
+
+rt_bool_t rtgui_radiobox_event_handler(PVOID wdt, rtgui_event_t* event);
+
+#endif
+
diff --git a/components/rtgui_win/include/rtgui/widgets/scrollbar.h b/components/rtgui_win/include/rtgui/widgets/scrollbar.h
new file mode 100644
index 0000000000..934114e755
--- /dev/null
+++ b/components/rtgui_win/include/rtgui/widgets/scrollbar.h
@@ -0,0 +1,92 @@
+/*
+ * File : scrollbar.h
+ * This file is part of RT-Thread RTOS
+ * COPYRIGHT (C) 2006 - 2010, RT-Thread Development Team
+ *
+ * The license and distribution terms for this file may be
+ * found in the file LICENSE in this distribution or at
+ * http://www.rt-thread.org/license/LICENSE
+ *
+ * Change Logs:
+ * Date Author Notes
+ * 2010-08-09 Bernard first version
+ */
+#ifndef __RTGUI_SCROLLBAR_H__
+#define __RTGUI_SCROLLBAR_H__
+
+#include <rtgui/rtgui.h>
+#include <rtgui/widgets/widget.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/** Gets the type of a scrollbar */
+#define RTGUI_SCROLLBAR_TYPE (rtgui_scrollbar_type_get())
+/** Casts the object to an rtgui_scrollbar */
+#define RTGUI_SCROLLBAR(obj) (RTGUI_OBJECT_CAST((obj), RTGUI_SCROLLBAR_TYPE, rtgui_scrollbar_t))
+/** Checks if the object is an rtgui_scrollbar */
+#define RTGUI_IS_SCROLLBAR(obj) (RTGUI_OBJECT_CHECK_TYPE((obj), RTGUI_SCROLLBAR_TYPE))
+
+#define RTGUI_DEFAULT_SB_WIDTH 16
+
+/* scrollbar status/positions*/
+#define SBAR_UNKNOWN 0x0000
+#define SBAR_LEFTARROW 0x0001 //������ť��
+#define SBAR_RIGHTARROW 0x0002 //�����Ұ�ť��
+#define SBAR_LEFTSPACE 0x0004 //�ڻ�����հ״�
+#define SBAR_RIGHTSPACE 0x0008 //�ڻ���Ҳ�հ״�
+#define SBAR_HORZTHUMB 0x0010 //���ˮƽ����
+#define SBAR_UPARROW 0x0020 //״̬����
+#define SBAR_DOWNARROW 0x0040 //״̬����
+#define SBAR_UPSPACE 0x0080 //�ڻ���ϲ�հ״�
+#define SBAR_DOWNSPACE 0x0100 //�ڻ���²�հ״�
+#define SBAR_VERTTHUMB 0x0200 //��鴹ֱ����
+
+#define SBAR_UPTHUMB 0x0400 //������ϻ���
+#define SBAR_DOWNTHUMB 0x0800 //������»���
+#define SBAR_LEFTTHUMB 0x1000 //������󻬶�
+#define SBAR_RIGHTTHUMB 0x2000 //������һ���
+
+struct rtgui_scrollbar
+{
+ /* inherit from widget */
+ rtgui_widget_t parent;
+
+ rt_uint32_t orient;
+ rt_uint32_t status;
+
+ /* page_step = display lines of scrollbar */
+ /* thumb_len = line_step * page_step / (page_step - (button width * 2)) */
+ rt_int16_t line_step, page_step;
+ rt_int16_t value, thumb_len,thumb_w;
+ /* position 1:1 width of scrollbar */
+ rt_int16_t count;
+
+ PVOID widgetlnk;//���ӵĿؼ�
+ rt_bool_t (*on_scroll) (PVOID wdt, rtgui_event_t* event);
+};
+typedef struct rtgui_scrollbar rtgui_scrollbar_t;
+
+rtgui_type_t *rtgui_scrollbar_type_get(void);
+
+rtgui_scrollbar_t* rtgui_scrollbar_create(PVOID wdt,int left,int top,int w,int len,int orient);
+void rtgui_scrollbar_destroy(rtgui_scrollbar_t* bar);
+
+void rtgui_scrollbar_get_thumb_rect(rtgui_scrollbar_t *bar, rtgui_rect_t *erect);
+
+void rtgui_scrollbar_set_range(rtgui_scrollbar_t* bar, int count);
+void rtgui_scrollbar_set_value(rtgui_scrollbar_t* bar, rt_int16_t value);
+
+void rtgui_scrollbar_set_onscroll(rtgui_scrollbar_t* bar, rtgui_event_handler_ptr handler);
+void rtgui_scrollbar_set_orientation(rtgui_scrollbar_t* bar, int orient);
+void rtgui_scrollbar_set_page_step(rtgui_scrollbar_t* bar, int step);
+void rtgui_scrollbar_set_line_step(rtgui_scrollbar_t* bar, int step);
+
+rt_bool_t rtgui_scrollbar_event_handler(PVOID wdt, rtgui_event_t* event);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/components/rtgui_win/include/rtgui/widgets/slider.h b/components/rtgui_win/include/rtgui/widgets/slider.h
new file mode 100644
index 0000000000..b94ced24e4
--- /dev/null
+++ b/components/rtgui_win/include/rtgui/widgets/slider.h
@@ -0,0 +1,40 @@
+#ifndef __RTGUI_SLIDER_H__
+#define __RTGUI_SLIDER_H__
+
+#include <rtgui/rtgui.h>
+#include <rtgui/kbddef.h>
+
+typedef struct rtgui_slider rtgui_slider_t;
+
+/** Gets the type of a slider */
+#define RTGUI_SLIDER_TYPE (rtgui_slider_type_get())
+/** Casts the object to an rtgui_slider */
+#define RTGUI_SLIDER(obj) (RTGUI_OBJECT_CAST((obj), RTGUI_SLIDER_TYPE, rtgui_slider_t))
+/** Checks if the object is an rtgui_slider */
+#define RTGUI_IS_SLIDER(obj) (RTGUI_OBJECT_CHECK_TYPE((obj), RTGUI_SLIDER_TYPE))
+
+struct rtgui_slider
+{
+ rtgui_widget_t parent;
+
+ /* widget private data */
+ rt_size_t min, max, value, ticks;
+ rt_size_t thumb_width;
+
+ int orient;
+};
+
+rtgui_type_t *rtgui_slider_type_get(void);
+
+rtgui_slider_t* rtgui_slider_create(PVOID parent, rt_size_t min, rt_size_t max, int left, int top, int w, int h, int orient);
+void rtgui_slider_destroy(rtgui_slider_t* slider);
+
+rt_bool_t rtgui_slider_event_handler(PVOID wdt, rtgui_event_t* event);
+
+void rtgui_slider_set_range(rtgui_slider_t* slider, rt_size_t min, rt_size_t max);
+void rtgui_slider_set_value(rtgui_slider_t* slider, rt_size_t value);
+void rtgui_slider_set_orientation(rtgui_slider_t* slider, int orient);
+
+rt_size_t rtgui_slider_get_value(rtgui_slider_t* slider);
+
+#endif
diff --git a/components/rtgui_win/include/rtgui/widgets/staticline.h b/components/rtgui_win/include/rtgui/widgets/staticline.h
new file mode 100644
index 0000000000..b63e6c25af
--- /dev/null
+++ b/components/rtgui_win/include/rtgui/widgets/staticline.h
@@ -0,0 +1,32 @@
+#ifndef __RTGUI_STATICLINE__H__
+#define __RTGUI_STATICLINE__H__
+
+#include <rtgui/rtgui.h>
+
+/*
+ * the static line widget
+ */
+
+/** Gets the type of a sline */
+#define RTGUI_STATICLINE_TYPE (rtgui_staticline_type_get())
+/** Casts the object to an rtgui_staticline_t */
+#define RTGUI_STATICLINE(obj) (RTGUI_OBJECT_CAST((obj), RTGUI_STATICLINE_TYPE, rtgui_staticline_t))
+/** Checks if the object is an rtgui_staticline_t */
+#define RTGUI_IS_STATICLINE(obj) (RTGUI_OBJECT_CHECK_TYPE((obj), RTGUI_STATICLINE_TYPE))
+
+struct rtgui_staticline
+{
+ /* inherit from widget */
+ rtgui_widget_t parent;
+
+ int orient;
+};
+typedef struct rtgui_staticline rtgui_staticline_t;
+
+rtgui_staticline_t *rtgui_staticline_create(PVOID wdt,int left,int top,int w,int len,int orient);
+void rtgui_staticline_destroy(rtgui_staticline_t* sline);
+
+rt_bool_t rtgui_staticline_event_handler(PVOID wdt, rtgui_event_t* event);
+
+#endif
+
diff --git a/components/rtgui_win/include/rtgui/widgets/textbox.h b/components/rtgui_win/include/rtgui/widgets/textbox.h
new file mode 100644
index 0000000000..4638da48a1
--- /dev/null
+++ b/components/rtgui_win/include/rtgui/widgets/textbox.h
@@ -0,0 +1,78 @@
+/*
+ * File : textbox.h
+ * This file is part of RT-Thread RTOS
+ * COPYRIGHT (C) 2006 - 2009, RT-Thread Development Team
+ *
+ * The license and distribution terms for this file may be
+ * found in the file LICENSE in this distribution or at
+ * http://www.rt-thread.org/license/LICENSE
+ *
+ * Change Logs:
+ * Date Author Notes
+ * 2009-10-16 Bernard first version
+ */
+#ifndef __RTGUI_TEXTBOX_H__
+#define __RTGUI_TEXTBOX_H__
+
+#include <rtgui/rtgui.h>
+#include <rtgui/rtgui_system.h>
+
+/** Gets the type of a textbox */
+#define RTGUI_TEXTBOX_TYPE (rtgui_textbox_type_get())
+/** Casts the object to a rtgui_textbox_t */
+#define RTGUI_TEXTBOX(obj) (RTGUI_OBJECT_CAST((obj), RTGUI_TEXTBOX_TYPE, rtgui_textbox_t))
+/** Checks if the object is a rtgui_textbox_t */
+#define RTGUI_IS_TEXTBOX(obj) (RTGUI_OBJECT_CHECK_TYPE((obj), RTGUI_TEXTBOX_TYPE))
+
+#define RTGUI_TEXTBOX_DEFAULT_WIDTH 80
+#define RTGUI_TEXTBOX_DEFAULT_HEIGHT 20
+
+#define RTGUI_TEXTBOX_NONE 0x00
+#define RTGUI_TEXTBOX_MULTI 0x01 //����
+#define RTGUI_TEXTBOX_MASK 0x02 //����
+#define RTGUI_TEXTBOX_DIGIT 0x04 //������������
+#define RTGUI_TEXTBOX_CARET_SHOW 0x10
+#define RTGUI_TEXTBOX_CARET_STAT 0x20
+
+#define RTGUI_TEXTBOX_LINE_MAX 128 //���ij���
+
+struct rtgui_textbox
+{
+ /* inherit from widget */
+ rtgui_widget_t parent;
+
+ /* text box flag */
+ rt_uint32_t flag;
+ rt_uint32_t isedit;//�Ƿ�ɱ༭
+
+ /* current line and position */
+ rt_uint16_t line, line_begin, position, line_length;
+ rt_uint16_t dis_length; /*may be display length.*/
+ char* text;
+ rt_size_t font_width;
+
+ rtgui_timer_t* caret_timer;
+
+ /* widget private data */
+ rt_bool_t (*on_change)(PVOID wdt, rtgui_event_t* event);
+ rt_bool_t (*on_enter) (PVOID wdt, rtgui_event_t* event);
+};
+typedef struct rtgui_textbox rtgui_textbox_t;
+
+void _rtgui_textbox_constructor(rtgui_textbox_t *box);
+void _rtgui_textbox_deconstructor(rtgui_textbox_t *textbox);
+rtgui_type_t *rtgui_textbox_type_get(void);
+
+rtgui_textbox_t* rtgui_textbox_create(PVOID wdt,const char* text,int left,int top,int w,int h, rt_uint32_t flag);
+void rtgui_textbox_destroy(rtgui_textbox_t* box);
+
+rt_bool_t rtgui_textbox_event_handler(PVOID wdt, rtgui_event_t* event);
+
+void rtgui_textbox_set_value(rtgui_textbox_t* box, const char* text);
+const char* rtgui_textbox_get_value(rtgui_textbox_t* box);
+
+void rtgui_textbox_set_line_length(rtgui_textbox_t* box, rt_size_t length);
+
+void rtgui_textbox_get_edit_rect(rtgui_textbox_t *box,rtgui_rect_t *rect);
+
+#endif
diff --git a/components/rtgui_win/include/rtgui/widgets/view.h b/components/rtgui_win/include/rtgui/widgets/view.h
new file mode 100644
index 0000000000..f0639c3f45
--- /dev/null
+++ b/components/rtgui_win/include/rtgui/widgets/view.h
@@ -0,0 +1,62 @@
+/*
+ * File : view.h
+ * This file is part of RT-Thread RTOS
+ * COPYRIGHT (C) 2006 - 2009, RT-Thread Development Team
+ *
+ * The license and distribution terms for this file may be
+ * found in the file LICENSE in this distribution or at
+ * http://www.rt-thread.org/license/LICENSE
+ *
+ * Change Logs:
+ * Date Author Notes
+ * 2009-10-16 Bernard first version
+ */
+#ifndef __RTGUI_VIEW_H__
+#define __RTGUI_VIEW_H__
+
+#include <rtgui/widgets/container.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/** Gets the type of a view */
+#define RTGUI_VIEW_TYPE (rtgui_view_type_get())
+/** Casts the object to an rtgui_view_t */
+#define RTGUI_VIEW(obj) (RTGUI_OBJECT_CAST((obj), RTGUI_VIEW_TYPE, rtgui_view_t))
+/** Checks if the object is an rtgui_view_t */
+#define RTGUI_IS_VIEW(obj) (RTGUI_OBJECT_CHECK_TYPE((obj), RTGUI_VIEW_TYPE))
+
+/*
+ * the view widget
+ */
+struct rtgui_view
+{
+ /* inherit from box */
+ rtgui_container_t parent;
+
+ /* private field */
+ char* title;
+};
+typedef struct rtgui_view rtgui_view_t;
+
+rtgui_type_t *rtgui_view_type_get(void);
+
+rtgui_view_t *rtgui_view_create(PVOID wdt,const char* title,int left,int top,int w,int h);
+void rtgui_view_destroy(rtgui_view_t* view);
+
+rt_bool_t rtgui_view_event_handler(PVOID wdt, rtgui_event_t* event);
+
+rt_bool_t rtgui_view_show(rtgui_view_t* view);
+void rtgui_view_hide(rtgui_view_t* view);
+
+char* rtgui_view_get_title(rtgui_view_t* view);
+void rtgui_view_set_title(rtgui_view_t* view, const char* title);
+void rtgui_view_show_child(PVOID wdt,const char* name);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/components/rtgui_win/include/rtgui/widgets/widget.h b/components/rtgui_win/include/rtgui/widgets/widget.h
new file mode 100644
index 0000000000..1cddfd267b
--- /dev/null
+++ b/components/rtgui_win/include/rtgui/widgets/widget.h
@@ -0,0 +1,168 @@
+/*
+ * File : widget.h
+ * This file is part of RTGUI in RT-Thread RTOS
+ * COPYRIGHT (C) 2006 - 2009, RT-Thread Development Team
+ *
+ * The license and distribution terms for this file may be
+ * found in the file LICENSE in this distribution or at
+ * http://www.rt-thread.org/license/LICENSE
+ *
+ * Change Logs:
+ * Date Author Notes
+ * 2009-10-04 Bernard first version
+ */
+#ifndef __RTGUI_WIDGET_H__
+#define __RTGUI_WIDGET_H__
+
+#include <rtgui/rtgui.h>
+#include <rtgui/color.h>
+#include <rtgui/font.h>
+#include <rtgui/list.h>
+#include <rtgui/region.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef struct rtgui_widget rtgui_widget_t;
+
+/** Gets the type of a widget */
+#define RTGUI_WIDGET_TYPE (rtgui_widget_type_get())
+/** Casts the object to a rtgui_widget */
+#define RTGUI_WIDGET(obj) (RTGUI_OBJECT_CAST((obj), RTGUI_WIDGET_TYPE, rtgui_widget_t))
+/** Check if the object is a rtgui_widget */
+#define RTGUI_IS_WIDGET(obj) (RTGUI_OBJECT_CHECK_TYPE((obj), RTGUI_WIDGET_TYPE))
+
+/*
+ * the base widget object
+ */
+struct rtgui_widget
+{
+ rtgui_object_t object; /* inherit from rtgui_object_t */
+ rtgui_widget_t *parent, *toplevel; /* the parent and root widget */
+ rtgui_list_t sibling; /* the widget child and sibling */
+ rt_uint32_t flag; /* widget flag */
+
+ rt_uint32_t dc_type; /* hardware device context */
+ const struct rtgui_dc_engine* dc_engine;
+ rtgui_gc_t gc; /* the graphic context of widget */
+ rt_uint16_t tab_index; /* table detect order */
+ rt_uint16_t tab_stop;
+ rtgui_rect_t extent; /* the widget extent */
+ rt_uint32_t align; /* widget align */
+ rt_uint16_t border,border_style;
+ rtgui_region_t clip; /* the rect clip */
+
+ rt_bool_t (*event_handler)(PVOID wdt, rtgui_event_t* event);/* the event handler */
+
+ rt_bool_t (*on_focus_in)(PVOID wdt, rtgui_event_t* event);/* call back */
+ rt_bool_t (*on_focus_out)(PVOID wdt, rtgui_event_t* event);
+ rt_bool_t (*on_draw)(PVOID wdt, rtgui_event_t* event);
+ rt_bool_t (*on_mouseclick)(PVOID wdt, rtgui_event_t* event);
+ rt_bool_t (*on_key)(PVOID wdt, rtgui_event_t* event);
+ rt_bool_t (*on_size)(PVOID wdt, rtgui_event_t* event);
+ rt_bool_t (*on_command)(PVOID wdt, rtgui_event_t* event);
+
+ rt_uint32_t user_data; /* reserved user data */
+};
+
+#define RTGUI_WIDGET_FOREGROUND(w) (RTGUI_WIDGET(w))->gc.foreground
+#define RTGUI_WIDGET_BACKGROUND(w) (RTGUI_WIDGET(w))->gc.background
+#define RTGUI_WIDGET_FONT(w) (RTGUI_WIDGET(w))->gc.font
+#define RTGUI_WIDGET_TEXTALIGN(w) (RTGUI_WIDGET(w))->gc.textalign
+
+#define RTGUI_WIDGET_FLAG(w) (RTGUI_WIDGET(w))->flag
+#define RTGUI_WIDGET_ALIGN(w) (RTGUI_WIDGET(w))->align
+#define RTGUI_WIDGET_EVENT_HANDLE(w) (RTGUI_WIDGET(w))->event_handler
+#define RTGUI_WIDGET_EVENT_CALL(w,e) (RTGUI_WIDGET(w))->event_handler(w,e)
+#define RTGUI_WIDGET_PARENT(w) (RTGUI_WIDGET(w))->parent
+#define RTGUI_WIDGET_EXTENT(w) (RTGUI_WIDGET(w))->extent
+#define RTGUI_WIDGET_BORDER(w) (RTGUI_WIDGET(w))->border
+#define RTGUI_WIDGET_BORDER_STYLE(w) (RTGUI_WIDGET(w))->border_style
+#define RTGUI_WIDGET_CLIP(w) (RTGUI_WIDGET(w))->clip
+
+#define RTGUI_WIDGET_FLAG_DEFAULT 0x0000 //Ĭ��
+#define RTGUI_WIDGET_FLAG_HIDE 0x0001 //���ص�
+#define RTGUI_WIDGET_FLAG_DISABLE 0x0002 //����
+#define RTGUI_WIDGET_FLAG_FOCUS 0x0004 //�����
+#define RTGUI_WIDGET_FLAG_TRANSPARENT 0x0008 //͸����
+#define RTGUI_WIDGET_FLAG_FOCUSABLE 0x0010 //�ɻ�ý����
+#define RTGUI_WIDGET_FLAG_DC_VISIBLE 0x0100
+
+#define RTGUI_WIDGET_UNHIDE(w) RTGUI_WIDGET_FLAG(w) &= ~RTGUI_WIDGET_FLAG_HIDE
+#define RTGUI_WIDGET_HIDE(w) RTGUI_WIDGET_FLAG(w) |= RTGUI_WIDGET_FLAG_HIDE
+#define RTGUI_WIDGET_IS_HIDE(w) (RTGUI_WIDGET_FLAG(w) & RTGUI_WIDGET_FLAG_HIDE)
+
+#define RTGUI_WIDGET_ENABLE(w) RTGUI_WIDGET_FLAG(w) &= ~RTGUI_WIDGET_FLAG_DISABLE
+#define RTGUI_WIDGET_DISABLE(w) RTGUI_WIDGET_FLAG(w) |= RTGUI_WIDGET_FLAG_DISABLE
+#define RTGUI_WIDGET_IS_ENABLE(w) !(RTGUI_WIDGET_FLAG(w) & RTGUI_WIDGET_FLAG_DISABLE)
+
+#define RTGUI_WIDGET_UNFOCUS(w) RTGUI_WIDGET_FLAG(w) &= ~RTGUI_WIDGET_FLAG_FOCUS
+#define RTGUI_WIDGET_FOCUS(w) RTGUI_WIDGET_FLAG(w) |= RTGUI_WIDGET_FLAG_FOCUS
+#define RTGUI_WIDGET_IS_FOCUSED(w) (RTGUI_WIDGET_FLAG(w) & RTGUI_WIDGET_FLAG_FOCUS)
+
+#define RTGUI_WIDGET_IS_FOCUSABLE(w) (RTGUI_WIDGET_FLAG(w) & RTGUI_WIDGET_FLAG_FOCUSABLE)
+
+#define RTGUI_WIDGET_IS_DC_VISIBLE(w) (RTGUI_WIDGET_FLAG(w) & RTGUI_WIDGET_FLAG_DC_VISIBLE)
+#define RTGUI_WIDGET_DC_SET_VISIBLE(w) RTGUI_WIDGET_FLAG(w) |= RTGUI_WIDGET_FLAG_DC_VISIBLE
+#define RTGUI_WIDGET_DC_SET_UNVISIBLE(w) RTGUI_WIDGET_FLAG(w) &= ~RTGUI_WIDGET_FLAG_DC_VISIBLE
+#define RTGUI_WIDGET_DC(w) ((rtgui_dc_t*)&(RTGUI_WIDGET(w)->dc_type))
+
+rtgui_type_t *rtgui_widget_type_get(void);
+PVOID rtgui_widget_create(rtgui_type_t *widget_type);
+void rtgui_widget_destroy(PVOID wdt);
+
+/* set the event handler of widget */
+void rtgui_widget_set_event_handler(PVOID wdt, rtgui_event_handler_ptr handler);
+/* widget default event handler */
+rt_bool_t rtgui_widget_event_handler(PVOID wdt, rtgui_event_t* event);
+
+/* focus and unfocus */
+PVOID rtgui_widget_get_focus(PVOID wdt);
+void rtgui_widget_focus(PVOID wdt);
+void rtgui_widget_unfocus(PVOID wdt);
+
+/* event handler for each command */
+void rtgui_widget_set_onfocus(PVOID wdt, rtgui_event_handler_ptr handler);
+void rtgui_widget_set_onunfocus(PVOID wdt, rtgui_event_handler_ptr handler);
+
+void rtgui_widget_set_ondraw(PVOID wdt, rtgui_event_handler_ptr handler);
+void rtgui_widget_set_onmouseclick(PVOID wdt, rtgui_event_handler_ptr handler);
+void rtgui_widget_set_onkey(PVOID wdt, rtgui_event_handler_ptr handler);
+void rtgui_widget_set_onsize(PVOID wdt, rtgui_event_handler_ptr handler);
+void rtgui_widget_set_oncommand(PVOID wdt, rtgui_event_handler_ptr handler);
+
+void rtgui_widget_get_rect(PVOID wdt, rtgui_rect_t *rect);/* get and set rect of widget */
+void rtgui_widget_set_rect(PVOID wdt, rtgui_rect_t* rect);
+void rtgui_widget_get_position(PVOID wdt, rtgui_point_t *p);
+rt_uint16_t rtgui_widget_get_width(PVOID wdt);
+rt_uint16_t rtgui_widget_get_height(PVOID wdt);
+
+void rtgui_widget_set_style(PVOID wdt, rt_uint32_t style);
+void rtgui_widget_point_to_device(PVOID wdt, rtgui_point_t *point);/* get the physical position of a logic point on widget */
+void rtgui_widget_rect_to_device(PVOID wdt, rtgui_rect_t *rect);/* get the physical position of a logic rect on widget */
+void rtgui_widget_point_to_logic(PVOID wdt, rtgui_point_t *point);/* get the logic position of a physical point on widget */
+void rtgui_widget_rect_to_logic(PVOID wdt, rtgui_rect_t *rect);/* get the logic position of a physical rect on widget */
+void rtgui_widget_move_to_logic(PVOID wdt, int dx, int dy);/* move widget and its child to a logic point */
+
+/* update the clip info of widget */
+void rtgui_widget_update_clip(PVOID wdt);
+void rtgui_widget_update_clip_pirate(PVOID wdt,PVOID topwdt);
+
+PVOID rtgui_widget_get_toplevel(PVOID wdt); /* get the toplevel widget of widget */
+void rtgui_widget_show(PVOID wdt);
+void rtgui_widget_hide(PVOID wdt);
+void rtgui_widget_update(PVOID wdt);
+/* get parent color */
+rtgui_color_t rtgui_widget_get_parent_foreground(PVOID wdt);
+rtgui_color_t rtgui_widget_get_parent_background(PVOID wdt);
+/* get the next sibling of widget */
+rtgui_widget_t* rtgui_widget_get_next_sibling(PVOID wdt);
+/* get the prev sibling of widget */
+rtgui_widget_t* rtgui_widget_get_prev_sibling(PVOID wdt);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/components/rtgui_win/include/rtgui/widgets/window.h b/components/rtgui_win/include/rtgui/widgets/window.h
new file mode 100644
index 0000000000..7a5f32a346
--- /dev/null
+++ b/components/rtgui_win/include/rtgui/widgets/window.h
@@ -0,0 +1,130 @@
+/*
+ * File : window.h
+ * This file is part of RTGUI in RT-Thread RTOS
+ * COPYRIGHT (C) 2006 - 2009, RT-Thread Development Team
+ *
+ * The license and distribution terms for this file may be
+ * found in the file LICENSE in this distribution or at
+ * http://www.rt-thread.org/license/LICENSE
+ *
+ * Change Logs:
+ * Date Author Notes
+ * 2009-10-04 Bernard first version
+ * 2010-05-03 Bernard add win close function
+ */
+#ifndef __RTGUI_WINDOW_H__
+#define __RTGUI_WINDOW_H__
+
+#include <rtgui/rtgui.h>
+#include <rtgui/widgets/container.h>
+
+/** Gets the type of a win */
+#define RTGUI_WIN_TYPE (rtgui_win_type_get())
+/** Casts the object to an rtgui_win_t */
+#define RTGUI_WIN(obj) (RTGUI_OBJECT_CAST((obj), RTGUI_WIN_TYPE, rtgui_win_t))
+/** Checks if the object is an rtgui_win_t */
+#define RTGUI_IS_WIN(obj) (RTGUI_OBJECT_CHECK_TYPE((obj), RTGUI_WIN_TYPE))
+
+#define RTGUI_WIN_CLOSEBOX_WIDTH 16
+#define RTGUI_WIN_CLOSEBOX_HEIGHT 16
+
+#define RTGUI_WIN_TITLE_HEIGHT 20 //�������߶�
+#define RTGUI_WIN_STATUS_HEIGHT 20 //״̬���߶�
+#define RTGUI_WIN_MENU_HEIGHT 20 //�˵����߶�
+
+//���ڵ�״̬
+#define RTGUI_WIN_STATUS_MODAL (1ul << 0) //ģʽ����
+#define RTGUI_WIN_STATUS_MIN (1ul << 1)
+#define RTGUI_WIN_STATUS_MAX (1ul << 2) //���ڴ������״̬
+#define RTGUI_WIN_STATUS_CLOSED (1ul << 3) //�رյ�
+#define RTGUI_WIN_STATUS_ACTIVATE (1ul << 4) //���
+#define RTGUI_WIN_STATUS_FOCUS (1ul << 5) //��ý����
+
+#define RTGUI_WIN_IS_MODAL_MODE(w) (w->status & RTGUI_WIN_STATUS_MODAL)
+//���ڵ���ʽ,����
+#define RTGUI_WIN_TITLE (1ul << 1) //������
+#define RTGUI_WIN_STATUS (1ul << 2) //״̬��
+#define RTGUI_WIN_MENU (1ul << 3) //�˵���
+#define RTGUI_WIN_BORDER (1ul << 4) //�߿�
+#define RTGUI_WIN_MINBOX (1ul << 5) //��С����ť
+#define RTGUI_WIN_MAXBOX (1ul << 6) //��󻯰�ť
+#define RTGUI_WIN_CLOSEBOX (1ul << 7) //�رհ�ť
+#define RTGUI_WIN_MINBOX_PRESSED (1ul << 8)
+#define RTGUI_WIN_MAXBOX_PRESSED (1ul << 9)
+#define RTGUI_WIN_CLOSEBOX_PRESSED (1ul << 10) //�رհ�ť������
+
+#define RTGUI_WIN_NOTITLE (0)
+#define RTGUI_WIN_DEFAULT (RTGUI_WIN_BORDER|RTGUI_WIN_TITLE|RTGUI_WIN_CLOSEBOX)
+#define RTGUI_WIN_DIALOG (RTGUI_WIN_BORDER|RTGUI_WIN_TITLE|RTGUI_WIN_CLOSEBOX|RTGUI_WIN_MINBOX)
+#define RTGUI_WIN_NORMAL (RTGUI_WIN_BORDER|RTGUI_WIN_TITLE|RTGUI_WIN_CLOSEBOX|RTGUI_WIN_MINBOX|RTGUI_WIN_MAXBOX)
+
+
+struct rtgui_win_title;
+struct rtgui_win_area;
+
+struct rtgui_win
+{
+ /* inherit from top */
+ rtgui_container_t parent;
+
+ /* window title */
+ char* title;
+
+ /* parent top */
+ PVOID modal_widget;
+ rtgui_list_t list; /* window list */
+
+ /* the thread id */
+ struct rt_thread* tid; //�����߳�
+
+ rt_uint32_t style; //���ڵ���ʽ
+ rt_uint32_t status; //���ڵ�״̬
+ rt_uint16_t title_height; //�������߶�
+ rt_uint16_t status_height; //״̬���߶�
+ rt_uint16_t menu_height; //�˵����߶�
+ rt_uint16_t border_size; //����߿����
+
+ /* call back */
+ rt_bool_t (*on_activate)(PVOID wdt, rtgui_event_t* event);
+ rt_bool_t (*on_deactivate)(PVOID wdt, rtgui_event_t* event);
+ rt_bool_t (*on_close)(PVOID wdt, rtgui_event_t* event);
+
+ /* reserved user data */
+ void* user_data;
+};
+
+rtgui_type_t *rtgui_win_type_get(void);
+rtgui_win_t* rtgui_win_create(PVOID parent, const char* title, rtgui_rect_t *rect, rt_uint32_t flag);
+void rtgui_win_destroy(rtgui_win_t* win);
+rtgui_win_t* rtgui_win_get_win_by_widget(PVOID wdt);
+void rtgui_win_close(PVOID wdt, rtgui_event_t *event);
+rt_bool_t rtgui_win_ondraw(rtgui_win_t* win);
+
+void rtgui_win_show(rtgui_win_t* win, rt_bool_t modal);
+void rtgui_win_hiden(rtgui_win_t* win);
+void rtgui_win_end_modal(rtgui_win_t* win);
+
+rt_bool_t rtgui_win_is_activated(rtgui_win_t* win);
+
+void rtgui_win_move(rtgui_win_t* win, int x, int y);
+
+/* reset extent of window */
+void rtgui_win_set_rect(rtgui_win_t* win, rtgui_rect_t* rect);
+void rtgui_win_set_onactivate(rtgui_win_t* win, rtgui_event_handler_ptr handler);
+void rtgui_win_set_ondeactivate(rtgui_win_t* win, rtgui_event_handler_ptr handler);
+void rtgui_win_set_onclose(rtgui_win_t* win, rtgui_event_handler_ptr handler);
+
+rt_bool_t rtgui_win_event_handler(PVOID wdt, rtgui_event_t* event);
+void rtgui_win_event_loop(rtgui_win_t* win);
+
+void rtgui_win_set_title(rtgui_win_t* win, const char *title);
+char* rtgui_win_get_title(rtgui_win_t* win);
+
+rtgui_point_t rtgui_win_get_client_zero(rtgui_win_t *win);
+void rtgui_win_get_client_rect(rtgui_win_t *win, rtgui_rect_t *rect);
+void rtgui_win_get_title_rect(rtgui_win_t *win, rtgui_rect_t *rect);
+void rtgui_win_get_closebox_rect(rtgui_win_t *win, rtgui_rect_t *rect);
+void rtgui_win_get_maxbox_rect(rtgui_win_t *win, rtgui_rect_t *rect);
+void rtgui_win_get_minbox_rect(rtgui_win_t *win, rtgui_rect_t *rect);
+
+#endif