gtkD:Minimales Zeichnungsbeispiel?
-
17-09-2020 - |
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();
}
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.