wxWidgetsとは
wxWidgetsはクロスプラットフォームなGUIライブラリです。
現時点の最新版は3.1で、去年からはGitHubが開発の中心になりました。
https://github.com/wxWidgets/wxWidgets
GitHubのREADME.mdには必要なことが簡潔に書かれていて良いですね。
特にライセンスのところで「静的リンクしていてもソースコードを公開しなくていいようにしたLGPLだよ」とだけ書かれているのが親切ですね。
基本的にはどのOSでも同じコードで書くことができます。
TATEditorでもほとんどのコードをWindows, Ubuntu, macOSで共有できています。
ただし、もともとがwxWindowsという名前であったことからも分かるように、WindowsのWin32 APIの影響が多々見受けられます。
また、Windowsには実装されているけど、他のプラットフォームでは使えないということも時々あります。
wxWidgetsの魅力
同じく有名なクロスプラットフォームなGUIライブラリにはQtがありますが、こちらはwxWidgetsとは異なり、ボタンなどの部品を独自に描画してしまいます。
wxWidgetsではそうしたUIの部品はネイティブのものが使われ、私はそこが気に入ってこちらを選択しています。
私はXP時代からwxWidgetsを利用しているのですが、当時からUnicode対応がけっこうしっかりしていたこともポイントが高いです。
(むしろ最初はクロスプラットフォームであることよりも「WindowsソフトがちゃんとUnicode対応で作れる」というところで使い始めました)
ビルド+α
主に静的ライブラリについて。
- Windows
-
build/msw/wx_vc14.sln
あたりを開いてビルドしましょう
-
- macOS
-
build/osx/wxcocoa.xcodeproj
を開いてビルドしましょう
-
- Ubuntuなど
- GTK+3の場合
sudo apt-get install libgtk-3-dev
./configure --with-gtk3 --with-gtk=3 --disable-shared
make
sudo make install
- GTK+3の場合
最小サンプル
wxWidgetsはsamplesがかなり充実しており、多くのサンプルも提供されています。
リポジトリのsamples/minimal
がそれなので、まずはこれを見ておくといいと思います。
特にVisual StudioやXcodeを使って開発をする場合にはminimal_vc14.sln
, minimal_cocoa.xcodeproj
がとても役にたつと思います。
そして何か機能を使いたいと思った時には、それっぽい名前のサンプルのソースコードを見れば大まかな実装方法が載っているので便利です。
基本
-
wxApp
の継承クラス- 起動すると
OnInit
、終了するとOnExit
が呼ばれる - ここからウィンドウとかを出す
- 起動すると
-
wxTopLevelWindow
の継承クラス- いわゆるウィンドウ
- 最小サンプルは
wxTopLevelWindow
を継承するwxFrame
を継承したウィンドウを定義してる - ダイアログとかもこれを継承してる
-
wxWindow
の継承クラス- ボタンとかテキストとかのUI部品
- ウィンドウの中に表示するもの全般
- TATEditorのテキストビューはこれを直接継承している
全体的に、上のクラスのインスタンスのイベントに関数を登録して呼び出してもらう感じです。
クラスの定義内でDECLARE_EVENT_TABLE()
を書いてイベントテーブルを宣言して、
class xxxxFrame : public wxFrame
{
public:
void OnClose(wxCloseEvent &event);
DECLARE_EVENT_TABLE()
};
BEGIN_EVENT_TABLE(xxxxFrame, wxFrame)
EVT_CLOSE(TatFrame::OnClose)
END_EVENT_TABLE(xxxxFrame, wxFrame)
とか、あるいは
class xxxxDialog : public wxDialog
{
public:
xxxxDialog() : wxDialog(......)
{
Connect(wxID_CANCEL, wxEVT_BUTTON, wxCommandEventHandler(xxxxDialog::OnButton), NULL, this);
}
void OnButton(wxCommandEvent &event);
};
とか。
おわりに
本当はwxWidgetsの使い方を書くつもりだったのですが、ハマりポイントも少なく、wxWidgets固有の難しい箇所もあまり思いつかなかったので紹介のみになりました。
TATEditorはWindows, Ubuntu, macOSのバイナリをほぼ分離せずに書いていますがそれほど問題にはなっていません。
むしろ分離している場所を列挙すると
- IME APIの実装
- 一応、共通のAPIを通してやりとりしている
- ただ、ウィンドウの初期化時にはどうしても細かい書き分けが必要になる
- 文字以外透明なウィンドウ
- 各ピクセルにアルファ値を持たせるようなクラスが提供されていない
- 各OSで異なる実装になっている
-
wchar_t
からUTF-16への変換- Windowsの
wchar_t
はUTF-16 - UbuntuやmacOSの
wchar_t
はUTF-32
- Windowsの
- フォント名からフォントを取得する部分
- OSごとに固有の取得方法がある
という感じです。
明日はJavaScriptエンジンであるv8のことを書きます。