2017-07-16 8 views
3

Je veux implémenter des widgets personnalisés en sous-classant DrawingArea Widget, pour cela j'ai besoin de dessiner en utilisant cairo. Il semble que dans gtk3 il y ait un nouveau signal appelé 'draw' introduit. Comment puis-je dessiner à l'intérieur du widget? Est-ce que les signaux de cartographie et de réalisation devraient être outrepassés?Comment dessiner dans un widget DrawingArea sous-classé?

Un exemple de code simple serait très utile. Merci.

Répondre

4

Pour faire simple, vous aurez besoin de passer outre le signal de tirage qui fournira un contexte Caire:

gboolean 
user_function (GtkWidget *widget, 
       CairoContext *cr, 
       gpointer  user_data) 

Ensuite, vous pouvez utiliser le CairoContext cr pour dessiner le contenu réel du widget.

De l'API C:

Le widget GtkDrawingArea est utilisé pour créer une interface utilisateur personnalisée éléments. C'est essentiellement un widget vide; vous pouvez dessiner dessus. Après créant une zone de dessin, l'application peut vouloir se connecter à:

La souris et le bouton appuient sur les signaux pour répondre à l'entrée de l'utilisateur. (Utilisez gtk_widget_add_events() pour activer les événements que vous souhaitez recevoir.)

  • Le signal « se rendre compte » de prendre toutes les mesures nécessaires lorsque le widget est instancié sur un écran particulier. (Créer des ressources GDK dans en réponse à ce signal.)

  • Le signal "allocation de taille" permet de prendre les mesures nécessaires lorsque le widget change de taille.

  • Le signal "draw" pour gérer le redessin du contenu du widget.

Le widget devrait la file d'attente certains dessine lorsque les changements de widget, par exemple, de la taille que vous allouez devez utiliser gtk_widget_queue_draw pour forcer le widget à dessiner à nouveau CESTI.

Exemple - Utilisation d'une zone de dessin non pas comme sous classing, mais le concept reste: (prise de Gnome C API)

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

    cairo_fill (cr); 

return FALSE; 
} 
[...] 
    GtkWidget *drawing_area = gtk_drawing_area_new(); 
    gtk_widget_set_size_request (drawing_area, 100, 100); 
    g_signal_connect (G_OBJECT (drawing_area), "draw", 
        G_CALLBACK (draw_callback), NULL); 

Vous devriez également lire en hauteur pour la largeur Gestion Géométrie dans GtkWidget

J'ai utilisé C car il n'y avait aucune référence au langage de programmation sur votre question et en même temps c'est l'API d'origine à partir de laquelle tous les autres sont écrits.

Il existe quelques exemples de création de widgets personnalisés Gtk + sur Internet.