ボタンを押すと「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言語くんかわいい