2010-07-17 54 views
7

我是一个相当有经验的程序员,但是对于GUI编程来说是新的。我试图将我为DFL编写的绘图库移植到gtkD中,但无法显示图纸。以下代码为我生成一个空白窗口。有人可以告诉我它出了什么问题,并且/或者发布最少的示例代码来获取几行到DrawingArea并在MainWindow中显示结果?gtkD:最小绘图示例?

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

我想你错过了PixMap缓冲区的东西。这是为PyGTK,但我认为它可能有所帮助: http://www.pygtk.org/pygtk2tutorial/sec-DrawingAreaWidgetAndDrawing.html – Eldelshell 2010-08-29 10:00:27

回答

4

我在d在GTK没有经历任何,但有很多,所以用gtkD教程的帮助下,我成功地破解了一个小例子:

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

在GTK,一个DrawingArea是实际上只是一个空白的小部件供您进行绘制,并且小部件上的绘画必须始终在expose-event处理程序中完成。 (虽然我知道这将改变在GTK 3!)

我知道你不能连接函数作为信号回调,只有代表,所以这就是DrawingTest类的原因。