Hallo Ubuntuusers.
Habe eine Frage an die Fachleute, die sich sehr gut mit Cairo unter GTK3 auskennen. Eigentlich finde ich Cairo gut und was die eigentlichen Zeichenanweisungen betrifft auch sehr einfach. ABER! All das was ich bis jetzt mit Cairo gemacht habe, war halt nur einmal zeichnen und dann gut! Jetzt habe ich aber eine Anwendung, wo ich ähnlich dem "malen nach Zahlen" vorgehen muss und die eigentliche "mal-Funktion" (simulation) mehrfach zum Zeichnen einer Linie aufrufen muss.
Folgendes ist in der Main vorhanden:
1 2 3 4 5 6 7 8 9 10 11 12 13 | #include <gtk/gtk.h> //globale INT Variablen: int x_neu = 0; int y_neu = 0; int x_alt = 0; int y_alt = 0; //Pointer zur Drawing area GtkWidget *drawing_sim; //in der Main... drawing_sim = gtk_drawing_area_new(); gtk_fixed_put(GTK_FIXED(fixed0), drawing_sim, 270, 115); gtk_widget_set_size_request (drawing_sim, 970, 970); g_signal_connect(G_OBJECT(drawing_sim), "draw", G_CALLBACK(simulation), NULL); |
Und die dazugehörige Drawing-Funktion ist:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | static gboolean simulation(GtkWidget *widget, cairo_t *cr, gpointer user_data) { //Malfarbe in Cairo auf Schwarz setzen. cairo_set_source_rgb (cr, 0,0,0); //Strichstärke setzen: cairo_set_line_width(cr, 0.5); //Verschieben an den vorherigen Endpunkt cairo_move_to(cr, x_alt, y_alt); //Malt eine Linie von x,y alt zu x,y neu. cairo_line_to(cr, x_neu, y_neu); //für den nächsten Aufruf die neuen Variablen zu "alten" machen. x_alt = x_neu; y_alt = y_neu; //Das gezeichnete in Drawing Context ausgeben. cairo_stroke (cr); } |
Wenn ein neuer Wert (entspricht nächste Zahl beim "malen nach Zahlen") in die INT Variable x_neu und y_neu eingefügt wurde, wird ein neu-Zeichen, aus der Funktion heraus die die neuen x und y Werte in die Variablen eingefügt hat, mit der folgenden Anweisung erzwungen.
1 | gtk_widget_queue_draw_area(drawing_sim, 0, 0, 970, 970); |
Das Ganze funktioniert so auch soweit sehr gut. NUR! wenn eine neue Linie gezeichnet wird, ist die vorherige Linie wieder weg!
Was muss ich machen, damit das vorherig gezeichnete auch weiterhin in der Drawing Area erhalten bleibt und jede weitere Linie dazu gezeichnet wird? Hat da jemand eine Idee oder Lösung wie man das machen kann?
Leider habe ich nicht so richtig verstanden wie Cairo mit GTK3 zusammenarbeitet. Da wird einmal ein Context verwendet, dann wieder ein Surface, dann wieder andere Dinge... Da blicke ich nicht ganz durch. Deshalb muss ich hier mal fragen, ob mir jemand bitte eine Lösung mitgeben kann, die das Problem beseitigt, bzw. die schon gezeichneten Linien erhalten bleiben.
Ich bin eurer hilfreichen Info sehr dankbar. Gruß Tom.