2010-07-17 7 views
7

Sono un programmatore abbastanza esperto, ma nuovo nella programmazione GUI. Sto provando a portare una libreria di tracciamento che ho scritto per DFL su gtkD, e non riesco a far visualizzare i disegni. Il seguente codice produce una finestra vuota per me. Qualcuno può dirmi cosa c'è che non va e/o postare un codice di esempio minimo per ottenere poche righe su un DrawingArea e visualizzare i risultati in un MainWindow?gtkD: Esempio di disegno minimo?

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

Penso che manchi la memoria del buffer PixMap. Questo è per PyGTK, ma penso che potrebbe essere d'aiuto: http://www.pygtk.org/pygtk2tutorial/sec-DrawingAreaWidgetAndDrawing.html – Eldelshell

risposta

4

Non ho alcuna esperienza in D, ma un sacco in GTK, così con l'aiuto del tutorial gtkD sono riuscito a incidere un esempio minimo:

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, un DrawingArea è in realtà solo un widget vuoto su cui dipingere, e la pittura sui widget deve sempre essere eseguita nel gestore expose-event. (Anche se capisco questo cambierà in GTK 3!)

Capisco che non è possibile collegare funzioni come richiamate di segnale, solo delegati, quindi questo è il motivo della classe DrawingTest.