13
12

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

#D言語くんかわいい
dman_optimized.gif

ボタンを押すと「D言語くんかわいい」と表示されます。D言語くんかわいい。

##ソースコードの説明

app.d
import std.stdio;
import std.random;
//サンプルコードにはdlangui.allと書いてるけどこう
import dlangui;

//サンプルコードにはDLANGUI_ENTRY_POINTと書いてるけど変わってる
mixin APP_ENTRY_POINT;

extern(C) int UIAppMain(string[] args)
{
	Platform.instance.uiLanguage = "ja";
	//UIのテーマを設定
	Platform.instance.uiTheme = "theme_default";

	//Windowを生成
	auto window = Platform.instance.createWindow("Hello World!",null);
	//日本語フォントの読み込み。デフォルトでは豆腐になった
	auto jaFont = FontManager.instance.getFont(20,FontWeight.Normal,false,FontFamily.MonoSpace,"JKゴシックM");
    //HorizontalLayoutを継承した「D言語くん可愛い」の文字が表示されるウィジェット
	auto layout = new DmanLayout(jaFont);
	//D言語くんクラス。画像表示するだけ
    auto dman = new Dman;
    //ボタン。Buttonを継承してフォントを変更出来るようにした
	auto btn = (new JaButton(jaFont)).text("D言語くん可愛い!!!");
	//ボタンが押された時に実行されるデリゲートを代入。引数で渡されるsrcはイベントの起こったWidget
        btn.onClickListener = delegate(Widget src)
		{
			layout.kawaii(); //「D言語くん可愛い」を表示
			return true;
		};
	layout.addChild(dman);
	layout.addChild(btn);
        //Windowにlayoutを追加
	window.mainWidget = layout;
	//表示
        window.show();
     //メッセージループ突入
	return Platform.instance.enterMessageLoop();
}

class DmanLayout : HorizontalLayout
{
private:
    //「D言語くん可愛い」を描画する位置の集合
	Point[] textPositions;
	FontRef jaFont;
	this(FontRef jaFont)
	{
		this.jaFont = jaFont
		backgroundColor = 0xFFFFC0;
	}
    //JavaのSwingで言うところのpaint。
	override void onDraw(DrawBuf buf)
	{
        //親メソッドのonDrawを呼び出す。これをしないと背景が描画されなかったり
		super.onDraw(buf);
        //すべての「D言語くん可愛い」を再描画
		foreach(str;textPositions)
			jaFont.drawText(buf,str.x,str.y,"D言語くん可愛い",0xFF0000);
	}
	void kawaii()
	{
		auto rndX = uniform(0,width);
		auto rndY = uniform(0,height);
		textPositions ~= Point(rndX,rndY);
		//onDrawの呼び出しを要求する
        invalidate();
	}
}

class Dman:Widget
{
private:
        DrawBuf image;
	this()
	{
                //画像をロード。DrawBufを継承したColorDrawBufというものが返ってくる
		image = loadImage("compiler-dmd.png");
                //ピクセル数も簡単に取得
		layoutHeight = image.height;
		layoutWidth = image.width;
	}
	override void onDraw(DrawBuf buf)
	{
		super.onDraw(buf);
        //渡されたDrawBufに描画
		buf.drawImage(0,0,image);
	}
}

class JaButton:Button
{
private:
        FontRef jaFont;
	this(FontRef jaFont)
	{
		this.jaFont = jaFont;
        //最大の高さを設定
        maxHeight = 100;
	    //余白の設定
        margins = Rect(50,50,50,50);
    }
    //fontメソッドをオーバーライドして使用されるフォントを変更
	override FontRef font() @property const
	{
		return cast(FontRef)jaFont;
	}
}

struct Point
{
	int x,y;
}               

DlangUIなかなか楽で楽しいです。デリゲートを使ったりとD言語の機能を使えるのがなかなかいいです。D言語くんかわいい

13
12
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
13
12

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?