清除gtk_window中的cairo文字。

问题描述 投票:2回答:2

我对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);

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

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

谢谢

c linux gtk cairo
2个回答
2
投票

你必须用背景色覆盖文字:)


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_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%的红色,而不仅仅是清除到完全透明。

源。https:/www.cairographics.orgFAQ#clear_a_surface

© www.soinside.com 2019 - 2024. All rights reserved.