2010-07-17 60 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類的原因。