wxWidgets
この文書について
wxWidgetsはGUIアプリケーションを作るためのツールキットです。WindowsやLinux、Macといった異なるプラットフォームのアプリケーションを、同一のソースコードで記述することができます。以下ではC++をある程度理解している人向けに、wxWidgetsのインストールから簡単なアプリケーションの作成までを解説していきます。
環境は基本的にLinux+gcc+gtkを想定していますが、wxWidgetsのインストールに関してはWindowsにも触れていきます。
私はwxWidgets初心者ですので、少しずつ勉強しながらこれを書いていくつもりです。間違い等がありましたらメールでお知らせください。
準備
環境毎のインストールとコンパイル方法を示していきます。
Linux(Fedoda Core 5) + gcc + gtk
インストール
[user@host]# yum install wxGTK*
コンパイル
サンプルプログラム(hello.cpp)のコンパイル方法を示します。
-
hello.cpp
[user@host]$ gcc -c hello.cpp -o hello.o `wx-config --cxxflags` [user@host]$ gcc hello.o -o hello `wx-config --libs` [user@host]$ ./hello
- 実行例
なお、wx-configはコンパイラに渡すオプションを生成するコマンドです。
[user@host]$ wx-config
により使い方を見ることができます。
ファイルが増えてきた場合に備えて、hello.cppをmakeコマンドを使ってコンパイルする例を示しておきます。
-
Makefile
[user@host]$ make
WindowsXP + bcc32(ver5.5)
インストール
公式ページ(英語)から「Downloads」を選び、「Current Stable Release」のwxMSWをダウンロードします(執筆時点でのバージョンは2.8.0)。ダウンロードしたファイルを実行し、指示に従ってインストールします。以後、「C:\wxWidgets-2.8.0」にインストールした場合を説明します。
-
C:\wxWidgets-2.8.0\docs\msw\install.txt
に各コンパイラ毎のライブラリの作り方が載っています。これに従ってコマンドプロンプトから
> cd C:\wxWidgets-2.8.0\build\msw > make -f makefile.bcc
を実行します。但し警告は無視して構いません。
コンパイル
付属のサンプルをコンパイルしてみましょう。再びコマンドプロンプトから
> cd C:\wxWidgets-2.8.0\samples\minimal > make -f makefile.bcc > cd bcc_mswd > minimal.exe
でウインドウが現れたら成功です。
付属サンプルのMakefile.bccを丹念に読むと、自分で作ったソースコードもコンパイルできます。ただ、BakefileというMakefile生成ツールを使っているためか、Makefileが分かりにくいような気がします。そこで、非常に単純化したMakefileを使って、簡単なソースコードをコンパイルしてみましょう(必要のない人は読み飛ばしてください)。
コマンドプロンプトから
> make -f Makefile.bcc
でhello.exeができたらOKです。
- 実行例
もしリソースファイルもリンクしたい場合(e.g., アイコンを変えたい)は、
-
Makefile.bccを書き換える
- 変数RESOURCESにhello.resを代入する
- 以下のファイル(ほぼC:\wxWidgets-2.8.0\samplesのsample.rcとsample.icoと同一)をhello.cppなどと一緒に置く
-
コンパイル
> make -f Makefile.bcc clean > make -f Makefile.bcc
アイコンが変われば成功です。
なお、以後の説明ではLinux+gcc+gtkを想定します。以上の説明を参考に、適宜読み替えて対応してください。
- 注:付属sampleのmakefile.bccで使っている「@&&| 〜 |」は、コマンドが長すぎる場合に一時ファイルを作って入力する(多分bcc32独自の)仕組みです。最初の@&&|と最後の|は取り去っても支障ありません。
プログラムの基本構造
最も簡単なプログラム
概要
前の準備で使用した「Hello World」を例にとって、wxWidgetsプログラムの基本的な構造を見ていきましょう。
1: #include <wx/wxprec.h> 2: 3: #ifdef __BORLANDC__ 4: #pragma hdrstop 5: #endif 6: 7: #ifndef WX_PRECOMP 8: #include <wx/wx.h> 9: #endif 10: 11: class helloApp: public wxApp 12: { 13: public: 14: virtual bool OnInit(); 15: }; 16: 17: IMPLEMENT_APP(helloApp) 18: 19: bool helloApp::OnInit() 20: { 21: wxMessageBox(wxT("Hello wxWidgets"), wxT("Message Box"), wxOK); 22: 23: return false; 24: }
1〜9行目はヘッダファイルのインストールをしています。一見不思議な書き方をしていますが、本家のマニュアル(英語)のInclude filesによると「これまでの経験の積み重ねの集大成」だそうなので、決まり文句と思った方がいいのかもしれません。
11〜15行目はwxAppクラスを継承したhelloAppクラスを宣言しています。wxWidgetsプログラムにはmain関数がありません。代わりにOnInit()がmain関数的な役割を果たします。
17行目も決まり文句です。詳しいことは理解できないのでマニュアルをそのまま訳すと「wxWidgets初期化に際して、wxWidgetsが適切な場所でアプリケーションオブジェクトのインスタンスを動的生成できるようにする」とのことです。
19〜24行目はOnInit()の定義です。メッセージボックスを表示(wxMessageBox())して終了します。OnInit()はboolを戻り値に取りますが、trueだと実行を継続、falseだと実行を終了します。試しに23行目をtrueにすると、メッセージボックスを閉じてもCtrl+Cで強制終了するまでプログラムが継続します。以上の説明は本家マニュアルのwxApp overviewにもあります。
wxWidgetsの関数
関数一覧は本家マニュアルのFunctionsにまとまっています。wxMessageBox()はwxWidgetsのダイアログ関数です。
int wxMessageBox(const wxString& message, const wxString& caption = "Message", int style = wxOK, wxWindow *parent = NULL, int x = -1, int y = -1)
引数 | 説明 |
---|---|
const wxString& message | ウインドウ内に表示されるメッセージ |
const wxString& caption = "Message" | ウインドウ上部に表示されるタイトル |
int style = wxOK | スタイル。wxYES_NO, wxCANCEL, wxOK,wxICON_EXCLAMATION, wxICON_HAND, wxICON_ERROR, wxICON_QUESTION, wxICON_INFORMATIONを組み合わせる。 |
wxWindow *parent = NULL | 親ウインドウ |
int x = -1 | ? |
int y = -1 | ? |
戻り値はユーザがクリックしたボタンに対応する値(wxYES, wxNO, wxCANCEL, wxOKのどれか)です。もう少し実用的?なサンプルを以下に示します。
1: #include <wx/wxprec.h> 2: 3: #ifdef __BORLANDC__ 4: #pragma hdrstop 5: #endif 6: 7: #ifndef WX_PRECOMP 8: #include <wx/wx.h> 9: #endif 10: 11: class helloApp: public wxApp 12: { 13: public: 14: virtual bool OnInit(); 15: }; 16: 17: IMPLEMENT_APP(helloApp) 18: 19: bool helloApp::OnInit() 20: { 21: int answer = wxMessageBox( wxT("Have you ever been to Tokyo?"), wxT("Question"), wxYES_NO | wxCANCEL | wxICON_QUESTION ); 22: 23: if( answer == wxYES ) 24: wxMessageBox( wxT("Oh, you\'ve been to Tokyo!"), wxT("Surprising"), wxOK ); 25: else if( answer == wxNO ) 26: wxMessageBox( wxT("Oh, me too !"), wxT("Not surprising"), wxOK ); 27: 28: return false; 29: }
- 実行例
- 「はい」をクリックした場合
文字列の取り扱い
hello.cppなどのサンプルで見られたように、文字列はwxT()マクロで囲みます。これはUnicodeに対応するためのもので、wxT("〜")には日本語も含むことができます。これ以外にも文字については、
- charの代わりにwxCharを用いる
-
stringの代わりにwxStringを用いる
べきであると本家マニュアルのUnicode support in wxWidgetsにあります。
外部リンク
-
http://www.wxwidgets.org/
- wxWidgetsの本家(英語)。マニュアルが特に役に立つ。
-
wxWindowsで始めるC++ GUIプログラミング::
- C++を知っている人向けに、wxWidgets(旧名wxWindows)の環境整備から簡単なGUIプログラムの作成までを解説。
-
MacOSXにおけるwxWidgetsでの開発方法
- XRCEDを用いたGUIアプリケーションの作成方法。MVCモデルの考え方で分かりやすいソースコードが提示されており、MaxOSX用とはいえLinuxやWindows環境の人にも非常に参考になる。
-
wxWidgets でクロスプラットフォーム GUIアプリを作ろう
- 他のGUIツールキットと比較したwxWidgetsの利点や、wxGladeを使ったGUI版「Hello world」の作成方法など。
-
GNU Make
- GNU make の日本語版manual。
-
Bakefile
- 各環境に応じたMakefileを自動生成するツール。