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.