git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@41963 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
		
			
				
	
	
		
			120 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			TeX
		
	
	
	
	
	
			
		
		
	
	
			120 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			TeX
		
	
	
	
	
	
| \section{wxApp overview}\label{wxappoverview}
 | |
| 
 | |
| Classes: \helpref{wxApp}{wxapp}
 | |
| 
 | |
| A wxWidgets application does not have a {\it main} procedure; the equivalent is the
 | |
| \rtfsp\helpref{OnInit}{wxapponinit} member defined for a class derived from wxApp.\rtfsp
 | |
| \rtfsp{\it OnInit} will usually create a top window as a bare minimum.
 | |
| 
 | |
| Unlike in earlier versions of wxWidgets, OnInit does not return a frame. Instead it
 | |
| returns a boolean value which indicates whether processing should continue (true) or not (false).
 | |
| You call \helpref{wxApp::SetTopWindow}{wxappsettopwindow} to let wxWidgets know
 | |
| about the top window.
 | |
| 
 | |
| Note that the program's command line arguments, represented by {\it argc} 
 | |
| and {\it argv}, are available from within wxApp member functions.
 | |
| 
 | |
| An application closes by destroying all windows. Because all frames must
 | |
| be destroyed for the application to exit, it is advisable to use parent
 | |
| frames wherever possible when creating new frames, so that deleting the
 | |
| top level frame will automatically delete child frames. The alternative
 | |
| is to explicitly delete child frames in the top-level frame's \helpref{wxCloseEvent}{wxcloseevent}\rtfsp
 | |
| handler.
 | |
| 
 | |
| In emergencies the \helpref{wxExit}{wxexit} function can be called to kill the
 | |
| application however normally the application shuts down automatically, 
 | |
| \helpref{see below}{wxappshutdownoverview}.
 | |
| 
 | |
| An example of defining an application follows:
 | |
| 
 | |
| \begin{verbatim}
 | |
| 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;
 | |
| }
 | |
| \end{verbatim}
 | |
| 
 | |
| Note the use of IMPLEMENT\_APP(appClass), which allows wxWidgets to dynamically create an instance of the application object
 | |
| at the appropriate point in wxWidgets initialization. Previous versions of wxWidgets used
 | |
| to rely on the creation of a global application object, but this is no longer recommended,
 | |
| because required global initialization may not have been performed at application object
 | |
| construction time.
 | |
| 
 | |
| You can also use DECLARE\_APP(appClass) in a header file to declare the wxGetApp function which returns
 | |
| a reference to the application object. Otherwise you can only use the global 
 | |
| \texttt{wxTheApp} pointer which is of type \texttt{wxApp *}.
 | |
| 
 | |
| 
 | |
| \subsection{Application shutdown}\label{wxappshutdownoverview}
 | |
| 
 | |
| 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 \helpref{Close()}{wxwindowclose} in response to the {\tt "Exit"} menu
 | |
| command if your program has a single top level window. If this behaviour is not
 | |
| desirable \helpref{wxApp::SetExitOnFrameDelete}{wxappsetexitonframedelete} 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 
 | |
| \helpref{wxApp::OnInit}{wxapponinit} and not be afraid that your application
 | |
| terminates when this dialog -- which is the last top level window for the
 | |
| moment -- is closed.
 | |
| 
 | |
| 
 | |
| Another aspect of the application shutdown is \helpref{OnExit}{wxapponexit} 
 | |
| which is called when the application exits but {\it before} wxWidgets cleans up
 | |
| its internal structures. You should delete all wxWidgets object that you
 | |
| created by the time OnExit finishes. In particular, do {\bf not} destroy them
 | |
| from application class' destructor!
 | |
| 
 | |
| For example, this code may crash:
 | |
| 
 | |
| \begin{verbatim}
 | |
| class MyApp : public wxApp
 | |
| {
 | |
|  public:
 | |
|     wxCHMHelpController m_helpCtrl;
 | |
|     ...
 | |
| };
 | |
| \end{verbatim}
 | |
| 
 | |
| The reason for that is that {\tt 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 {\it OnExit}:
 | |
| 
 | |
| \begin{verbatim}
 | |
| class MyApp : public wxApp
 | |
| {
 | |
|  public:
 | |
|     wxCHMHelpController *m_helpCtrl;
 | |
|     ...
 | |
| };
 | |
| 
 | |
| bool MyApp::OnInit()
 | |
| {
 | |
|   ...
 | |
|   m_helpCtrl = new wxCHMHelpController;
 | |
|   ...
 | |
| }
 | |
| 
 | |
| int MyApp::OnExit()
 | |
| {
 | |
|   delete m_helpCtrl;
 | |
|   return 0;
 | |
| }
 | |
| \end{verbatim}
 | |
| 
 |