2

我遇到了开罗文本的问题。我在 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);

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

有什么方法可以刷新以前的文本吗?

谢谢!

4

2 回答 2

2

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

于 2011-02-11T21:43:39.793 回答
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 合成运算符,因此无法正常工作,并且将完全透明的东西混合到其他东西上根本没有效果。相反,您可以使用 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

于 2020-06-01T18:30:30.633 回答