2012-01-19 3 views
3

Может кто-нибудь, пожалуйста, покажет мне минимальный рабочий пример использования языка C для Каира с Gtk3, чтобы нарисовать одну строку в GtkDrawingArea. Я попытался изменить testcairo.c в папке тестов Gtk3, но я не могу заставить его работать. Пожалуйста, не предлагайте обучающие материалы на Каирском сайте; Zetcode.com или gnome.org, которые либо не используются с Gtk3, либо не являются минимальными рабочими примерами.Как нарисовать линию в GtkDrawingArea с использованием Cairo с Gtk3

+0

никто не может помочь Вот ? – mike

ответ

11

У меня есть. Главное отличие состоит в том, что для gtk + 3 вы должны рисовать из обработчика сигнала «draw». С gtk + 2 это происходит из обработчика сигнала «expose-event». Вот минимальный рабочий пример: http://www.gtkforums.com/viewtopic.php?f=3&t=988&p=195286=Drawing+with+Cairo+in+GTK3#p195286

+0

Это очень помогло. Я хотел бы упомянуть, что если вы используете сигнал «draw», учебник в ZetCode.com теперь обновляется. – zehelvion

2

Вот полный рабочий пример:

//Make sure gtk3-devel is installed (in Fedora #dnf install gtk3-devel) 
//In Ubuntu: $ sudo apt install libgtk-3-dev 
//To compile: 
//gcc draw.c `pkg-config --cflags gtk+-3.0 --libs gtk+-3.0` -o draw 
#include <gtk/gtk.h> 
//------------------------------------------------------------------ 
gboolean draw_callback(GtkWidget *widget,cairo_t *cr,gpointer data) 
{ 
guint width,height; 
GdkRGBA color; 
GtkStyleContext *context; 

context=gtk_widget_get_style_context(widget); 
width=gtk_widget_get_allocated_width(widget); 
height=gtk_widget_get_allocated_height(widget); 
gtk_render_background(context,cr,0,0,width,height); 
cairo_arc(cr,width/2.0,height/2.0,MIN(width,height)/2.0,0,2*G_PI); 
gtk_style_context_get_color(context,gtk_style_context_get_state 
(context),&color); 
gdk_cairo_set_source_rgba(cr,&color); 
gdk_cairo_set_source_rgba(cr,&color); 
cairo_fill (cr); 
return FALSE; 
} 
//------------------------------------------------------------------- 
gint main(int argc,char *argv[]) 
{ 
GtkWidget *window,*drawing_area; 

gtk_init(&argc,&argv); 
window=gtk_window_new(GTK_WINDOW_TOPLEVEL); 
g_signal_connect(window,"destroy",G_CALLBACK(gtk_main_quit),NULL); 

drawing_area=gtk_drawing_area_new(); 
gtk_container_add (GTK_CONTAINER (window),drawing_area); 
gtk_widget_set_size_request(drawing_area,200,100); 
g_signal_connect(G_OBJECT(drawing_area),"draw", 
G_CALLBACK(draw_callback),NULL); 
gtk_widget_show_all(window); 
gtk_main(); 
return 0; 
} 
//---------------------------------------------------------------- 
0
// compila con valac --pkg gtk+-3.0 nombre_archivo.gs 
uses 
    Gtk 
    Cairo 

init 
    Gtk.init (ref args) 
    var TestCairo = new Ventana() 
    TestCairo.show_all() 
    Gtk.main() 

class Ventana : Window 

    area: Gtk.DrawingArea 

    init   
     title = "Test Genie + GTK + Cairo" 
     set_default_size (400, 400)  
     window_position = WindowPosition.CENTER 
     destroy.connect(Gtk.main_quit) 

     // área de dibujo 
     area: Gtk.DrawingArea = new Gtk.DrawingArea() 
     // conecta el área de dibujo al método dibujar 
     area.draw.connect (dibujar) 
     // añade el área de dibujo a la ventana 
     add (area) 

    def dibujar (context : Context) : bool  

     context.set_source_rgba (1, 0, 0, 1)   
     context.set_line_width (2) 

     context.move_to (200, 100) 
     context.line_to (200, 300) 

     context.move_to (100, 200) 
     context.line_to (300, 200)  

     context.stroke() 

     return true 

enter image description here

Больше примеров Genie + Gtk + Каир в http://genie.webierta.skn1.com

Смежные вопросы