Contents Up Previous Next

wxApp の概要

クラス: wxApp

wxWidgets アプリケーションは main 関数を持ちません。それと同等の関数が wxApp を継承したクラスで定義される OnInit メンバ関数です。通常、OnInit では最低限、トップウィンドウを作成します。

wxWidgets の初期バージョンとは違い、OnInit はフレームを返却しません。代わりに処理を継続する (true) かしない (false) かを表す真偽値を返却します。wxWidgets へトップウィンドウを教えるためには wxApp::SetTopWindow を使用します。

プログラムのコマンドライン引数 (argcargv) は wxApp のメンバ関数から使用できます。

アプリケーションはすべてのウィンドウを破棄することで終了します。アプリケーションを終了するためにはすべてのフレームを破棄しなければならないため、可能な限り、新しいフレームを作成するときは親フレームを使用するようにするべきです。こうすることで、トップレベルフレームの削除時に自動的に子フレームが削除されます。アプリケーションを終了する別の方法はトップレベルフレームの wxCloseEvent イベントハンドラで明示的に子フレームを削除することです。

緊急の場合は wxExit 関数を使用してアプリケーションを強制終了させることができます。しかし、通常、アプリケーションは自動的にシャットダウンされます。 以下を参照してください

アプリケーションを定義する例は以下の通りです:

class DerivedApp : public wxApp
{
public:
  virtual bool OnInit();
};

IMPLEMENT_APP(DerivedApp)

bool DerivedApp::OnInit()
{
  wxFrame *the_frame = new wxFrame(NULL, ID_MYFRAME, argv[0]);
  ...
  the_frame->Show(true);
  SetTopWindow(the_frame);

  return true;
}
IMPLEMENT_APP(appClass) を使用している点に注意してください。これにより、wxWidgets の初期化時の適切なタイミングでアプリケーションオブジェクトのインスタンスが動的に作成されるようになります。以前の wxWidgets ではグルーバルなアプリケーションオブジェクトを作成していましたが、もはやこれは非推奨です。なぜなら、期待したグローバルオブジェクトの初期化がアプリケーションオブジェクトの構築時に行われない可能性があるためです。

また、ヘッダファイル内で DECLARE_APP(appClass) を使用することで、アプリケーションオブジェクトへの参照を返却する wxGetApp 関数を宣言できます。そうしない場合、wxApp * 型のグローバル変数である wxTheApp ポインタを使用するしかありません。

アプリケーションの終了


アプリケーションの終了

通常、アプリケーションは最後のトップレベルウィンドウが閉じられたときに終了します。これは通常期待する振る舞いであり、アプリケーションが単一のトップレベルウィンドウを持つ場合は "Exit" メニューが選択されたときに Close() を呼ぶだけで充分なことを意味します。この振る舞いが望ましくない場合、wxApp::SetExitOnFrameDelete を呼ぶことで振る舞いを変更することができます。wxWidgets 2.3.3 から、このロジックはメインループに入る前のまだ表示されていないウィンドウには適用されなくなりました。つまり、 wxApp::OnInit の中で安全にダイアログを表示でき、ダイアログ (その時点における最後のトップレベルウィンドウ) を閉じるときにアプリケーションが終了することを心配しなくても良いということです。

アプリケーションの終了の別の側面は OnExit です。この関数はアプリケーションの終了時に呼ばれますが、wxWidgets の内部構造が破棄されるに呼ばれます。作成した wxWidgets は OnExit が完了するまでにすべて削除するべきです。特に、アプリケーションクラスのデストラクタで削除しては いけません

例えば、このコードはクラッシュするでしょう:

class MyApp : public wxApp
{
 public:
    wxCHMHelpController m_helpCtrl;
    ...
};
なぜなら、m_helpCtrl はメンバオブジェクトであり、MyApp のデストラクタで破棄されるためです。しかし、MyApp オブジェクトは wxCHMHelpController の依存する wxWidgets 構造が未初期化状態になった後に削除されます。この解決策は OnExit で HelpCtrl を削除することです:

class MyApp : public wxApp
{
 public:
    wxCHMHelpController *m_helpCtrl;
    ...
};

bool MyApp::OnInit()
{
  ...
  m_helpCtrl = new wxCHMHelpController;
  ...
}

int MyApp::OnExit()
{
  delete m_helpCtrl;
  return 0;
}