TOPに戻る(D言語だぜ)
ホームに戻る(Kyoroの部屋)

ダブルブァッファ

ダブルブァッファってなんだ〜〜〜〜。う〜ん、 これは難しい。 今までの描画ほうほう ( 線を引いたり 四角形を描画したり ) に不満はありませんか。 はい、せっかく描画したのに 描画した内容が消えてしまいますね。ダブルブァッファは この「せっかく描画した内容が消えてしまう」という問題 を解決してくれます。
では、ダブルブァッファとは何か? それはね、 ウインドウに直接描画するとデーターが消えちゃうから。 ウインドウに直接描画しないで表示すべき内容は別の 場所に保存しておいて、「描画した内容が消え時は また保存していた内容をウインドウに描画する。てな ことです。どうでしょうか、なっとくしていただけましたか。

ではでは、「別な場所に保存しておいて」とありますがいったい どこに保存すればいいのでしょうか。それはね、 Drawable-Pixmap が別な場所になってくれます。はいPixmapにウインドウの内容を ほじしておけばよいのです。
ではではプログラムをかいて見ましょう。


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つ存在します。
Pixmap(new Pixmap(widget.getWindow()),0,0,100,100,-1);(1) とPixmap(widget.getWindow());(2)の2つです。しかし注意してください。 この二つはまったく異なる性質を持っています。 とりあえず説明はいたしませんが、(2)の方法だと描画した後描画内容は 消えてしまいます。それではウインドウに描画された内容が消えないウインドウを 作るという目標は達成できないので(2)の方をしようしています。
Pixmapの描画内容を描画するには widget.getDrawable().drawDrawable(widget.getFGgc(),buffer,0,0,0,0,100,100); のようにするとよいようです。

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を実行することを忘れないでね)

PC用眼鏡【管理人も使ってますがマジで疲れません】 解約手数料0円【あしたでんき】 Yahoo 楽天 NTT-X Store

無料ホームページ 無料のクレジットカード 海外格安航空券 ふるさと納税 海外旅行保険が無料! 海外ホテル