D言語にはWindowsアプリケーションのサンプルが付属されています。まずはこれを動かしてみましょう。
Windowsプログラミング - プログラミング言語 D (日本語訳)
winsampサンプルの実行
DMDに付属されているwinsamp.d
とwinsamp.def
を自環境にコピーしてビルドします。
日本語化してみる
さて、D言語で日本語を扱うことはできるのでしょうか。たいていのマイナー言語では日本語を扱うのにいくばくかのテクニックを要します。D言語で日本語を扱うことは容易なのでしょうか?
サンプル中、myWinMain関数冒頭のcaption変数宣言部を以下のように書き換えてビルド・実行してみます。
wstring caption = "ハロープログラム";
実はここまでできてしまえば後は簡単です。なぜならばこのサンプルは典型的なWindowsアプリケーションの記述だからです。例えば「D Does Windows」を「D言語が好きなくいなちゃん」に変えようと思ったとき、このプログラムを「D Does Windows」で検索してみます。すると、WindowProc関数のWM_PAINT部がヒットします。
case WM_PAINT:
{
enum text = "D Does Windows";
PAINTSTRUCT ps;
HDC dc = BeginPaint(hWnd, &ps);
scope(exit) EndPaint(hWnd, &ps);
RECT r;
GetClientRect(hWnd, &r);
HFONT font = CreateFontW(80, 0, 0, 0, FW_EXTRABOLD, FALSE, FALSE,
FALSE, ANSI_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS,
DEFAULT_QUALITY, DEFAULT_PITCH | FF_DONTCARE, "Arial");
HGDIOBJ old = SelectObject(dc, cast(HGDIOBJ) font);
SetTextAlign(dc, TA_CENTER | TA_BASELINE);
TextOutA(dc, r.right / 2, r.bottom / 2, text.ptr, text.length);
DeleteObject(SelectObject(dc, old));
break;
}
ここのところで気になる記述があります。enum text = "D Does Windows";
は、文字列であるはずなのにenumと書いてあります。実はD言語では定数を記号定数で記述できるようなのです(分かりづらい文法を作らないでほしい...)。
ここではCreateFontとTextOutが使われているので、これらを使って日本語の文字を表示するサンプルを参照します。
上記サンプルを参考にD言語のソースをちょい変します。"D言語が好きなくいなちゃん"という文字列に付いているcast(wstring)
という記述は、UTF-8の文字列リテラルをWindowsのワイド文字列に変換するためのものです。最初Cスタイルのキャストを記述しましたがコンパイラに「こう直したら?」と指摘されたのでこのように書いたものです。
case WM_PAINT:
{
enum text = cast(wstring)"D言語が好きなくいなちゃん";
PAINTSTRUCT ps;
HDC dc = BeginPaint(hWnd, &ps);
scope(exit) EndPaint(hWnd, &ps);
RECT r;
GetClientRect(hWnd, &r);
HFONT font = CreateFontW(80, 0, 0, 0, FW_EXTRABOLD, FALSE, FALSE,
FALSE, SHIFTJIS_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS,
DEFAULT_QUALITY, DEFAULT_PITCH | FF_DONTCARE, "Century");
HGDIOBJ old = SelectObject(dc, cast(HGDIOBJ) font);
SetTextAlign(dc, TA_CENTER | TA_BASELINE);
TextOutW(dc, r.right / 2, r.bottom / 2, text.ptr, text.length);
DeleteObject(SelectObject(dc, old));
break;
}
このソースを実行するとこのようになります。
ウィンドウサイズを調整してやります。CreateWindowWの呼び出しで600, 400と指定しているところを1600, 900にしてやります。
とってもいいと思います。