]>
Commit | Line | Data |
---|---|---|
a660d684 KB |
1 | \section{wxApp overview}\label{wxappoverview} |
2 | ||
3 | Classes: \helpref{wxApp}{wxapp} | |
4 | ||
5 | A wxWindows application does not have a {\it main} procedure; the equivalent is the | |
6 | \rtfsp\helpref{OnInit}{wxapponinit} member defined for a class derived from wxApp.\rtfsp | |
7 | \rtfsp{\it OnInit} will usually create a top window as a bare minimum. | |
8 | ||
9 | Unlike in earlier versions of wxWindows, OnInit does not return a frame. Instead it | |
10 | returns a boolean value which indicates whether processing should continue (TRUE) or not (FALSE). | |
11 | You call \helpref{wxApp::SetTopWindow}{wxappsettopwindow} to let wxWindows know | |
12 | about the top window. | |
13 | ||
90a1a975 JS |
14 | Note that the program's command line arguments, represented by {\it argc} |
15 | and {\it argv}, are available from within wxApp member functions. | |
a660d684 KB |
16 | |
17 | An application closes by destroying all windows. Because all frames must | |
18 | be destroyed for the application to exit, it is advisable to use parent | |
19 | frames wherever possible when creating new frames, so that deleting the | |
20 | top level frame will automatically delete child frames. The alternative | |
f4fcc291 | 21 | is to explicitly delete child frames in the top-level frame's \helpref{wxCloseEvent}{wxcloseevent}\rtfsp |
a660d684 KB |
22 | handler. |
23 | ||
24 | In emergencies the \helpref{wxExit}{wxexit} function can be called to kill the | |
25 | application. | |
26 | ||
27 | An example of defining an application follows: | |
28 | ||
29 | \begin{verbatim} | |
6e6110ee | 30 | class DerivedApp : public wxApp |
a660d684 | 31 | { |
6e6110ee VZ |
32 | public: |
33 | virtual bool OnInit(); | |
a660d684 KB |
34 | }; |
35 | ||
36 | IMPLEMENT_APP(DerivedApp) | |
37 | ||
6e6110ee | 38 | bool DerivedApp::OnInit() |
a660d684 | 39 | { |
90a1a975 | 40 | wxFrame *the_frame = new wxFrame(NULL, ID_MYFRAME, argv[0]); |
a660d684 | 41 | ... |
90a1a975 | 42 | the_frame->Show(TRUE); |
a660d684 KB |
43 | SetTopWindow(the_frame); |
44 | ||
45 | return TRUE; | |
46 | } | |
47 | \end{verbatim} | |
48 | ||
49 | Note the use of IMPLEMENT\_APP(appClass), which allows wxWindows to dynamically create an instance of the application object | |
50 | at the appropriate point in wxWindows initialization. Previous versions of wxWindows used | |
51 | to rely on the creation of a global application object, but this is no longer recommended, | |
52 | because required global initialization may not have been performed at application object | |
53 | construction time. | |
54 | ||
55 | You can also use DECLARE\_APP(appClass) in a header file to declare the wxGetApp function which returns | |
56 | a reference to the application object. | |
57 | ||
1e8724e6 VS |
58 | \subsection{Application shutdown} |
59 | ||
60 | \helpref{OnExit}{wxapponexit} is called when the application exits but {\it before} | |
61 | wxWindows cleans its internal structures. Your should delete all wxWindows object that | |
62 | your created by the time OnExit finishes. In particular, do {\bf not} destroy them | |
63 | from application class' destructor! | |
64 | ||
65 | For example, this code may crash: | |
66 | ||
67 | \begin{verbatim} | |
68 | class MyApp : public wxApp | |
69 | { | |
70 | public: | |
71 | wxCHMHelpController m_helpCtrl; | |
72 | ... | |
73 | }; | |
74 | \end{verbatim} | |
75 | ||
76 | The reason for that is that {\tt m\_helpCtrl} is a member object and is | |
77 | thus destroyed from MyApp destructor. But MyApp object is deleted after | |
78 | wxWindows structures that wxCHMHelpController depends on were | |
79 | uninitialized! The solution is to destroy HelpCtrl in {\it OnExit}: | |
80 | ||
81 | \begin{verbatim} | |
82 | class MyApp : public wxApp | |
83 | { | |
84 | public: | |
85 | wxCHMHelpController *m_helpCtrl; | |
86 | ... | |
87 | }; | |
88 | ||
89 | bool MyApp::OnInit() | |
90 | { | |
91 | ... | |
92 | m_helpCtrl = new wxCHMHelpController; | |
93 | ... | |
94 | } | |
95 | ||
96 | int MyApp::OnExit() | |
97 | { | |
98 | delete m_helpCtrl; | |
99 | return 0; | |
100 | } | |
101 | \end{verbatim} |