Frage

Ich bin ein ziemlich erfahrener Programmierer, aber neu in der GUI-Programmierung.Ich versuche, eine Plotbibliothek, die ich für DFL geschrieben habe, auf gtkD zu portieren, und ich kann keine Zeichnungen anzeigen lassen.Der folgende Code erzeugt ein leeres Fenster für mich.Kann mir bitte jemand sagen, was daran falsch ist, und / oder minimalen Beispielcode posten, um ein paar Zeilen auf a zu bringen DrawingArea und Anzeige der Ergebnisse in einem 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();
}
War es hilfreich?

Lösung

Ich habe keinerlei Erfahrung in D, aber viel in GTK, also habe ich es mit Hilfe des gtkD-Tutorials geschafft, ein minimales Beispiel zu hacken:

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, auf das Sie malen können, und das Malen auf Widgets muss immer in der expose-event Handler.(Obwohl ich verstehe, dass sich dies in GTK 3 ändern wird!)

Ich verstehe, dass Sie Funktionen nicht als Signalrückrufe verbinden können, sondern nur als Delegierte, also ist das der Grund für das DrawingTest Klasse.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top