D言語のWindowsサンプルをビルドしてみた

D言語にはWindowsアプリケーションのサンプルが付属されています。まずはこれを動かしてみましょう。

[Windowsプログラミング - プログラミング言語 D (日本語訳)](http://www.kmonos.net/alang/d/windows.html)

# winsampサンプルの実行

DMDに付属されている`winsamp.d`と`winsamp.def`を自環境にコピーしてビルドします。
![001.png](https://qiita-image-store.s3.amazonaws.com/0/64229/327e3b2d-ef7c-2188-116a-615e5ae6d667.png)
![002.png](https://qiita-image-store.s3.amazonaws.com/0/64229/b7d6e633-144c-3f79-959c-024d974ca4f3.png)
# 日本語化してみる

さて、D言語で日本語を扱うことはできるのでしょうか。たいていのマイナー言語では日本語を扱うのにいくばくかのテクニックを要します。D言語で日本語を扱うことは容易なのでしょうか？

サンプル中、myWinMain関数冒頭のcaption変数宣言部を以下のように書き換えてビルド・実行してみます。

```winsamp.d(抜粋)
    wstring caption = "ハロープログラム";
```

![003.png](https://qiita-image-store.s3.amazonaws.com/0/64229/5cda5163-5cb3-3c1d-697c-4e7d98825693.png)
実はここまでできてしまえば後は簡単です。なぜならばこのサンプルは典型的なWindowsアプリケーションの記述だからです。例えば「D Does Windows」を「D言語が好きなくいなちゃん」に変えようと思ったとき、このプログラムを「D Does Windows」で検索してみます。すると、WindowProc関数のWM_PAINT部がヒットします。

```winsamp.d(抜粋)
        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言語では定数を**記号定数**で記述できるようなのです(分かりづらい文法を作らないでほしい...)。

[列挙体 - プログラミング言語 D (日本語訳)](http://www.kmonos.net/alang/d/enum.html)

ここではCreateFontとTextOutが使われているので、これらを使って日本語の文字を表示するサンプルを参照します。

[ネコでもわかるプログラミング -　第２７章](http://www.kumei.ne.jp/c_lang/sdk/sdk_27.htm)

上記サンプルを参考にD言語のソースをちょい変します。"D言語が好きなくいなちゃん"という文字列に付いている`cast(wstring)`という記述は、UTF-8の文字列リテラルをWindowsのワイド文字列に変換するためのものです。最初Cスタイルのキャストを記述しましたがコンパイラに「こう直したら？」と指摘されたのでこのように書いたものです。

```winsamp.d(抜粋)
        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;
        }
```

このソースを実行するとこのようになります。
![004.png](https://qiita-image-store.s3.amazonaws.com/0/64229/a99d1c6e-0a11-8ba3-c83a-77b13bd086bb.png)
ウィンドウサイズを調整してやります。CreateWindowWの呼び出しで600, 400と指定しているところを1600, 900にしてやります。
![005.png](https://qiita-image-store.s3.amazonaws.com/0/64229/65e63d81-4c15-7b7e-63e1-453082ddbd04.png)
とってもいいと思います。