四角形を表示する
 DrawingAreaクラスはGCクラス(のグラフィックコンテキスト)をもちいて 図や線を描画することができます。
 ということは DrawingAreaをもちいると図だとかを描画することができるようになるわけです。
 ただし問題があります、それは、別のアプリなどのウインドウが重なるとき おこります。 重なってしまった部分に表示されていた内容が消えてしまうのです。
 そこで、解決策として、ウインドウが重なってしまったときに「Windowが重なっているぞ」、と教えてくれる イベントを受け取ります。
  ExposeListenerを用います。
   bit noExposeCallback(Widget widget) 
   bit ExposeCallback(Widget widget)  widgetが重なると呼び出されます

注意 widgetはwindowに貼り付けるようなオブジェのBaseとなるクラスです。

import dui.All;

public:

class HelloWorld : MainWindow , ExposeListener 
{
	public :
		
	this()
	{
		super("Draw");
		DrawingArea area = new DrawingArea();
		area.setSizeRequest(120,120);
		add(area);

		setSizeRequest(120,120);
		show();
		
		Dispatcher dis = new Dispatcher();
		dis.addExposeListener(this,area);
	}
	

	bit noExposeCallback(Widget widget)
		{
			return false;
		}

	bit exposeCallback(Widget widget)
		{
		widget.getDrawable().drawRectangle(false,10,10,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
	
}

での
グラフィックコンテクスト

	bit exposeCallback(Widget widget)
		{
		GC gc = widget.getFGgc();
		gc.setForeground(new Color(255,0,0));
		widget.getDrawable().drawRectangle(true,10,10,100,100);
		return true;
		}

dui_00.15_98での問題点

 だけどおかしいなあー。 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);
ラインが描画されています はい、線が描画されるようになりました。ふー、よかった。 注意( * ダブルバッファのときは drawableがうまく動きません。 詳しくは次項にて) 戻る

テレワークならECナビ Yahoo 楽天 LINEがデータ消費ゼロで月額500円〜!
無料ホームページ 無料のクレジットカード 海外格安航空券 海外旅行保険が無料! 海外ホテル