19
20

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

TATEditorAdvent Calendar 2016

Day 20

wxWidgetsの紹介

Last updated at Posted at 2016-12-20

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

最小サンプル

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
  • フォント名からフォントを取得する部分
    • OSごとに固有の取得方法がある

という感じです。

明日はJavaScriptエンジンであるv8のことを書きます。

19
20
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
19
20

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?