2010-07-17 21 views
7

Je suis un programmeur assez expérimenté, mais nouveau pour la programmation graphique. J'essaye de porter une bibliothèque de traçage que j'ai écrite pour DFL à gtkD, et je ne peux pas obtenir des dessins pour montrer. Le code suivant produit une fenêtre vide pour moi. Est-ce que quelqu'un peut me dire ce qui ne va pas et/ou afficher un code d'exemple minimal pour obtenir quelques lignes sur un DrawingArea et afficher les résultats dans un MainWindow?gtkD: Exemple de dessin minimal?

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

Je pense qu'il vous manque le contenu du tampon PixMap. C'est pour PyGTK mais je pense que cela pourrait aider: http://www.pygtk.org/pygtk2tutorial/sec-DrawingAreaWidgetAndDrawing.html – Eldelshell

Répondre

4

Je n'ai aucune expérience que ce soit dans D, mais beaucoup dans GTK, donc avec l'aide du tutoriel gtkD j'ai réussi à pirater un exemple minimal:

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(); 
} 

En GTK, un DrawingArea est en fait juste un widget vierge pour que vous puissiez peindre, et peindre sur les widgets doit toujours être fait dans le gestionnaire expose-event. (Bien que je comprenne que cela va changer dans GTK 3!)

Je comprends que vous ne pouvez pas connecter des fonctions comme des rappels de signal, seulement des délégués, c'est la raison pour laquelle la classe DrawingTest est utilisée.