2011-03-24 54 views
0

問題:我有不同文本標籤在不同的選定文本區域的Textview。在編輯結束時,我想將這個多標記的textbuffer/textview渲染到drawingarea中。但是我沒有得到如何使用Pango/cairo佈局渲染多標記textview?如果我得到任何顯示文本圖形的Gtk +/Gtkmm代碼,那將是非常棒的。呈現多文稿textview

EX:可以說我的文本是「AAABBB」,並且在這個AAA中有粗體標記集,​​BBB是非粗體和斜體集......現在我怎麼渲染這種文本?

回答

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; 
} 

也有使用攀高與開羅這裏一個例子:Using Pango with Cairo

希望這有助於,關於