我对cairo文本有一个麻烦。我在gtk_window中写了几行文字,问题是这些文字应该是动态的,但如果我多次调用写文字的函数,行数就会重叠。
cr = gdk_cairo_create(window->window);
cairo_set_source_rgb(cr, 255, 255, 255);
cairo_select_font_face(cr, "Sans", CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_NORMAL);
cairo_set_font_size(cr, 14.0);
cairo_move_to(cr, 90.0, 85.0);
cairo_show_text(cr, "Terror");
cairo_set_font_size(cr, 12.0);
cairo_set_source_rgb(cr, 30, 254, 145);
cairo_move_to(cr, 90.0, 105.0);
cairo_show_text(cr, "Underdogs");
cairo_move_to(cr, 90.0, 120.0);
cairo_show_text(cr, "Disziplin");
cairo_destroy(cr);
问题是这个文本应该是动态的, 但如果我多次调用写文本的函数, 行数就会重叠.
有没有什么方法可以刷新之前的文本?
谢谢
你必须用背景色覆盖文字:)
如果你想把你的表面清除成一个统一的、不透明的颜色,那么这是很直接的。
/* Set surface to opaque color (r, g, b) */
cairo_set_source_rgb (cr, r, g, b);
cairo_paint (cr);
但是,如果你想把表面清除成不透明的颜色以外的颜色呢?简单地修改上面的代码,使用 "cairo_set_source_rgba (cr, 0, 0, 0, 0); "是行不通的,因为cairo默认使用OVER合成操作符,将完全透明的东西混合到其他东西上根本没有效果。取而代之的是,你可以使用SOURCE操作符,它将颜色和alpha值直接从源头复制到目的地,而不是进行混合。
/* Set surface to translucent color (r, g, b, a) */
cairo_set_source_rgba (cr, r, g, b, a);
cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE);
cairo_paint (cr);
当然,你不会忘记在完成后再次设置默认的CAIRO_OPERATOR_OVER。而最方便的习惯就是在整个块周围使用cairo_savecairo_restore就可以了。
/* Set surface to translucent color (r, g, b, a) without disturbing graphics state. */
cairo_save (cr);
cairo_set_source_rgba (cr, r, g, b, a);
cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE);
cairo_paint (cr);
cairo_restore (cr);
最后,如果要清除一个表面的所有透明,我们可以简单地使用CAIRO_OPERATOR_CLEAR来代替CAIRO_OPERATOR_SOURCE,在这种情况下,根本不需要调用cairo_set_source_rgba(CLEAR操作符总是在每个通道中把目标设置为0,不管源模式包含什么)。但上述使用cairo_operator_source的方法是一种更通用的清除表面的方法,因为它允许 "清除 "到半透明的颜色,如50%的红色,而不仅仅是清除到完全透明。