Question

Je suis assez programmeur expérimenté, mais les nouvelles de la programmation GUI.Je suis en train de le port d'un complot de la bibliothèque que j'ai écrit pour DFL à gtkD, et je ne peux pas obtenir des dessins de montrer.Le code suivant génère une fenêtre vide pour moi.Quelqu'un peut-il me dire quel est le problème avec elle, et/ou post-exemple minimal de code pour faire quelques lignes sur un DrawingArea et d'afficher les résultats dans un MainWindow?

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();
}
Était-ce utile?

La solution

J'ai aucune expérience dans D, mais beaucoup en GTK, donc, avec l'aide de la gtkD tutoriel, 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 vide widget pour vous à la peinture, et la peinture sur les widgets doivent toujours être fait dans le expose-event gestionnaire d'.(Bien que je comprenne ce qui va changer dans GTK 3!)

Je comprends que vous ne pouvez pas vous connecter fonctions en tant que signal de rappels, seuls les délégués, de sorte que c'est la raison pour la DrawingTest classe.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top