線を引いたり四角形を描画したりしよう題名を見てください、はいわかりましたね。 本ページではウインドウに線を引いたり四角形を描画したり します。 ただし、 ウインドウに線を描いたり 四角形を 描画したりすることはできません。 そう できないのです。 D言語で初めてのGUI でのことを思い出してください。 文字を出力するのに Labelをはりました。 そうです、あんなことやこんなことを するには 専用のウエジットを張ってあげなくてはなりません。 DUIObject.Widget.DrawingArea を利用すれば、私が期待している線を描いたり、四角形を 描画したりできるのです。 import dui.All; public: class HelloWorld : MainWindow , ExposeListener { public : this() { DrawArea area = new DrawingArea(); area.setSizeRequest(100,100); add(area); setSizeRequest(200,200); show(); Dispatcher dis = new Dispatcher(); dis.addExposeListener(this,area); } bit noExposeCallback(Widget widget) { return false; } bit exposeCallback(Widget widget) { widget.getDrawable().drawRectangle(false,0,0,100,100); return true; } } void main(char [][]args) { DUI dui = DUI.dui(args); // GTK can receive and process it's own parameters new HelloWorld(); dui.go(); // start the main event loop }はいできました はいできました。 ウインドウに四角が描画されていますね。 大成功です。 これは 今は小さな一歩でもこれからの大きな 一歩えとつながることでしょう。 線を引いたり点を打ったりするにはwidget.Drawableというクラスを使用します。 drawAreaないのwidget部のgetDrawable() を用いることでdrawingAreaようの DrawAbleを手に入れることができます。 グラフィックコンテキストさらにwedgitにはgetFGgc()というGCクラスを渡す 部分があります。GCくらすはグラフィックコンテキスト という名前の略称です。グラフィックコンテキスト とはいったいどのようなものなのでしょうか。 グラフィックに関係しているもののようですが わたしは何を持って***というのかさっぱりです。 そこで GDKリファンス を参照することにしましょう。 グラフィックス・コンテキストは引数のようです。 描画するときに必要となるものらしいです。 (楽になる) ( Ruby-GNOME2 Project Websiteの一覧のdrawableの部分 でグラフィックコンテキストを変化 させたときの例がでているので参考になります。 ) 取りあえずGCを使ってみることにしましょう。bit exposeCallback(Widget widget) { GC gc = widget.getFGgc(); gc.setForeground(new Color(255,0,0)); widget.getDrawable().drawRectangle(true,0,0,100,100); return true; }GCのsetForeground(Color)を利用して色を変えることに挑戦しよう。 そして上のようにソースを変更してみたのです。 すると 右のようになりました。 線を引いたり四角形を描画したりしようだけどおかしいなあー。 drawLineとしても 線が描画されないじゃないか って思っていませんか。 うーん。描画されないですね。はい、こまりました。こまったときはソースを見ましょう。Drawable.dをみるのです。 extern (C) void gdk_draw_point(GdkDrawable * drawable, GdkGC * gc, gint x, gint y); extern (C) void gdk_draw_line(GdkDrawable * drawable, GdkGC * gc, gint x1_, gint y1_, gint x2_, gint y2_);と関数が呼び出されていて。 void drawPoint(gint x, gint y) { gdk_draw_point(drawable,gc.getGDKgc(), x, y); } void drawLine(gint x1, gint y1, gint x2, gint y2) { gdk_draw_line(gDraw(),gc.getGDKgc(), gc.getGDKgc(), x1, y1, x2, y2); }となっています。 うーん、どうもgDraw()がうまくのうしてなてようですね。調べてみましょう。 if( Area.getDrawable().gDraw() == null) { printf("gDraw is null\n"); } else { printf("gdraw is not null\n"); } if( Area.getWindow() == null) { printf("getWindow() is null"); } else { printf("getWindow() is not null"); }はい、うまくうごいていないようです。そこでDrawable.dを 書き換えることにしました。 gdk_draw_line(drawable, gc.getGDKgc(), x1, y1, x2, y2);はい、線が描画されるようになりました。ふー、よかった。 |