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演算子を使用できます。

/* 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_SOURCEの代わりにCAIRO_OPERATOR_CLEARを使用するだけで済みます。この場合、cairo_set_source_rgbaを呼び出す必要はまったくありません(CLEARオペレーターは、すべてのチャネルで宛先を常に0に設定します。ソースパターンに含まれる)。ただし、CAIRO_OPERATOR_SOURCEを使用した上記のアプローチは、完全に透明にするだけでなく、50%の赤などの半透明の色に「クリア」できるため、表面をクリアするためのより一般的な方法です。

ソース:https ://www.cairographics.org/FAQ/#clear_a_surface

于 2020-06-01T18:30:30.633 に答える