]> git.saurik.com Git - wxWidgets.git/blame_incremental - docs/doxygen/overviews/app.h
The tree only sets the focus in response to a TVN_SELCHANGINGW event if the tree...
[wxWidgets.git] / docs / doxygen / overviews / app.h
... / ...
CommitLineData
1/////////////////////////////////////////////////////////////////////////////
2// Name: app.h
3// Purpose: topic overview
4// Author: wxWidgets team
5// RCS-ID: $Id$
6// Licence: wxWindows licence
7/////////////////////////////////////////////////////////////////////////////
8
9/**
10
11@page overview_app wxApp Overview
12
13Classes: wxApp
14
15@li @ref overview_app_intro
16@li @ref overview_app_shutdown
17
18
19<hr>
20
21
22@section overview_app_intro Introduction
23
24A wxWidgets application does not have a @e main procedure; the equivalent is
25the wxApp::OnInit member defined for a class derived from wxApp.
26
27@e OnInit will usually create a top window as a bare minimum. Unlike in earlier
28versions of wxWidgets, OnInit does not return a frame. Instead it returns a
29boolean value which indicates whether processing should continue (@true) or not
30(@false).
31
32Note that the program's command line arguments, represented by @e argc and
33@e argv, are available from within wxApp member functions.
34
35An application closes by destroying all windows. Because all frames must be
36destroyed for the application to exit, it is advisable to use parent frames
37wherever possible when creating new frames, so that deleting the top level
38frame will automatically delete child frames. The alternative is to explicitly
39delete child frames in the top-level frame's wxCloseEvent handler.
40
41In emergencies the wxExit function can be called to kill the application
42however normally the application shuts down automatically, see
43@ref overview_app_shutdown.
44
45An example of defining an application follows:
46
47@code
48class DerivedApp : public wxApp
49{
50public:
51 virtual bool OnInit();
52};
53
54IMPLEMENT_APP(DerivedApp)
55
56bool DerivedApp::OnInit()
57{
58 wxFrame *the_frame = new wxFrame(NULL, ID_MYFRAME, argv[0]);
59 ...
60 the_frame->Show(true);
61
62 return true;
63}
64@endcode
65
66Note the use of IMPLEMENT_APP(appClass), which allows wxWidgets to dynamically
67create an instance of the application object at the appropriate point in
68wxWidgets initialization. Previous versions of wxWidgets used to rely on the
69creation of a global application object, but this is no longer recommended,
70because required global initialization may not have been performed at
71application object construction time.
72
73You can also use DECLARE_APP(appClass) in a header file to declare the wxGetApp
74function which returns a reference to the application object. Otherwise you can
75only use the global @c wxTheApp pointer which is of type @c wxApp*.
76
77
78@section overview_app_shutdown Application Shutdown
79
80The application normally shuts down when the last of its top level windows is
81closed. This is normally the expected behaviour and means that it is enough to
82call wxWindow::Close() in response to the "Exit" menu command if your program
83has a single top level window. If this behaviour is not desirable
84wxApp::SetExitOnFrameDelete can be called to change it.
85
86Note that such logic doesn't apply for the windows shown before the program
87enters the main loop: in other words, you can safely show a dialog from
88wxApp::OnInit and not be afraid that your application terminates when this
89dialog -- which is the last top level window for the moment -- is closed.
90
91Another aspect of the application shutdown is wxApp::OnExit which is called
92when the application exits but @e before wxWidgets cleans up its internal
93structures. You should delete all wxWidgets object that you created by the time
94OnExit finishes.
95
96In particular, do @b not destroy them from application class' destructor! For
97example, this code may crash:
98
99@code
100class MyApp : public wxApp
101{
102public:
103 wxCHMHelpController m_helpCtrl;
104 ...
105};
106@endcode
107
108The reason for that is that @c m_helpCtrl is a member object and is thus
109destroyed from MyApp destructor. But MyApp object is deleted after wxWidgets
110structures that wxCHMHelpController depends on were uninitialized! The solution
111is to destroy HelpCtrl in @e OnExit:
112
113@code
114class MyApp : public wxApp
115{
116public:
117 wxCHMHelpController *m_helpCtrl;
118 ...
119};
120
121bool MyApp::OnInit()
122{
123 ...
124 m_helpCtrl = new wxCHMHelpController;
125 ...
126}
127
128int MyApp::OnExit()
129{
130 delete m_helpCtrl;
131 return 0;
132}
133@endcode
134
135*/
136