wxWidgetsを使ってみよう

VC++ 2008 ExpressでwxWidgetsを使うための設定方法をまとめてみました。(2010/9/11時点の情報)
参考サイト: http://wiki.wxwidgets.org/Microsoft_Visual_C%2B%2B_Guide

wxWidgetsとは

wxWidgetsとはC++GUIを作成することができるクロスプラットフォームライブラリです。Windowsはもちろん、MacLinuxでもちゃんと動きます。見た目が各OSの標準的なデザインになるのでOSごとにGUIの処理を分けて考える必要は全くありません。

wxWidgetsのダウンロード

http://www.wxwidgets.org/downloads/ から入手することができます。(現時点での安定版は2.8.11)
"wxMSW"のところでWindowsインストーラ(あるいはzip形式)をダウンロードします。
次に、wxWidgetsを例えば次のディレクトリに展開します。
C:\wxWidgets-2.8.11
以下、wxWidgetsをインストールしたディレクトリをと表記することにします。( = C:\wxWidgets-2.8.11)

初期設定

wxWidgetsをビルドする前に自分で設定をカスタマイズすることができます。各設定項目はsetup.hに定義されています。
\include\wx\msw\setup.h (Windowsの場合)
例えば、デフォルトではOpenGLを使えないので、下のようにwxUSE_GLCANVASを1に変更して利用できるようにしておきます。

#define wxUSE_GLCANVAS       1

wxWidgetsのビルド

\build\msw\wx.dsw を開きます。
DebugビルドとReleaseビルドの両方で「ソリューションのビルド」を実行します。
ビルドが終わったら、\lib\vc_lib にwxbase28.lib,wxbase28d.lib....などが作成されていると思います。

環境変数へのパスの追加

ディレクト環境変数に登録します。
システムのプロパティ→環境変数→システム環境変数→新規作成
・変数名 WXWIN
・変数値 今回の場合はC:\wxWidgets-2.8.11に設定します。

VCの設定

\sampleにいくつかサンプルがありますが、一から設定してみましょう。

1.Windowsアプリケーションで空の新規プロジェクトを作成
2.インクルードディレクトリの追加

プロジェクトのプロパティ→構成プロパティ→C/C++→全般→追加のインクルードディレクトリに以下のパスを追加
$(WXWIN)\include;$(WXWIN)\lib\vc_lib\mswd (Debug,Release両方)

3.ライブラリのディレクトリ追加

プロジェクトのプロパティ→構成プロパティ→リンカ→全般→追加のライブラリディレクトリに以下のパスを追加
$(WXWIN)\lib\vc_lib (Debug,Release両方)

4.依存するライブラリの追加

プロジェクトのプロパティ→構成プロパティ→リンカ→入力で次のライブラリを指定
[Debugビルド]
wxmsw28d_core.lib wxbase28d.lib (必須 wxWidgetsコアライブラリ)
comctl32.lib rpcrt4.lib winmm.lib advapi32.lib wsock32.lib (必須)
wxpngd.lib wxzlibd.lib wxjpegd.lib wxtiffd.lib wxregexd.lib wxexpatd.lib (オプション 必要に応じて)
wxmsw28d_gl.lib (OpenGLを利用する場合)
[Releaseビルド]
wxmsw28_core.lib wxbase28.lib
comctl32.lib rpcrt4.lib winmm.lib advapi32.lib wsock32.lib
wxpng.lib wxzlib.lib wxjpeg.lib wxtiff.lib wxregex.lib wxexpat.lib
wxmsw28_gl.lib (OpenGLを利用する場合)

5.プリプロセッサ定義の追加

プロジェクトのプロパティ→構成プロパティ→C/C++プリプロセッサプリプロセッサの定義 に以下のマクロを設定します
__WXMSW__(必須)
__WXDEBUG__(オプション) このマクロを定義するとwxAssertなどが利用できるようになる
Debugビルドの場合の例 WIN32;_DEBUG;_WINDOWS;__WXMSW__;__WXDEBUG__
Releaseビルドの場合の例 WIN32;NDEBUG;_WINDOWS;__WXMSW__

簡単なサンプル

SampleMain.cppというファイルに以下のコードを記述してビルド→実行してください。
HelloWorldというタイトルのウインドウが1つ表示されます。

#include "wx/wx.h"

class MyApp: public wxApp
{
    virtual bool OnInit();
};

bool MyApp::OnInit()
{
    wxFrame *frame = new wxFrame(	NULL, -1, _("Hello World"),
					wxPoint(10, 10), wxSize(200, 200) );
    frame->Show(true);
    SetTopWindow(frame);
    return true;
}

IMPLEMENT_APP(MyApp)

main関数はIMPLEMENT_APPというマクロで定義されており、アプリケーションクラスwxAppを引数として渡す形になっています。また、フレームはwxFrameクラスとして定義されています。

(注)Unicode Debugビルドでなく普通のDebugビルドでコンパイルできない場合は、
プロジェクトのプロパティ→構成プロパティ→全般→文字セットを
"マルチ バイト文字セットを使用する"に設定します。