ログイン

wxWidgets

Top / wxWidgets

Japanese / English

この文書について

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コマンドを使ってコンパイルする例を示しておきます。

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., アイコンを変えたい)は、

  1. Makefile.bccを書き換える
    • 変数RESOURCESにhello.resを代入する
  2. 以下のファイル(ほぼC:\wxWidgets-2.8.0\samplesのsample.rcとsample.icoと同一)をhello.cppなどと一緒に置く
  3. コンパイル
    > 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にあります。

外部リンク

  • MacOSXにおけるwxWidgetsでの開発方法
    • XRCEDを用いたGUIアプリケーションの作成方法。MVCモデルの考え方で分かりやすいソースコードが提示されており、MaxOSX用とはいえLinuxやWindows環境の人にも非常に参考になる。
  • GNU Make
    • GNU make の日本語版manual。
  • Bakefile
    • 各環境に応じたMakefileを自動生成するツール。