初出: 2007/03/07
最新: 2007/03/07
[3. D言語各論] に戻る
wxD とは、 wxWidgets をD言語から使えるようにしたGUIライブラリです。
D言語向けのGUIライブラリは数多く開発されていますが、その中でもwxDは
という点で一番安心して使えそうというのが私の感想です。そんなわけで、ここでは wxD の使い方を紹介していきます。
その他に完成度の高いGUIライブラリとしては、
があります。
DMD / Windows にインストールする方法を説明します。 wxD のページ の下の方にオフィシャルの説明があります。
まず 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
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リファレンス を調べて使うと良いのではないかと思います。