昨晚,试用DC在LCD上绘制一个网格。
发现没能绘制成功。
水平线第一条没画,其他都画了。然后竖线一根都没有画。
我主要是修改demo_view_dc.c中的dc_event_handler函数来画的。
int x,y;
x=30;
y=30;
for ( y = 30; y < 320; )
{
rtgui_dc_draw_hline(dc,0,320,y);
y +=30;
}
for ( x = 30; x < 240; )
{
rtgui_dc_draw_vline(dc,0,240,x);
x +=30;
}
DC 会调用rtgui_dc_hw_draw_hline来画,发现函数里有两行代码如下:
owner = RTGUI_CONTAINER_OF(self, struct rtgui_widget, dc_type);
if (!RTGUI_WIDGET_IS_DC_VISIBLE(owner)) return;
这里owner是指什么呢?我的workbench就只有一个view.
DC不算是一种控件吧。
其实我就想实现在一个view上画个网格线。
你这里指定的是物理绝对坐标,但是DC需要的是逻辑坐标。所以在一个DC上绘图时先要获得owner的位置,然后根据位置进行绘图。
DC的owner控件在开始一个DC绘图时,需要做为函数传入的方式进行指定。
那这里的owner指的是那个对象?(DC自己?还是view?)
demo_view_dc:
/*
恩,谢谢你的回答。但是我想知道的就是这个具体对应到owner的object指的是那个控件。
好无疑问,传进来的都是widget对象。widget是所有控件的父类。
我看到
rtgui_view_t demo_view_dc(rtgui_workbench_t workbench)
{
rtgui_view_t *view;
}
所以我想执行dc_event_handler(rtgui_widget_t widget, rtgui_event_t event)函数时,传进来的
widget是view对象转换来的。是不是这样的?如果这样。owner对应的物理坐标就是view的物理坐标,这样没法解释通下面的代码啊
static void rtgui_dc_hw_draw_hline(struct rtgui_dc self, int x1, int x2, int y)
{
register rt_base_t index;
rtgui_widget_t owner;
。。。。。。。。。。。
}
rtgui_widget_t是一个类别,是一个基类。
所有不同的控件都可以转换成一个基类(rtgui_widget_t)对待。所以,当你需要再哪个控件上进行绘图时,你首先要获得的是这个控件的DC。换个角度,一个DC是属于一个控件的,这个控件就是它的owner。
例如,你需要在一个view上绘图,那么需要取得view的DC(设备图形上下文)。你需要在一个button上绘图,那么就需要取得这个button的DC。