2010-07-17 4 views
7

Ich bin ein ziemlich erfahrener Programmierer, aber neu in der GUI-Programmierung. Ich versuche, eine Plot-Bibliothek, die ich für DFL geschrieben habe, nach gtkD zu portieren, und ich kann keine Zeichnungen bekommen. Der folgende Code erzeugt ein leeres Fenster für mich. Kann mir bitte jemand sagen, was daran falsch ist, und/oder post minimaler Beispielcode für ein paar Zeilen auf eine DrawingArea und Anzeige der Ergebnisse in einer MainWindow?gtkD: Minimales Zeichnungsbeispiel?

import gtk.DrawingArea, gtk.Main, gtk.MainWindow, gdk.GC, gdk.Drawable, 
    gdk.Color; 

void main(string[] args) { 
    Main.init(args); 

    auto win = new MainWindow("Hello, world"); 
    win.setDefaultSize(800, 600); 
    auto drawingArea = new DrawingArea(800, 600); 
    win.add(drawingArea); 
    drawingArea.realize(); 

    auto drawable = drawingArea.getWindow(); 
    auto gc = new GC(drawable); 
    gc.setForeground(new Color(255, 0, 0)); 
    gc.setBackground(new Color(255, 255, 255)); 
    drawable.drawLine(gc, 0, 0, 100, 100); 

    drawingArea.showAll(); 
    drawingArea.queueDraw(); 
    win.showAll(); 

    Main.run(); 
} 
+0

Ich denke, dass Sie die PixMap-Puffer Zeug fehlt. Dies ist für PyGTK, aber ich denke, es könnte helfen: http://www.pygtk.org/pygtk2tutorial/sec-DrawingAreaWidgetAndDrawing.html – Eldelshell

Antwort

4

Ich habe keinerlei Erfahrung in D, aber viele in GTK, so mit Hilfe des gtkD Tutorial ich ein minimales Beispiel zerhacken verwaltet:

import gtk.DrawingArea, gtk.Main, gtk.MainWindow, gdk.GC, gdk.Drawable, 
    gdk.Color, gtk.Widget; 

class DrawingTest : MainWindow 
{ 
    this() 
    { 
     super("Hello, world"); 
     setDefaultSize(800, 600); 
     auto drawingArea = new DrawingArea(800, 600); 
     add(drawingArea); 
     drawingArea.addOnExpose(&drawStuff); 
     showAll(); 
    } 

    bool drawStuff(GdkEventExpose *event, Widget self) 
    { 
     auto drawable = self.getWindow(); 
     auto gc = new GC(drawable); 
     gc.setForeground(new Color(cast(ubyte)255, cast(ubyte)0, cast(ubyte)0)); 
     gc.setBackground(new Color(cast(ubyte)255, cast(ubyte)255, cast(ubyte)255)); 
     drawable.drawLine(gc, 0, 0, 100, 100); 
     return true; 
    } 
} 

void main(string[] args) { 
    Main.init(args); 
    new DrawingTest(); 
    Main.run(); 
} 

In GTK, ein DrawingArea ist eigentlich nur ein leeres Widget zum Malen, und das Malen auf Widgets muss immer im expose-event Handler erfolgen. (Obwohl ich verstehe, wird dies in GTK 3 ändern!)

Ich verstehe, dass Sie Funktionen nicht als Signalrückrufe verbinden können, nur Delegaten, so dass der Grund für die DrawingTest Klasse ist.

Verwandte Themen