GTK在drawable区域绘图

⌚Time: 2022-07-29 16:08:22

👨‍💻Author: Jack Ge

gtk不使用cairo库的绘图方式:


#include <gtk/gtk.h>

static gboolean on_expose(GtkWidget *drawArea,GdkEventExpose *event,gpointer data)

{

    GdkGC *gc_0, *gc_1, *gc_2; 

    GdkColor color;



    gc_0 = gdk_gc_new(drawArea->window);

    color.red = 0;

    color.green = 30000;

    color.blue = 0;

    gdk_gc_set_rgb_fg_color( gc_0, &color );



    gc_1= gdk_gc_new( drawArea->window );

    color.red = 65535;

    color.green = 0;

    color.blue = 65535;

    gdk_gc_set_rgb_fg_color( gc_1, &color );



    gc_2= gdk_gc_new( drawArea->window );

    color.red = 0;

    color.green = 65522;

    color.blue = 33333;

    gdk_gc_set_rgb_fg_color( gc_2, &color );



    //画矩形

    gdk_draw_rectangle( drawArea->window,gc_0,TRUE,5, 5, 100, 100 ); 

    //画圆弧

    gdk_draw_arc( drawArea->window,gc_1,FALSE, 150, 50, 100, 100, 0, 64*180);

    //写字

    PangoLayout *layout = gtk_widget_create_pango_layout( drawArea, "hello world!" );

    PangoFontDescription *fontdesc = pango_font_description_from_string( "Comic Sans 24" );

    pango_layout_set_font_description( layout, fontdesc ); 

    gdk_draw_layout( drawArea->window,gc_2,50, 150, layout );



    //释放资源

    pango_font_description_free( fontdesc );

    g_object_unref( layout );

    g_object_unref( G_OBJECT(gc_0) );

    g_object_unref( G_OBJECT(gc_1) );

   

    return TRUE;





}





int main(int argc,char *argv[])

{

    GtkWidget *window;

    GtkWidget *drawArea; 



    gtk_init(&argc, &argv);

    window = gtk_window_new(GTK_WINDOW_TOPLEVEL);

    gtk_window_set_title(GTK_WINDOW(window), "Center");

    gtk_window_set_default_size(GTK_WINDOW(window), 300, 200);

    gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);



    drawArea = gtk_drawing_area_new();

    gtk_widget_set_size_request(drawArea, 300, 200);

    gtk_container_add(GTK_CONTAINER(window), drawArea);

    g_signal_connect(drawArea, "expose_event",G_CALLBACK(on_expose), NULL);

    g_signal_connect_swapped(G_OBJECT(window), "destroy",G_CALLBACK(gtk_main_quit), NULL);



    gtk_widget_show_all(window); 



    gtk_main();

    return 0;

}

效果: