3-b5. wxD で GUI プログラミング

初出: 2007/03/07
最新: 2007/03/07
[3. D言語各論] に戻る

wxD とは

wxD とは、 wxWidgets をD言語から使えるようにしたGUIライブラリです。

D言語向けのGUIライブラリは数多く開発されていますが、その中でもwxDは

という点で一番安心して使えそうというのが私の感想です。そんなわけで、ここでは wxD の使い方を紹介していきます。

他に

その他に完成度の高いGUIライブラリとしては、

があります。

インストール方法

DMD / Windows にインストールする方法を説明します。 wxD のページ の下の方にオフィシャルの説明があります。

wxWidgets

まず http://prdownloads.sourceforge.net/wxwindows/wxMSW-2.6.3.zip をダウンロード&展開。 wxDで使う分には、ビルドが終わったらライブラリ以外は不要になるので、どこか適当なテンポラリフォルダでも いいです。

以下のコマンドで、ビルドします。make は必ず DigitalMars の make を使うようにしてください。

> cd c:\Temp\wxWidgets-2.6.3   ← 展開したディレクトリ
> cd build\msw
> make -f makefile.dmc

wxD

http://prdownloads.sourceforge.net/wxwindows/wxd-0.09.tgz をダウンロード&展開。

ビルド…の前に、0.09 にはバグがあるので直します。wxc/app.cpp の123行目の wxApp_Initialize 関数をこんな感じに。

extern "C" WXEXPORT
wxc_bool wxApp_Initialize(_App* self,int& argc, char **argv)
{
//  const wxChar* wargv[argc];
//  for (int i=0; i < argc; i++)
//      wargv[i] = argv[i] ? wxString(argv[i],*wxConvCurrent).c_str() : NULL;

    const wxChar** wargv = new const wxChar*[argc+1];
    for (int i=0; i < argc+1; i++)
        wargv[i] = argv[i] ? wxStrdup(wxString(argv[i],*wxConvCurrent).c_str()) : NULL;

    return self->wxApp::Initialize(argc,(wxChar**)wargv)?1:0;
}

ビルドは、こんな感じで。やはり必ず DigitalMars の make を使うように注意です。

> cd c:\Temp\wxd-0.09
> set WXDIR=c:\Temp\wxWidgets-2.6.3   ← "wxWidgets"を展開したディレクトリ
> make

必要なファイル

import する*.dファイルは、

にあります。リンクに必要な *.lib ファイルは

です。私はextlib.ja.html で書いたようにこれらのファイルを DMDのフォルダにコピーしちゃってますが、その辺りはお好みで。

これでビルド完了。wxDが使えるようになりました。

使ってみる

まずは、何も中身のないウインドウを出すサンプルから行きます。

// wxtest.d
import wx.wx;

class MyApp : App
{
    override bool OnInit()
    {
        Frame frame = new Frame("てすとだよ", Point(100,100), Size(256,128));
        frame.Show(true);
        return true;
    }
}

void main()
{
    (new MyApp).Run();
}

> dmd -version=__WXMSW__ wxtest.d -L/exet:nt/su:windows:4.0
    wxc.lib wxd.lib wxmsw26d_qa.lib wxmsw26d_html.lib wxmsw26d_adv.lib
    wxmsw26d_core.lib wxbase26d_xml.lib wxbase26d_net.lib wxbase26d.lib
    wxtiffd.lib wxjpegd.lib wxpngd.lib wxzlibd.lib wxregexd.lib wxexpatd.lib
    kernel32.lib user32.lib gdi32.lib comdlg32.lib winspool.lib winmm.lib
    shell32.lib comctl32.lib ole32.lib oleaut32.lib uuid.lib rpcrt4.lib
    advapi32.lib wsock32.lib ws2_32.lib

実行画面

…リンクするライブラリが多いので、ちょっとコマンドラインが長いですね。 Makefile を作って開発するのが便利だと思います。オプションをまとめた 「レスポンスファイル」を用意しておく手もあります。DMD用とBud用にそれぞれ、 wxDをリンクするレスポンスファイルを作ってみました。

> dmd wxtest.d @wx.rsp
> bud wxtest.d @wx

もっと使ってみる

ちょっと手抜きにもほどがあるくらい手抜きのお絵描きソフトでも描いてみましょう。

import wx.wx;

class MyFrame : Frame
{
    enum {CMD_QUIT};

    this()
    {
        // フレーム作成
        super("お絵描き", wxDefaultPosition, Size(500, 500));
        BackgroundColour = Colour.wxWHITE;

        // メニューバー
        auto fileMenu = new Menu;
        fileMenu.Append(CMD_QUIT, "終了", "このプログラムを終了します");
        auto mBar = new MenuBar;
        mBar.Append( fileMenu, "ファイル" );
        menuBar = mBar;

        // イベント
        EVT_MENU(CMD_QUIT, &OnQuit);
        EVT_MOUSE_EVENTS(&OnMouseEvent);
        EVT_PAINT(&OnPaint);
    }

    void OnQuit(Object sender, Event e)
    {
        Close();
    }

    void OnPaint(Object sender, Event e)
    {
        scope dc = new PaintDC(this);

        dc.brush = Brush.wxGREEN_BRUSH;
        dc.pen   = Pen.wxGREEN_PEN;
        foreach(pt; pts)
            dc.DrawEllipse( pt, Size(20,20) );
    }

    void OnMouseEvent(Object sender, Event e)
    {
        if( auto ee = cast(MouseEvent) e )
            if( ee.Dragging )
            {
                pts ~= ee.Position;
                Refresh();
            }
    }

    Point[] pts;
}

class MyApp : App
{
    override bool OnInit()
    {
        (new MyFrame).Show(true);
        return true;
    }
}
 
void main()
{
    (new MyApp).Run();
}

ダブルバッファリングも何もしていないというか、OnPaintのたびに全点描き直してますが、 手抜きなのでよしとします。どなたかもっとちゃんとしたの書いてください。 と、まあ、こんな感じで割と気軽に使えるGUIライブラリです。サンプルがかなり豊富に 付属しているので、参考になります。

API は wxWidgets のクラス構成に対応していますが、「クラス名の接頭子 "wx" をつけない (wxFrameの代わりにFrameなど)」 「set~, get~ メソッドはプロパティで置き換える(SetMenuBarの代わりにmenuBar=など)」 といった微調整がなされています。基本は wxWidgets のドキュメントや解説を参考にしながら、 適宜 wxDのAPIリファレンス を調べて使うと良いのではないかと思います。

[3. D言語各論] に戻る

presented by k.inaba   under NYSDL.