Pregunta

Soy un programador bastante experimentado, pero nuevo en la programación de GUI.Estoy tratando de abrir una biblioteca de trazado que escribí para DFL a GTKD, y no puedo obtener dibujos para aparecer.El siguiente código produce una ventana en blanco para mí.¿Puede alguien decirme qué está mal con él, y / o código de ejemplo mínimo, para obtener algunas líneas en un DrawingArea y mostrar los resultados en 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();
}

¿Fue útil?

Solución

No tengo experiencia en D, pero mucho en GTK, así que con la ayuda del tutorial GTKD, me las arreglé para hackear un ejemplo mínimo:

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 es realmente solo un widget en blanco para que pueda pintar, y la pintura en los widgets siempre debe realizarse en el manejador de expose-event.(Aunque entiendo que esto cambiará en GTK 3!)

Entiendo que no puede conectar las funciones como devoluciones de llamada de señales, solo delegados, por lo que es la razón de la clase de DrawingTest.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top