GTK+ Comment dessiner dans une zone de dessin
Je voudrais tracer quelques lignes (en fait une forme d'onde sinusoïdale) à l'intérieur d'un gtk+ caire zone de dessin, mais je ne peux pas trouver un moyen de le faire.
Donc mon code définit d'abord la zone de dessin qui a un rappel à une fonction qui dessine un fond blanc dans la zone de dessin en lui-même...à ce point, je voudrais commencer le dessin d'une pièce du péché vague après chaque fois que le bouton de DÉMARRAGE est enfoncé (bouton a un rappel de la fonction de dessin)....
Alors tout d'abord..serait-il possible de faire??Ai-je raté quelque chose?
Merci.
#include <cairo.h>
#include <gtk/gtk.h>
int x = 0;
int x_old = 0;
float value = 0;
float value_old = 0;
GtkWidget *button = NULL;
GtkWidget *window = NULL;
GtkWidget *area = NULL;
GtkWidget *table = NULL;
static gboolean load_interface(GtkWidget *widget)
{
cairo_t *cr;
cr = gdk_cairo_create(area->window);
cairo_set_source_rgb(cr, 1, 1, 1);
cairo_rectangle(cr, 0, 0, 900, 400);
cairo_fill(cr);
}
void draw(GtkWidget *widget)
{
cairo_t *cr;
cr = gdk_cairo_create(widget->window);
x_old = x;
x = x + 15;
value_old = value;
value = value + 0.25;
cairo_set_source_rgb(cr, 0, 0, 0);
cairo_set_line_width (cr, 1);
cairo_move_to(cr, x_old, 100 + (sin(value_old))*50);
cairo_line_to(cr, x, 100 + (sin(value))*50);
cairo_stroke(cr);
}
int main (int argc, char *argv[])
{
g_log_set_handler ("Gtk", G_LOG_LEVEL_WARNING, (GLogFunc) gtk_false, NULL);
gtk_init (&argc, &argv);
g_log_set_handler ("Gtk", G_LOG_LEVEL_WARNING, g_log_default_handler, NULL);
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
gtk_container_set_border_width (GTK_CONTAINER (window), 3);
gtk_window_set_title (GTK_WINDOW (window), "Draw");
gtk_window_set_position (GTK_WINDOW (window), GTK_WIN_POS_CENTER);
gtk_widget_realize (window);
g_signal_connect (window, "destroy", gtk_main_quit, NULL);
table = gtk_table_new (10, 10, TRUE);
gtk_table_set_col_spacings(GTK_TABLE(table),10);
gtk_table_set_row_spacings(GTK_TABLE(table),5);
gtk_container_add (GTK_CONTAINER (window), table);
area = gtk_drawing_area_new();
gtk_signal_connect (GTK_OBJECT(area), "event", G_CALLBACK (load_interface), (gpointer)area);
gtk_table_attach_defaults (GTK_TABLE(table), area, 1, 10, 0, 10);
button = gtk_button_new_from_stock ("START");
g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (draw), (gpointer) window);
gtk_table_attach_defaults (GTK_TABLE(table), button, 0, 1, 0, 1);
gtk_widget_show_all (window);
gtk_main ();
return 0;
}
- Êtes-vous à l'aide de GTK2 ou GTK3? Regarde c'est GTK2, mais je ne suis pas sûr.
- oui j'utilise GTK2 sur windows...
Vous devez vous connecter pour publier un commentaire.
Tous votre dessin devrait arriver dans la zone de dessin dessin événement, appelé
expose-event
pour GTK2 etdraw
en GTK3. En réponse à la touche étant un clic, il suffit de changer quelques valeurs qui vous permettra de les réutiliser pour calculer l'ensemble de la scène dessinée. Une fois que vous avez modifié ces valeurs, vous venez d'invalider la zone de dessin pour le forcer d'être redessiné, appelantgtk_widget_queue_draw
sur la zone de dessin. Et c'est tout.Si la scène est cher pour dessiner, rappelez-vous à l'aide du caire écrêtage des fonctions pour améliorer les performances en dessin que ce qui a changé. Utilisez ensuite
gtk_widget_queue_draw_area
au lieu de gtk_widget_queue_draw, pour donner un indice sur la zone qui a changé et doit être redessiné.Voir GtkDrawingArea documentation.
BTW, ne pas utiliser jette à
GTK_OBJECT
(obsolète), l'utilisationG_OBJECT
à la place. Cela rend le portage à GTK3 plus facile.g_signal_connect()
la exposer-événement.