Files
rt-thread/examples/gui/mywidget.c
T
bernard.xiong bfd56fffea use new object type implementation.
git-svn-id: https://rt-thread.googlecode.com/svn/trunk@1403 bbd45198-f89e-11dd-88c7-29a3b14d5316
2011-05-13 10:58:37 +00:00

137 lines
3.7 KiB
C

#include <rtgui/dc.h>
#include "mywidget.h"
/* 控件绘图函数 */
static void rtgui_mywidget_ondraw(struct rtgui_mywidget* me)
{
struct rtgui_dc* dc;
struct rtgui_rect rect;
rt_uint16_t x, y;
/* 获得目标DC,开始绘�*/
dc = rtgui_dc_begin_drawing(RTGUI_WIDGET(me));
if (dc == RT_NULL) return;
/* 获得窗å£çš„å°ºå¯?*/
rtgui_widget_get_rect(RTGUI_WIDGET(me), &rect);
/* 绘制背景�*/
RTGUI_DC_BC(dc) = white;
rtgui_dc_fill_rect(dc, &rect);
/* 计算中心原点 */
x = (rect.x2 + rect.x1)/2;
y = (rect.y2 + rect.y1)/2;
/* 绘制åå­—æž?*/
RTGUI_DC_FC(dc) = black;
rtgui_dc_draw_hline(dc, rect.x1, rect.x2, y);
rtgui_dc_draw_vline(dc, x, rect.y1, rect.y2);
/* æ ¹æ®çжæ€ç»˜åˆ¶åœ†åœ?*/
if (me->status == MYWIDGET_STATUS_ON)
RTGUI_DC_FC(dc) = green;
else
RTGUI_DC_FC(dc) = red;
rtgui_dc_fill_circle(dc, x, y, 5);
/* 结æŸç»˜å›¾ */
rtgui_dc_end_drawing(dc);
return;
}
/* 鼠标事件处ç†å‡½æ•° */
static void rtgui_mywidget_onmouse(struct rtgui_mywidget* me, struct rtgui_event_mouse* mouse)
{
struct rtgui_rect rect;
rt_uint16_t x, y;
/* ä»…å¯¹é¼ æ ‡æŠ¬èµ·åŠ¨ä½œè¿›è¡Œå¤„ç† */
if (!(mouse->button & RTGUI_MOUSE_BUTTON_UP)) return;
/* 获得控件的ä½ç½?*/
rtgui_widget_get_rect(RTGUI_WIDGET(me), &rect);
/* get_rect函数获得是控件的相对ä½ç½®ï¼Œè€Œé¼ æ ‡äº‹ä»¶ç»™å‡ºçš„åæ ‡æ˜¯ç»å¯¹å标,需è¦åšä¸€ä¸ªè½¬æ?*/
rtgui_widget_rect_to_device(RTGUI_WIDGET(me), &rect);
/* 计算中心原点 */
x = (rect.x2 + rect.x1)/2;
y = (rect.y2 + rect.y1)/2;
/* æ¯”è¾ƒé¼ æ ‡åæ ‡æ˜¯å¦åœ¨åœˆå†?*/
if ((mouse->x < x + 5 && mouse->x > x - 5) &&
(mouse->y < y + 5 && mouse->y > y - 5))
{
/* 更改控件状�*/
if (me->status & MYWIDGET_STATUS_ON) me->status = MYWIDGET_STATUS_OFF;
else me->status = MYWIDGET_STATUS_ON;
/* 刷新(釿–°ç»˜åˆ¶)控件 */
rtgui_mywidget_ondraw(me);
}
}
/* mywidget控件的事件处ç†å‡½æ•?*/
rt_bool_t rtgui_mywidget_event_handler(struct rtgui_widget* widget, struct rtgui_event* event)
{
/* 调用事件处ç†å‡½æ•°æ—¶ï¼ŒwidgetæŒ‡é’ˆæŒ‡å‘æŽ§ä»¶æœ¬èº«ï¼Œæ‰€ä»¥å…ˆèŽ·å¾—ç›¸åº”æŽ§ä»¶å¯¹è±¡çš„æŒ‡é’?*/
struct rtgui_mywidget* me = RTGUI_MYWIDGET(widget);
switch (event->type)
{
case RTGUI_EVENT_PAINT:
/* 绘制事件,调用绘图函数绘�*/
rtgui_mywidget_ondraw(me);
break;
case RTGUI_EVENT_MOUSE_BUTTON:
/* 鼠标事件 */
rtgui_mywidget_onmouse(RTGUI_MYWIDGET(me), (struct rtgui_event_mouse*) event);
break;
/* 其他事件调用父类的事件处ç†å‡½æ•?*/
default:
return rtgui_widget_event_handler(widget, event);
}
return RT_FALSE;
}
/* 自定义控件的构造函�*/
static void _rtgui_mywidget_constructor(rtgui_mywidget_t *mywidget)
{
/* 默认这个控件接收èšç„¦ */
RTGUI_WIDGET(mywidget)->flag |= RTGUI_WIDGET_FLAG_FOCUSABLE;
/* åˆå§‹åŒ–控件并设置事件处ç†å‡½æ•° */
rtgui_widget_set_event_handler(RTGUI_WIDGET(mywidget), rtgui_mywidget_event_handler);
/* åˆå§‹çŠ¶æ€æ—¶OFF */
mywidget->status = MYWIDGET_STATUS_OFF;
}
DEFINE_CLASS_TYPE(mywidget, "mywidget",
RTGUI_WIDGET_TYPE,
_rtgui_mywidget_constructor,
RT_NULL,
sizeof(struct rtgui_mywidget));
/* 创建一个自定义控件 */
struct rtgui_mywidget* rtgui_mywidget_create(rtgui_rect_t* r)
{
struct rtgui_mywidget* me;
/* 让rtgui_widget创建出一个指定类型:RTGUI_MYWIDGET_TYPE类型的控�*/
me = (struct rtgui_mywidget*) rtgui_widget_create (RTGUI_MYWIDGET_TYPE);
if (me != RT_NULL)
{
rtgui_widget_set_rect(RTGUI_WIDGET(me), r);
}
return me;
}
/* 删除一个自定义控件 */
void rtgui_mywidget_destroy(struct rtgui_mywidget* me)
{
rtgui_widget_destroy(RTGUI_WIDGET(me));
}