ダブルブァッファ
ダブルブァッファってなんだ〜〜〜〜。う〜ん、
これは難しい。 今までの描画ほうほう
(
線を引いたり 四角形を描画したり
)
に不満はありませんか。 はい、せっかく描画したのに
描画した内容が消えてしまいますね。ダブルブァッファは
この「せっかく描画した内容が消えてしまう」という問題
を解決してくれます。 import dui.All; public: class HelloWorld : MainWindow , ExposeListener { public : Pixmap buffer; this() { super("mosskite"); DrawingArea 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) { static int flag = 0; if( widget.getWindow() != null && flag == 0) { flag =1; buffer = new Pixmap(new Pixmap(widget.getWindow()),100,100,-1); GC gc = widget.getFGgc(); gc.setForeground(new Color(255,255,255)); buffer.drawRectangle(gc,true,0,0,100,100); } else { widget.getDrawable().drawDrawable(widget.getFGgc(),buffer,0,0,0,0,100,100); } return true; } } void main(char [][]args) { DUI dui = DUI.dui(args); new HelloWorld(); dui.go(); }
白色の四角形をPixmap上に描画を行っあとに DrawinArea上にPixmap上に
描かれた内容を描画しています。
現在Pixmapのコンストラクターは2つ存在します。
Drawable.dの変更。widget.getDrawable().gDraw()とするとgDraw()で かえされるはずのGDKDrawableはnullをかえします。 かわりにGDKDrawableはDrawableないのdrawableがもっているようです。さらに Pixmap().gDraw()とするとgDraw()ないのGDKDrawableは値を持っています。が Drawableないのdrawableはnullとなっています。これは、まぎらわしいですね。この紛らわしい内容のために私はとても苦労をしました ( 線を引いたり 四角形を描画したり )では Drawable.dをかきかえてしまいました。 今回の場合 Drawable.drawDrawableを使用するのは前者であり。 しかしDrawable.drawRectangleは後者です。 だから取りあえず以下のように変更してしまいました。 void drawRectangle (GC gc, bit filled, gint x, gint y, gint width, gint height) { gdk_draw_rectangle (gDraw(), gc.getGDKgc(), filled, x, y, width, height); } void drawDrawable (GC gc, Drawable drawable, gint xsrc, gint ysrc, gint xdest, gint ydest, gint width, gint height) { gdk_draw_drawable (this.drawable, gc.getGDKgc(), drawable.gDraw(), xsrc, ysrc, xdest, ydest, width, height); } とりあえずこれで動作しました。以上です。 注意(本当は DrawAbleを継承して 変更するメソッドをOverridするのが良いと思いますが、 説明が入り組んでしまうので今回は直接書き換えました。後、 書き換えた後 goMake.batを実行することを忘れないでね) |
無料ホームページ 楽天モバイル[UNLIMITが今なら1円] 海外格安航空券 海外旅行保険が無料!