0

问题:我有一个 Textview,在不同的选定文本区域中有不同的 Texttags。在编辑结束时,我想将此多标记文本缓冲区/文本视图渲染到绘图区域。但我不知道如何使用 Pango/cairo 布局渲染多标记文本视图?如果我能得到任何显示文本绘图的 Gtk+/Gtkmm 代码,那就太好了。

EX:假设我的文本是“AAABBB”,并且在这个 AAA 中设置了粗体标签,而 BBB 设置为非粗体和斜体..现在我该如何渲染这种文本?

4

1 回答 1

1

假设您正在寻找一个 c++ 示例,请检查以下代码是否适合您:

#include <gtk/gtk.h>

static gboolean on_expose_event_0(GtkWidget *widget, GdkEventExpose *event, gpointer data)
{
    GdkScreen *screen = gdk_drawable_get_screen(widget->window);
    PangoRenderer *renderer = gdk_pango_renderer_get_default (screen);
    GdkGC *gc = gdk_gc_new(widget->window);

    gdk_pango_renderer_set_drawable(GDK_PANGO_RENDERER (renderer), widget->window);
    gdk_pango_renderer_set_gc(GDK_PANGO_RENDERER (renderer), gc);

    PangoContext *context = gdk_pango_context_get_for_screen (screen);
    PangoLayout *layout = pango_layout_new (context);

    pango_layout_set_markup(layout, "<b>AAA</b><i>bbb</i>", -1);

    PangoFontDescription *font = pango_font_description_from_string("Times 20");
    pango_layout_set_font_description(layout, font);
    pango_font_description_free(font);

    pango_renderer_draw_layout (renderer, layout, 1, 1);

    gdk_pango_renderer_set_drawable(GDK_PANGO_RENDERER (renderer), NULL);
    gdk_pango_renderer_set_gc(GDK_PANGO_RENDERER (renderer), NULL);

    g_object_unref(layout);
    g_object_unref(context);
    g_object_unref(gc);

    return FALSE;
}

int main( int argc, char *argv[])
{
    GtkWidget *window;

    gtk_init(&argc, &argv);

    window = gtk_window_new(GTK_WINDOW_TOPLEVEL);

    gtk_widget_add_events (window, GDK_BUTTON_PRESS_MASK);

    g_signal_connect(window, "expose-event", G_CALLBACK(on_expose_event_0), NULL);
    g_signal_connect(window, "destroy", G_CALLBACK(gtk_main_quit), NULL);

    gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
    gtk_window_set_title(GTK_WINDOW(window), "pango test");
    gtk_window_set_default_size(GTK_WINDOW(window), 400, 300);
    gtk_widget_set_app_paintable(window, TRUE);

    gtk_widget_show_all(window);

    gtk_main();

    return 0;
}

这里还有一个使用 pango 和 cairo 的例子:Using Pango with Cairo

希望这会有所帮助,问候

于 2011-03-27T02:48:13.797 回答