Как нарисовать линию в GtkDrawingArea, используя Cairo с Gtk3 - PullRequest
4 голосов
/ 19 января 2012

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

Ответы [ 4 ]

12 голосов
/ 11 июля 2012

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

6 голосов
/ 30 января 2017

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

  • Убедитесь, что gtk3-devel установлено (в Fedora #dnf install gtk3-devel)

  • В Ubuntu: sudo apt install libgtk-3-dev

для компиляции: gcc draw.c <code>pkg-config --cflags gtk+-3.0 --libs gtk+-3.0 -o ничья

#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 голосов
/ 31 января 2017
// 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 + Cairo в http://genie.webierta.skn1.com

0 голосов
/ 16 февраля 2012

Я не понимаю, почему это не сработает, должно сработать.

http://developer.gnome.org/gtk3/3.2/GtkDrawingArea.html

Как видите, gtk2 с cairo почти такой же, как и у gtk3.

...