トップ 一覧 検索 ヘルプ ログイン

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の終了

The application normally shuts down when the last of its top level windows is closed. This is normally the expected behaviour and means that it is enough to call Close() in response to the "Exit" menu command if your program has a single top level window. If this behaviour is not desirable wxApp::SetExitOnFrameDelete can be called to change it. Note that starting from wxWidgets 2.3.3 such logic doesn't apply for the windows shown before the program enters the main loop: in other words, you can safely show a dialog from wxApp::OnInit and not be afraid that your application terminates when this dialog -- which is the last top level window for the moment -- is closed.
アプリケーションは通常、最後のトップレベルウィンドウが閉じられた時に終了する。これは通常予期されることであり、プログラムが単一のトップレベルウィンドウを持っている場合には、"終了"メニューコマンドに対応したClose()を呼ぶだけで充分であることを意味する。もしこの動作が望ましくなければ、動作を変更するためにwxApp::SetExitOnFrameDeleteを呼べばよい。wxWidgets 2.3.3からは、このようなロジックはプログラムがメインループに入る前に表示されるウィンドウには適用されないことに注意が必要である。言い換えれば、wxApp::OnInitからダイアログを安全に表示することができ、このダイアログ(しばらくの間は、最後のトップレベルウィンドウである)が閉じられるときにアプリケーションが終了することに関して気にする必要がない。

Another aspect of the application shutdown is OnExit which is called when the application exits but before wxWidgets cleans up its internal structures. You should delete all wxWidgets object that you created by the time OnExit finishes. In particular, do not destroy them from application class' destructor!
アプリケーションが終了するときの別の局面は、アプリケーションは終了するがwxWidgetsが内部データをクリアする前にOnExitが呼ばれる場合である。OnExitが終了する前に作成したwxWidgetsオブジェクトを全て削除しなければならない。特に、アプリケーションクラスのデストラクタで破棄してはならない。

For example, this code may crash:
例えば、以下のコードはクラッシュを引き起こす。:

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

The reason for that is that m_helpCtrl is a member object and is thus destroyed from MyApp destructor. But MyApp object is deleted after wxWidgets structures that wxCHMHelpController depends on were uninitialized! The solution is to destroy HelpCtrl in OnExit:
その理由は、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;
 }