トップ 差分 一覧 ソース 検索 ヘルプ PDF ログイン

wxApp概要

クラス: wxApp

wxWidgetsアプリケーションは、メイン関数を持たない。それと等価なものは、wxAppから継承したクラスで定義されるOnInitメンバである。OnInitは通常、最低限、トップウィンドウを作成する。

初期のwxWidgetsと異なり、OnInitはフレームを返さない。その代わりに、プロセスを続けるべき(true)か、終了すべき(false)かを示すbool値を返す。wxWidgetsにトップウィンドウを通知するために、wxApp:SetTopWindowを使用する。

特筆すべきは、argcとargvで現されるプログラムのコマンドライン引数は、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初期化の適切な場所でアプリケーションオブジェクトのインスタンスを自動的に作成することを許可する。以前のバージョンのwxWidgetsは、グローバルなアプリケーションオブジェクトの作成を当てにしていたが、その方法はもう推奨されない。なぜなら、要求されたグローバルな初期化がアプリケーションオブジェクトの構築時に実行されない可能性があるからである。

ヘッダファイル内でDECLARE_APP(appClass)を使用すると、アプリケーションオブジェクトへの参照を返すwxGetAppを宣言することができる。他の方法では、wxApp*型のグローバルなポインタ変数wxTheAppを使用するしかない。

Applicationの終了

アプリケーションは通常、最後のトップレベルウィンドウが閉じられた時に終了する。これは通常予期されることであり、プログラムが単一のトップレベルウィンドウを持っている場合には、"終了"メニューコマンドに対応したClose()を呼ぶだけで充分であることを意味する。もしこの動作が望ましくなければ、動作を変更するためにwxApp::SetExitOnFrameDeleteを呼べばよい。wxWidgets 2.3.3からは、このようなロジックはプログラムがメインループに入る前に表示されるウィンドウには適用されないことに注意が必要である。言い換えれば、wxApp::OnInitからダイアログを安全に表示することができ、このダイアログ(しばらくの間は、最後のトップレベルウィンドウである)が閉じられるときにアプリケーションが終了することに関して気にする必要がない。

アプリケーションが終了するときの別の局面は、アプリケーションは終了するがwxWidgetsが内部データをクリアする前にOnExitが呼ばれる場合である。OnExitが終了する前に作成したwxWidgetsオブジェクトを全て削除しなければならない。特に、アプリケーションクラスのデストラクタで破棄してはならない。

例えば、以下のコードはクラッシュを引き起こす。:

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;
}

最終更新時間:2005年06月21日 20時38分26秒