GTK+ How to draw in einen Zeichenbereich
Ich möchte zeichnen Sie einige Linien (eigentlich eine Sinus-Welle) in einem gtk+ - cairo-Zeichenfläche, aber ich kann nicht herausfinden, einen Weg, das zu tun.
Also mein code definiert zunächst die Zeichnung Gebiet, das einen callback zu einer Funktion, das zeichnet einen weißen hintergrund in die Darstellung selbst...an dieser Stelle würde ich gerne mit dem zeichnen beginnen ein Stück von der Sünde wave jedes mal, nachdem die START-Taste gedrückt (die Schaltfläche hat einen Rückruf der zeichnen-Funktion)....
Also zu aller erst..wäre es möglich das zu tun??Bin ich etwas fehlt?
Danke.
#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;
}
- Sind Sie mit GTK2 oder GTK3? Sieht es auf GTK2, aber ich bin mir nicht sicher.
- ja, ich bin mit GTK2 auf windows...
Du musst angemeldet sein, um einen Kommentar abzugeben.
Alle Ihre Zeichnung soll geschehen im Bereich der Zeichnung drawing event, genannt
expose-event
für GTK2 unddraw
in GTK3. In Reaktion auf die Schaltfläche geklickt haben, ändern Sie einfach einige Werte, die Sie wiederverwenden zu berechnen, die gesamte Szene gezeichnet. Sobald Sie diese Werte geändert, die Sie nur zur Unwirksamkeit der Zeichnung Bereich zu zwingen, es neu gezeichnet wird, ruftgtk_widget_queue_draw
im Bereich der Zeichnung. Und das ist es.Wenn die Szene ist teuer zu ziehen, erinnere mich, mit Kairo clipping-Funktionen zur Verbesserung der Leistung durch die Zeichnung nur das, was sich verändert hat. Verwenden Sie dann
gtk_widget_queue_draw_area
statt gtk_widget_queue_draw, einen Hinweis darauf zu geben über die zone, die sich geändert hat und neu gezeichnet werden muss.Sehen GtkDrawingArea Dokumentation.
BTW, don ' T verwenden Sie wirft zu
GTK_OBJECT
(veraltet), verwenden SieG_OBJECT
statt. Dies macht die Portierung auf GTK3 zu erleichtern.g_signal_connect()
die expose-event.