WxWidgets

出典: YKAwiki

目次

概要

wxWidgetsとはどのOSでも同じコードで同じGUIプログラムを構築できるGUIライブラリです。 MFCとコーディングスタイルが似ている点から移行しやすいという利点があります。

なんでこんなんもってきたんだ? By MHL

  • HPLがMFCでMarathonというゲームのマップデータを作成するツール作りたいな、と思う
  • MarathonのフォーラムであるPfhorumsに投げてみる
  • MacOSXやUnixユーザーが多すぎて反応いまいち
  • 「wxWidgetsっていうマルチプラットフォーム対応GUIライブラリ使ってみてよ」と言われる
  • いまここ(Pfhorumsに新しいスレを立ててみた)

正直MFCみたいなものなので、C#使ってればいいと思う。過去の財産をそのまま利用したい&Win以外でGUI使いたい人だけが参考にすればOK。

リンク

wxWidgets本家 ダウンロードからドキュメントがあります。
HPLのMarathon関連Webサイト
MapEditorOne 上で公開してるMapエディタ(MFC版)。これをマルチ(略)化しようという話。
wxGladewxGladeはwxWidgetsでのGUIプログラム構築を簡単にしてくれます。

開発環境の整備

主に Windows + VC++ の提供でお送りいたします。 というか他の方法はやってないので知らない

ダウンロード

VC++ Express Edition とMicrosoft Platform SDKをダウンロードしてインストールします。 Visual C++ 2005 Express Edition と Microsoft Platform SDK を一緒に使う

次に本家からwxWidgetsパッケージをダウンロードしてインストールします。 wxWidgets本家 画像:Image200.png

stlportとかSDLとかboostとか使いたいなら適宜ダウンロード。 特にstlportは他より先にインストール&ビルド&パス通ししておかないと後で厄介なことになります。

ビルド

そのままじゃ使えないので、ライブラリをビルドします。 まず、c:/wxWidgets-2.8.4/build/msw/に移動します 画像:Image201.png

スタティックライブラリを作るならwx.dswを、ダイナミックライブラリを作るならwx_dll.dswをダブルクリック。 VC++が「このプロジェクトファイルは古いから新しいものに変換するよ?」と聞いてくるので「すべてはい」を選択。 開いたら適当な構成を選んで「ビルドメニュー」→「ソリューションをビルド」で終了。

構成は

  • Debug マルチバイトデバッグモード
  • Release マルチバイトリリースモード
  • DLL * ダイナミックライブラリ生成モード
  • * Unicode ユニコード版
  • * Universal ?

マルチバイトというのは通常のchar型を使うタイプのことです。 Unicodeはcharの代わりにwchar_tを使う形式です。 多言語のことを憂慮しなくてもいいというのが強みですが、 char型を使っている部分も多いため、変換する必要があります。 Universalは不明。

dbgridは失敗するかもしれませんが、使わないので放置プレイ。

ちなみにHPLはスタティックライブラリのビルド&利用ができなかった。 ワケワカメ

プロジェクト&コンパイラ設定

パス設定

インクルードはプロジェクトプロパティの「C/C++」→「全般」でもいい。 画像:Image202.png msvcディレクトリも入れるのがポイント。 ライブラリ設定は [wxWidgetsインストールディレクトリ]/lib/vc_dll をどっかに追加すればOK。スタティックライブラリなら/lib/vc_lib です。

プリプロセッサ

プリプロセッサとは、コンパイルの前に処理される前準備。

#define とか#ifdef とかのことです。

プロジェクトの設定は主に#defineになります。 画像:Image204.png 多すぎ(^^;

  • WIN32,_DEBUG,_WINDOWS WIN32アプリ設定だと標準でついてくる設定。ほっといた
  • SDL HPLが大好き
  • __WIN32__ 諸事情により入れている。キニシナイ
  • __WINDOWS__,__WXMSW__ wxWidgets用にこれを設定しないと怒られる
  • __WXDEBUG__ デバッグモードのみ必要
  • WXUSINGDLL DLLモードで使うとき必要
  • UNICODE ユニコードモード用
  • __wxUSEUNICODE__ wxWidgets用のユニコードモード用設定

追加するライブラリ

画像:Image208.png 基本的には

  • wxmsw28??_core.lib
  • wxbase28??.lib

があれば動く。 ??は

  • u ユニコード版
  • d デバッグ版

を意味している。

SDL.libやAlephOneSrcD.libはHPLの内緒

とりあえずウインドウ表示

プロジェクトをTestWXとする。

wxWidgetsのプログラムは基本的に

  • メインオブジェクト
  • wxFrameを継承したフレームオブジェクト

で構成される。

まずは

TestWX.h
TestWX.cpp
TestWXFrame.h
TestWXFrame.cpp

というファイルを作成する。

[TestWX.h]
//重複宣言回避用。古いコンパイラだと対応してないので、
//#ifndef でやったほうがいいけど、書くのが面倒なのでこっち
#pragma once
//プリコンパイルを使いたい場合に使用
#include <wx/wxprec.h>

//ボーランドC/C++用のおまじない
#ifdef __BORLANDC__
#pragma hdrstop
#endif

//必要なインクルード
#ifndef WX_PRECOMP
// Include your minimal set of headers here, or wx.h
#include <wx/wx.h>
#endif
#include "wx/settings.h"

/**
    "wxApp"を継承してメインクラスを作ります
    DECLARE_APP(TestWX)によって
*/
class TestWX: public wxApp
{
public:
    /**
        初期化関数。これをオーバーライドすれば
        他はwxAppがなんとかしてくれる
    */
    virtual bool OnInit();
};
/**
    メインアプリケーションクラスとしてのシングルトンに登録します
    シングルトンなのでTestWX.hをインクルードしているところならどこ
    からでもwxGetApp()で参照することができます。
*/
DECLARE_APP(TestWX)

フレームをメインクラスに持たせる必要はありませんが、 wxGetApp()によってどこからでも参照したいならば、 持たせてもいいでしょう。

ただし、インクルードが交差する場合があるので、 インクルードの交差を抑止する方法を参考にして なんとかやってください。

[TestWXFrame.h]
#include "MapEditorWX.h"
/**
    wxFrameを継承してウインドウフレームを作成します
    JFrameみたいな感じ
*/
class TestWXFrame: public wxFrame
public:
    TestWXFrame(const wxString& title,
        const wxPoint& pos = wxDefaultPosition,
        const wxSize& size = wxDefaultSize);

    //イベントテーブル作成<en>declare
    DECLARE_EVENT_TABLE()
};
[TestWX.cpp]
#include "TestWXWX.h"
#include "TestWXFrame.h"

//インスタンスを実際に作成させます
IMPLEMENT_APP(TestWX)
bool TestWX::OnInit()
{
    //ウインドウフレームを生成します
    frame = new TestWXFrame(
        _T("Title"));

    //ウインドウを表示します
    frame->Show(true);
    return true;
}
[TestWXFrame.cpp]
#include "TestWXFrame.h"

//イベントテーブルを作成するマクロです。
//一番目の引数は実際に適用するクラス、二番目は基本クラスです
BEGIN_EVENT_TABLE(TestWXFrame, wxFrame)
END_EVENT_TABLE()

TestWXFrame::TestWXFrame(const wxString& title,
                        const wxPoint& pos,
                        const wxSize& size)
                        :wxFrame((wxFrame*)NULL,
                        wxID_ANY, title, pos, size)
{
}

秘訣

英語で言うところのTips

一般的な処理

wxWidgets/カーソルを変更する

wxWidgets/ファイル選択ダイアログ

wxWidgets/ディレクトリ選択ダイアログ

wxWidgets/wxMessageBox

描画する

wxWidgets/基本図形

wxWidgets/画像ファイル

GUIプログラミング

wxWidgets/配置とイベント

wxWidgets/カラー選択

wxWidgets/wxBitmapButton

wxWidgets/wxButton

wxWidgets/wxListBox

wxWidgets/wxListCtrl

wxWidgets/wxTextCtrl

wxWidgets/wxChoice