...ing logging 4.0

はてなブログに移行しました。D言語の話とかいろいろ。

名前を付けるほどのものでもなく

beginingD.PNG

D の仕様的には可能なはずなんだけど,今のコンパイラのバグ?のせいか, Java スタイルは難しそうだったので仕様変更.
せっかくデリゲートがあるので,こっちを使うことにした.
そしたら,今度は C# ライクになった(w

・・・実行ファイル(50KB弱)をダウンロードできるようにしてみる.
面白くもないけど(^^;
コードは続きをどうぞ.


//
// ForDを使ったサンプル
//
import dash;
import std.string;

public int UserMain()
{
// アプリケーションクラスの生成
g_app = new Application;

// フレーム生成
Frame frame = new MyFrame;
frame.create("Hello, world!", CW_USEDEFAULT, CW_USEDEFAULT, 400, 300);

// アプリケーションにフレームを登録してメッセージループに入る
g_app ~= frame;
g_app.messageLoop();

return 0; // 正常終了
}

public class MyFrame : Frame
{
private Button button1;
private Button button2;
private TextField text;
private char[] point;

// this()内でCreateWindow()できるならこの関数の処理はthis()へ移せる
public void initializeComponent()
{
// フレーム自身のイベントをセット(ちなみに~=演算子はpublic)
this.onDraw ~= &drawCanD;
this.onMouseDown ~= &mouseDown;
this.onMoveWindow ~= &moveWindow;

// ボタン1を生成
button1 = new Button;
this ~= button1; // コンテナに登録 // これはcreate()後に記述したい!!
button1.onClick ~= &showMessageOK; // ボタン押下時の処理をセット
button1.create("OK", 0, 0, 100, 25);

// ボタン2を生成
button2 = new Button;
this ~= button2; // コンテナに登録 // これはcreate()後に記述したい!!
button2.onClick ~= &showMessageYesNo;
button2.create("Yes/No", 110, 0, 100, 25);

// テキストボックスを生成
text = new TextField;
this ~= text;
text.create(r"テスト", 0, 50, 300, 25);
}

// ボタン1押下時に呼ばれる
public void showMessageOK(Component o)
{
MessageBox( this.hWnd, r"OKボタン", "showMessageOK",
MB_OK | MB_ICONINFORMATION);
text.text = r"OKボタンを押しましたね!";
}

// ボタン2押下時に呼ばれる
public void showMessageYesNo(Component o)
{
MessageBox( this.hWnd, r"Yes/Noボタン", "showMessageYesNo",
MB_YESNO | MB_ICONINFORMATION);
text.text = r"Yes/Noボタンを押しましたね!";
}

// フレームに描画する必要が生じたときに呼ばれる
public void drawCanD(HDC dc)
{
char[] message = r"D言語Windowsもできる";
RECT r;
GetClientRect( hWnd, &r);
HFONT font = CreateFontA( 80, 0, 0, 0, FW_EXTRABOLD, FALSE, FALSE,
FALSE, /*ANSI_CHARSET*/ SHIFTJIS_CHARSET, OUT_DEFAULT_PRECIS,
CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY, DEFAULT_PITCH | FF_DONTCARE,
r"MS明朝");
HGDIOBJ old = SelectObject( dc, cast(HGDIOBJ) font);
SetTextAlign( dc, TA_CENTER | TA_BASELINE);
TextOut( dc, r.right / 2, r.bottom / 2, message, message.length);
TextOut( dc, r.right / 2, 80 + r.bottom / 2, point, point.length);
// ウィンドウ座標を描画
SelectObject( dc, old);
}

// フレーム上でマウスを押したときに呼ばれる
public void mouseDown(Component c, int x, int y)
{
MessageBox(hWnd, r"フレームをクリック", r"フレームをクリック",
MB_OK | MB_ICONINFORMATION);
}

// フレームが移動/サイズ変更したときに呼ばれる
public void moveWindow(Component c, int x, int y)
{
point = "(left,top) = (" ~ std.string.toString(x) ~ "," ~ std.string.toString(y) ~ ")";
// ウィンドウ全体を再描画
this.redraw(Component.RedrawFlag.ERASE);
}
}

// スタートアップコードは省略(これどうやってライブラリに組み込めばよいのやら)

まあ,こんな感じでできます.
Frame を Application に登録しないと,その Frame にはメッセージがいかないとか, Win32API に依存しまくってるのが難といえば難.
まあ,誰が使うでもないしその辺はまだ適当で・・・.