1
0

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.

KuinAdvent Calendar 2018

Day 12

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

Posted at

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

Windowsプログラミング - プログラミング言語 D (日本語訳)

winsampサンプルの実行

DMDに付属されているwinsamp.dwinsamp.defを自環境にコピーしてビルドします。
001.png
002.png

日本語化してみる

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

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

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

003.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 (日本語訳)

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

ネコでもわかるプログラミング - 第27章

上記サンプルを参考に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
ウィンドウサイズを調整してやります。CreateWindowWの呼び出しで600, 400と指定しているところを1600, 900にしてやります。
005.png
とってもいいと思います。

1
0
1

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
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?