使用 Cairo 实时绘制线条
Drawing lines using Cairo in real time
在 zetcode "Lines" 代码中,我尝试在单击鼠标按钮时实时显示线条。然后我将 clicked 函数更改为
static gboolean clicked(GtkWidget *widget, GdkEventButton *event,
gpointer user_data)
{
if (event->button == 1) {
glob.coordx[glob.count] = event->x;
glob.coordy[glob.count++] = event->y;
gtk_widget_queue_draw(widget);
}
return TRUE;
}
我原以为每次单击按钮 1 时它都会显示线条,但它们根本没有绘制在 window 上。我在这里错过了什么?
绘制时运行的函数 do_drawing()
在其末尾包含此行:
glob.count = 0;
因此它会在绘制完所有数组后清除数组,因此很难像您尝试的那样累积大量行。
如果您正在使用 Zetcode 示例,则需要更改 do_drawing 方法。这是通过每次点击实时绘制一个点来实现的。
static void do_drawing(cairo_t *cr)
{
cairo_set_source_rgb(cr, 0, 0, 0);//Line colour
cairo_set_line_width(cr, 0.5);//Line width
cairo_translate(cr, -170, -170);//Shift where line
//i is starting point, i+1 is next mouse coordinate
int i;
for (i = 0; i < glob.count - 1; i++ ) {
cairo_move_to(cr, glob.coordx[i], glob.coordy[i]);
cairo_line_to(cr, glob.coordx[i+1], glob.coordy[i+1]);
printf("from x:%f, y:%f\t to: x:%f, y:%f\n",glob.coordx[i],glob.coordy[i], glob.coordx[i+1], glob.coordy[i+1]);
cairo_stroke(cr);
}
}
在 zetcode "Lines" 代码中,我尝试在单击鼠标按钮时实时显示线条。然后我将 clicked 函数更改为
static gboolean clicked(GtkWidget *widget, GdkEventButton *event,
gpointer user_data)
{
if (event->button == 1) {
glob.coordx[glob.count] = event->x;
glob.coordy[glob.count++] = event->y;
gtk_widget_queue_draw(widget);
}
return TRUE;
}
我原以为每次单击按钮 1 时它都会显示线条,但它们根本没有绘制在 window 上。我在这里错过了什么?
绘制时运行的函数 do_drawing()
在其末尾包含此行:
glob.count = 0;
因此它会在绘制完所有数组后清除数组,因此很难像您尝试的那样累积大量行。
如果您正在使用 Zetcode 示例,则需要更改 do_drawing 方法。这是通过每次点击实时绘制一个点来实现的。
static void do_drawing(cairo_t *cr)
{
cairo_set_source_rgb(cr, 0, 0, 0);//Line colour
cairo_set_line_width(cr, 0.5);//Line width
cairo_translate(cr, -170, -170);//Shift where line
//i is starting point, i+1 is next mouse coordinate
int i;
for (i = 0; i < glob.count - 1; i++ ) {
cairo_move_to(cr, glob.coordx[i], glob.coordy[i]);
cairo_line_to(cr, glob.coordx[i+1], glob.coordy[i+1]);
printf("from x:%f, y:%f\t to: x:%f, y:%f\n",glob.coordx[i],glob.coordy[i], glob.coordx[i+1], glob.coordy[i+1]);
cairo_stroke(cr);
}
}