Files
rt-thread/examples/gui/mywidget.c
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
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#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;
/* 获得窗å<E28094>£çš„å°ºå¯?*/
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;
/* 绘制å<C2B6><C3A5>å­—æž?*/
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);
/* æ ¹æ<C2B9>®çжæ€<C3A6>绘制圆åœ?*/
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);
/* 结æ<E2809C>Ÿç»˜å¾ */
rtgui_dc_end_drawing(dc);
return;
}
/* é¼ æ ‡äºä»¶å¤„ç<E2809E>†å‡½æ•° */
static void rtgui_mywidget_onmouse(struct rtgui_mywidget* me, struct rtgui_event_mouse* mouse)
{
struct rtgui_rect rect;
rt_uint16_t x, y;
/* 仅对鼠标抬起动作è¿è¡Œå¤„ç<E2809E>† */
if (!(mouse->button & RTGUI_MOUSE_BUTTON_UP)) return;
/* 获得控件的ä½<C3A4>ç½?*/
rtgui_widget_get_rect(RTGUI_WIDGET(me), &rect);
/* get_rect函数获得是控件的ç¸å¯¹ä½<C3A4>置,而鼠标äºä»¶ç»™å‡ºçš„å<E2809E><C3A5>标是ç»<C3A7>对å<C2B9><C3A5>标,需è¦<C3A8>å<EFBFBD>šä¸€ä¸ªè½¬æ<C2AC>?*/
rtgui_widget_rect_to_device(RTGUI_WIDGET(me), &rect);
/* 计算中心原点 */
x = (rect.x2 + rect.x1)/2;
y = (rect.y2 + rect.y1)/2;
/* 比较鼠标å<E280A1><C3A5>标是å<C2AF>¦åœ¨åœˆå†?*/
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;
/* 刷新(é‡<C3A9>æ°ç»˜åˆ¶)控件 */
rtgui_mywidget_ondraw(me);
}
}
/* mywidget控件的äºä»¶å¤„ç<E2809E>†å‡½æ•?*/
rt_bool_t rtgui_mywidget_event_handler(struct rtgui_widget* widget, struct rtgui_event* event)
{
/* 调用äºä»¶å¤„ç<E2809E>†å‡½æ•°æ—¶ï¼ŒwidgetæŒ‡éˆæŒ‡å<E280A1>控件本身,所以先获得ç¸åº”控件对象的指é?*/
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;
/* å…¶ä»äºä»¶è°ƒç”¨çˆ¶ç±»çš„äºä»¶å¤„ç<E2809E>†å‡½æ•?*/
default:
return rtgui_widget_event_handler(widget, event);
}
return RT_FALSE;
}
/* 自定义控件的构造函�*/
static void _rtgui_mywidget_constructor(rtgui_mywidget_t *mywidget)
{
/* 默认这个控件接收è<C2B6>šç„¦ */
RTGUI_WIDGET(mywidget)->flag |= RTGUI_WIDGET_FLAG_FOCUSABLE;
/* åˆ<C3A5>å§åŒæŽ§ä»¶å¹¶è®¾ç½®äºä»¶å¤„ç<E2809E>†å‡½æ•° */
rtgui_widget_set_event_handler(RTGUI_WIDGET(mywidget), rtgui_mywidget_event_handler);
/* åˆ<C3A5>å§çжæ€<C3A6>æ—¶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));
}