Pergunta

Sou bastante experiente programador, mas nova a programação GUI.Eu estou tentando porta de uma biblioteca de plotagem que eu escrevi para a DFL para gtkD, e eu não consigo desenhos para mostrar-se.O código a seguir produz uma janela em branco para mim.Alguém por favor pode me dizer o que há de errado com ele, e/ou publicar o mínimo de código de exemplo para obter algumas linhas para um DrawingArea e exibir os resultados em uma 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();
}
Foi útil?

Solução

Eu não tenho experiência alguma em D, mas de lotes em GTK, assim, com a ajuda do gtkD tutorial eu consegui hackear um mínimo exemplo:

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

Em GTK, uma DrawingArea na verdade, é apenas um espaço em branco widget para você pintar, e pintura em widgets deve ser feito sempre no expose-event manipulador.(Apesar de eu entender que isso vai mudar em GTK 3!)

Eu entendo que você não pode se conectar funções como sinal de retorno, apenas os delegados, de modo que a razão para a DrawingTest de classe.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top