GTK+ Oberfläche etc. in ein Objekt packen



  • Hallo

    ich habe folgendes kleines Programm das GTK+ nutzt:

    #include <stdio.h>
    #include <stdlib.h>
    #include <gtk/gtk.h>
    #include <iostream>
    using namespace std;
    
    static GtkWidget *drawingarea = NULL;
    static GdkPixmap *pixmap = NULL;
    int aufloesungX = 500;
    int aufloesungY = 500;
    GdkColormap *colormap;
    GdkColor *bg, c1, c2;
    
    static gint area_event(GtkWidget * widget, GdkEventExpose * event, gpointer client_data){
    	gdk_draw_pixmap (widget->window, widget->style->fg_gc[GTK_STATE_NORMAL], pixmap, 0, 0, 0, 0, aufloesungX, aufloesungY);
    	return TRUE;
    }
    
    void colormap_init(){
    	colormap = gdk_window_get_colormap(drawingarea->window);
    
    	c1.red = 0;
    	c1.blue = 0;
    	c1.green = 0;
    	gdk_color_alloc (colormap, &c1);
    
    	c2.red = 0xffff;
    	c2.blue = 0;
    	c2.green = 0;
    	gdk_color_alloc (colormap, &c2);
    }
    
    int main (int argc, char **argv){
    	GtkWidget *window;
    	GdkGC *graphicContext;
    
    	gtk_init (&argc, &argv);
    	window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
    	gtk_window_set_title (GTK_WINDOW (window), "GTK+ Test");
    	gtk_window_set_policy (GTK_WINDOW (window), TRUE, TRUE, TRUE);
    	gtk_window_set_default_size(GTK_WINDOW (window), aufloesungX, aufloesungY);
    
    	gtk_signal_connect (GTK_OBJECT (window), "destroy", (GtkSignalFunc) gtk_main_quit, NULL);
    
    	drawingarea = gtk_drawing_area_new ();
    	gtk_drawing_area_size (GTK_DRAWING_AREA (drawingarea), aufloesungX, aufloesungY);
    
    	gtk_widget_set_events (drawingarea, GDK_EXPOSURE_MASK);
    	gtk_signal_connect (GTK_OBJECT (drawingarea), "expose-event", (GtkSignalFunc) area_event, (gpointer) drawingarea);
    	gtk_container_add (GTK_CONTAINER (window), drawingarea);
    	gtk_widget_show (drawingarea);
    	gtk_widget_show (window);
    
    	bg = &drawingarea->style->bg[GTK_STATE_NORMAL];
    	pixmap = gdk_pixmap_new (drawingarea->window, aufloesungX, aufloesungY, -1);
    	graphicContext = gdk_gc_new (drawingarea->window);
    
    	colormap_init();
    
    	gdk_gc_set_foreground (graphicContext, bg);
    	gdk_draw_rectangle (pixmap, graphicContext, TRUE, 0, 0, aufloesungX, aufloesungY);
    
    	bool temp = false;
    
    	for(int x = 0; x <= aufloesungX; x++){	
    		for(int y = 0; y <= aufloesungY; y++){
    			if(temp){
    				gdk_gc_set_foreground (graphicContext, &c1);
    			}else{
    				gdk_gc_set_foreground (graphicContext, &c2);			
    			}
    			gdk_draw_rectangle (pixmap, graphicContext, TRUE, x, y, 1, 1);
    			temp = !temp;
    		}
    	}
    
        	gtk_main();
    	exit (0);
    }
    

    Ich bin noch nicht wirklich super vertraut was vllt. daran liegt das ich kaum gute dokus zu GTK+ gefunden habe...

    Mein Problem ist folgendes: ich will eine extra Klasse haben die nur die Oberfläche kapselt. Also der ich zum Beispiel sage: "mal Punkt x y auf dem Fenster bla in rot".

    Nur weiss ich irgendwie nicht wo ich anfangen soll damit. die ganze sache mit GTK+ ist finde ich ziemlich unübersichtlich vor allem die ganzen Pointer verwirren mich etwas.
    Kann mir vllt. jemand kurz auf die Sprünge helfen wie ich sowas umsetzen würde?

    Dankeschön schonmal 🙂
    Green



  • Hi,

    dazu wäre erst zu klären, ob du das ganze in C oder in C++ realisieren willst. Aus dieser Entscheidung leiten sich dann die verschiedenen Möglichkeiten zur Implementierung ab. Da ich ein wenig C++ Code erkennen kann, wäre es eventuell sinnvoll, gleich gtkmm zu benutzen, da dies in C++ geschrieben ist und die Programmierung erheblich erleichtert.

    Cheers

    GPC



  • Also programmieren möchte ich in C++
    und wie gesagt ich hab nich so viel ahnung von den GTK sachen und so. Alles was ich will ist so einfach und flexibel wie möglich Oberflächen bauen...

    Hast du ein gutes GTKmm tutorial für einen C++ Anfänger?



  • GreenStudios schrieb:

    [...] Ich will [...] so einfach und flexibel wie möglich Oberflächen bauen...

    Wenn etwas einfach ist, dann weil dir bestimmte Sachen abgenommen werden. Dafür gibst du aber Flexibilität auf.

    Bevor du irgendwelche Wrapper-Versuche unternimmst, mach dich erstmal mit GTK+ vertraut. Ich weiß nicht, warum du das Tutorial auf den offiziellen GTK+ Seiten nicht gefunden hast, aber das ist mehr als ausführlich.

    http://library.gnome.org/devel/gtk-tutorial/stable/

    GreenStudios schrieb:

    Hast du ein gutes GTKmm tutorial für einen C++ Anfänger?

    Einfach mal die Seite von gtkmm besuchen (sollte eigentlich nicht so schwer sein).

    Und einfach mal unter Dokumentation mit "Basics" anfangen.

    http://www.gtkmm.org/documentation.shtml



  • Ich habe oft Beiträge gelesen die auf diesen Link (als das offizielle GTK+ 2.0 tut) verwiesen:
    http://www.gtk.org/tutorial/

    und der brngt mir 404, deshalb bin ich davon ausgegangen das es das tut wohl nicht mehr gibt.

    GTKmm ist also ein wrapper für GTK+ 2.0 wenn ich das richtig verstanden habe?
    Ich hab mir das GTKmm tut mal angeschaut und fand das eigentlich ganz gut...

    Versäumt man denn viel wenn man das mit GTKmm macht?



  • GreenStudios schrieb:

    Ich habe oft Beiträge gelesen die auf diesen Link (als das offizielle GTK+ 2.0 tut) verwiesen:
    http://www.gtk.org/tutorial/

    und der brngt mir 404, deshalb bin ich davon ausgegangen das es das tut wohl nicht mehr gibt.

    Und was hat dich davon abgehalten, einfach die Seite www.gtk.org zu durchsuchen oder eine Suchmaschiene zu bemühen? Sollte nicht so schwer sein...

    Das Tutorial findest du jetzt hier verlinkt:
    http://www.gtk.org/documentation.html

    GreenStudios schrieb:

    GTKmm ist also ein wrapper für GTK+ 2.0 wenn ich das richtig verstanden habe?
    Ich hab mir das GTKmm tut mal angeschaut und fand das eigentlich ganz gut...

    Versäumt man denn viel wenn man das mit GTKmm macht?

    Nein. Du versäumst gar nichts. Meiner Meinung nach ist GTKmm zu benutzen ehr positiv zu bewerten, weil es einen guten C++-Stil hat...


Anmelden zum Antworten