清除gtk_window中的cairo文本

时间:2011-02-11 13:07:41

标签: c linux gtk 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);

问题是这个文本应该是动态的,但如果我多次调用写入文本的函数,则行重叠。

是否有任何方法可以刷新上一个文本?

谢谢!

2 个答案:

答案 0 :(得分:2)

您必须使用背景颜色覆盖文本:)

答案 1 :(得分:1)

如果要将表面清理成均匀,不透明的颜色,则非常简单:

/* 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合成运算符,因此无法使用,并且将完全透明的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_save / cairo_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%的红色),而不仅仅是清除为完全透明。

来源:https://www.cairographics.org/FAQ/#clear_a_surface