рендеринг текстового представления с несколькими атрибутами - PullRequest
0 голосов
/ 24 марта 2011

проблема: у меня есть Textview с различными текстовыми тегами в разных выделенных текстовых областях.В конце редактирования я хотел бы перевести этот текстовый буфер с несколькими тегами в область рисунков. Но я не понимаю, как я могу визуализировать текстовое изображение с несколькими тегами, используя макет Pango / cairo?Было бы замечательно, если бы я получил какой-либо код Gtk + / Gtkmm, который показывает рисование текста.

EX: допустим, мой текст "AAABBB", и в этом AAA есть набор жирных тегов, а BBB не жирный и курсив.Теперь, как я могу сделать этот вид текста?

1 Ответ

1 голос
/ 27 марта 2011

Предполагая, что вы ищете пример 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: Использование Pango с Cairo

надеюсь, это поможет, с уважением

...