GTK: Koordinaten graphisch anzeigen
-
Hallo,
ich bin dabei mit Dev-Cpp (Programmiere mit C unter Windows) eine Art GUI erstellen, auf dem ich Koordinaten graphisch Anzeigen kann. Bin dabei - was GTK angeht - dabei noch sehr unbedarft und habe bis jetzt nur kleine Testprogramme geschrieben, um in den Umgang rein zu kommen.
Zu meinem Problem: Ich habe Variablen mit X/Y Koordinaten - sich ändernde Koordinaten - und will diese relativ Zeitnah graphisch in einem Fenster ausgeben.
Bin schon seid längerem auf der Suche, habe aber bislang noch keinen passenden Einstieg oder Weg gefunden, wie ich das realisieren könnte.Weiterhin ist - wenn ich GTK richtig verstanden habe - der Ablauf (ähnlich wie Java) "action"-basiert. Sprich eine Aktion (z.B. Mausklick anderes Ereignis) triggert mir meine gtk_main() Schleife immer neu an.
Ist mein Versuch somit insofern überhaupt mit GTK zu realisieren (z.B. über Timer-gesteuertes Ereignis)?Hat da jemand vielleicht einen Fingerzeig für mich?
LG Michl
-
Hallo,
Ist mein Versuch somit insofern überhaupt mit GTK zu realisieren (z.B. über Timer-gesteuertes Ereignis)?
Mit der g_timeout_add Funktion sollte das gehen.
Doku ist hier:
http://library.gnome.org/devel/glib/unstable/glib-The-Main-Event-Loop.html#g-timeout-addEin Beispiel hier:
http://zetcode.com/tutorials/gtktutorial/gtkevents/
(ganz am Schluss)
-
Hi,
den Punkt habe ich mittlerweile mittels Cairo hinbekommen. Muss mich da jetzt noch in die Arrays einarbeite, um die Funktion sauber aufzurufen (momentan mittels globalen Int-Werten).
Auf die Funktion g_timeout_add bin ich auch schon gekommen, habe es aber noch nicht geschafft, diese einzubinden.
Danke für den Link, melde mich mit Sicherheit noch malLG Michl
-
Hi,
hab ja gesagt, ich melde mich noch mal
Der Punkt springt erst mal und ich will mich langsam an die testweise Implementierung von mySQL machen.
Habe dazu noch eine Frage zwecks Verständnis.Das main-Programm sieht ungefähr so aus:
int main( int argc, char **argv ) { // Ein paar Sachen definieren GtkWidget *window; GtkWidget *draw; GdkColor color; gint Koord; Dots Punkte; // Hintergrundfarbe definieren color.red = 65535; color.green = 65535; color.blue = 65535; // Koordinaten berechnen y_koordinate_punkt=y_resolution-(4*punkt_durchmesser); y_koordinate_schrift=y_resolution-(2.5*punkt_durchmesser); // Hier beginnt GTK gtk_init( &argc, &argv ); // Generiere Fenster window = gtk_window_new (TK_WINDOW_TOPLEVEL ); gtk_window_set_default_size( GTK_WINDOW( window ), x_resolution, y_resolution ); gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER gtk_window_set_title(GTK_WINDOW( window ), "VISU"); g_signal_connect( G_OBJECT( window ), "destroy", G_CALLBACK( gtk_main_quit ), NULL ); draw = gtk_drawing_area_new(); gtk_widget_modify_bg(draw, 0, &color); gtk_container_add (GTK_CONTAINER(window), draw); g_timeout_add(refresh_time, (GSourceFunc) draw_points, (gpointer) draw); gtk_widget_show_all(window); gtk_main(); return( 0 ); }
Wie verhält sich das nun mit dem g_time_out_add?
Wenn ich das richtig verstanden habe, dann läuft das Programm von "gtk_init( &argc, &argv );" bis "gtk_main();" ab. Mit dem Time Aufruf von g_timeout_add wird das ganze bei gtk_init wieder gestartet oder schon bei main? Wenn ja, wäre das auch der ideale Ort um meine Funktion zu callen, die Daten aus mySQL in ein Struct zu schreiben. Sehe ich das richtig?LG und gute Nacht
Michl
-
Hallo,
Wenn ich das richtig verstanden habe, dann läuft das Programm von "gtk_init( &argc, &argv );" bis "gtk_main();" ab. Mit dem Time Aufruf von g_timeout_add wird das ganze bei gtk_init wieder gestartet oder schon bei main?
Das Programm läuft zunächst einmal von "init" bis "main".. Mit dem g_timeout_add initialisiert man einen Timer und einen Call auf eine Funktion:
Aus der Doku:
[...]Sets a function to be called at regular intervals, with the default priority, G_PRIORITY_DEFAULT. The function is called repeatedly until it returns FALSE,[....]
Beispiel:
g_timeout_add(1000, (GSourceFunc) time_handler, (gpointer) window);
Hier wird das Intervall auf 1000ms (1 sec) gesetzt. Die Funktion, die jede Sec. aufgerufen werden soll, heisst hier "time_handler". Und als User_Data wird "window" an diese Funktion übergeben. Wenn die Timerfunktion beendet werden soll, gibt die Funktion FALSE an den Caller zurück.
Diese Funktion wird wie jede andere Callback Funktion codiert.
static gboolean time_handler(GtkWidget *widget_window)