]>
Commit | Line | Data |
---|---|---|
1 | \section{wxWidgets Hello World sample}\label{helloworld} | |
2 | ||
3 | As many people have requested a mini-sample to be published here | |
4 | so that some quick judgment concerning syntax | |
5 | and basic principles can be made, you can now look at wxWidgets' | |
6 | "Hello World": | |
7 | ||
8 | You have to include wxWidgets' header files, of course. This can | |
9 | be done on a file by file basis (such as \#include "wx/window.h") | |
10 | or using one global include (\#include "wx/wx.h"). This is | |
11 | also useful on platforms which support precompiled headers such | |
12 | as all major compilers on the Windows platform. | |
13 | ||
14 | \begin{verbatim} | |
15 | // | |
16 | // file name: hworld.cpp | |
17 | // | |
18 | // purpose: wxWidgets "Hello world" | |
19 | // | |
20 | ||
21 | // For compilers that support precompilation, includes "wx/wx.h". | |
22 | #include "wx/wxprec.h" | |
23 | ||
24 | #ifdef __BORLANDC__ | |
25 | #pragma hdrstop | |
26 | #endif | |
27 | ||
28 | #ifndef WX_PRECOMP | |
29 | #include "wx/wx.h" | |
30 | #endif | |
31 | \end{verbatim} | |
32 | ||
33 | Practically every app should define a new class derived from wxApp. | |
34 | By overriding wxApp's OnInit() the program can be initialized, | |
35 | e.g. by creating a new main window. | |
36 | ||
37 | \begin{verbatim} | |
38 | class MyApp: public wxApp | |
39 | { | |
40 | virtual bool OnInit(); | |
41 | }; | |
42 | \end{verbatim} | |
43 | ||
44 | The main window is created by deriving a class from wxFrame and | |
45 | giving it a menu and a status bar in its constructor. Also, any class | |
46 | that wishes to respond to any "event" (such as mouse clicks or | |
47 | messages from the menu or a button) must declare an event table | |
48 | using the macro below. Finally, the way to react to such events | |
49 | must be done in "handlers". In our sample, we react to two menu items, | |
50 | one for "Quit" and one for displaying an "About" window. These | |
51 | handlers should not be virtual. | |
52 | ||
53 | \begin{verbatim} | |
54 | class MyFrame: public wxFrame | |
55 | { | |
56 | public: | |
57 | MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size); | |
58 | ||
59 | void OnQuit(wxCommandEvent& event); | |
60 | void OnAbout(wxCommandEvent& event); | |
61 | ||
62 | private: | |
63 | DECLARE_EVENT_TABLE() | |
64 | }; | |
65 | \end{verbatim} | |
66 | ||
67 | In order to be able to react to a menu command, it must be given a unique | |
68 | identifier such as a const or an enum. | |
69 | ||
70 | \begin{verbatim} | |
71 | enum | |
72 | { | |
73 | ID_Quit = 1, | |
74 | ID_About, | |
75 | }; | |
76 | \end{verbatim} | |
77 | ||
78 | We then proceed to actually implement an event table in which the events | |
79 | are routed to their respective handler functions in the class MyFrame. | |
80 | There are predefined macros for routing all common events, ranging from | |
81 | the selection of a list box entry to a resize event when a user resizes | |
82 | a window on the screen. If -1 is given as the ID, the given handler will be | |
83 | invoked for any event of the specified type, so that you could add just | |
84 | one entry in the event table for all menu commands or all button commands etc. | |
85 | The origin of the event can still be distinguished in the event handler as | |
86 | the (only) parameter in an event handler is a reference to a wxEvent object, | |
87 | which holds various information about the event (such as the ID of and a | |
88 | pointer to the class, which emitted the event). | |
89 | ||
90 | \begin{verbatim} | |
91 | BEGIN_EVENT_TABLE(MyFrame, wxFrame) | |
92 | EVT_MENU(ID_Quit, MyFrame::OnQuit) | |
93 | EVT_MENU(ID_About, MyFrame::OnAbout) | |
94 | END_EVENT_TABLE() | |
95 | \end{verbatim} | |
96 | ||
97 | As in all programs there must be a "main" function. Under wxWidgets main is implemented | |
98 | using this macro, which creates an application instance and starts the program. | |
99 | ||
100 | \begin{verbatim} | |
101 | IMPLEMENT_APP(MyApp) | |
102 | \end{verbatim} | |
103 | ||
104 | As mentioned above, wxApp::OnInit() is called upon startup and should be | |
105 | used to initialize the program, maybe showing a "splash screen" and creating | |
106 | the main window (or several). The frame should get a title bar text ("Hello World") | |
107 | and a position and start-up size. One frame can also be declared to be the | |
108 | top window. Returning true indicates a successful initialization. | |
109 | ||
110 | \begin{verbatim} | |
111 | bool MyApp::OnInit() | |
112 | { | |
113 | MyFrame *frame = new MyFrame( "Hello World", wxPoint(50,50), wxSize(450,340) ); | |
114 | frame->Show( true ); | |
115 | SetTopWindow( frame ); | |
116 | return true; | |
117 | } | |
118 | \end{verbatim} | |
119 | ||
120 | In the constructor of the main window (or later on) we create a menu with two menu | |
121 | items as well as a status bar to be shown at the bottom of the main window. Both have | |
122 | to be "announced" to the frame with respective calls. | |
123 | ||
124 | \begin{verbatim} | |
125 | MyFrame::MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size) | |
126 | : wxFrame((wxFrame *)NULL, -1, title, pos, size) | |
127 | { | |
128 | wxMenu *menuFile = new wxMenu; | |
129 | ||
130 | menuFile->Append( ID_About, "&About..." ); | |
131 | menuFile->AppendSeparator(); | |
132 | menuFile->Append( ID_Quit, "E&xit" ); | |
133 | ||
134 | wxMenuBar *menuBar = new wxMenuBar; | |
135 | menuBar->Append( menuFile, "&File" ); | |
136 | ||
137 | SetMenuBar( menuBar ); | |
138 | ||
139 | CreateStatusBar(); | |
140 | SetStatusText( "Welcome to wxWidgets!" ); | |
141 | } | |
142 | \end{verbatim} | |
143 | ||
144 | Here are the actual event handlers. MyFrame::OnQuit() closes the main window | |
145 | by calling Close(). The parameter true indicates that other windows have no veto | |
146 | power such as after asking "Do you really want to close?". If there is no other | |
147 | main window left, the application will quit. | |
148 | ||
149 | \begin{verbatim} | |
150 | void MyFrame::OnQuit(wxCommandEvent& WXUNUSED(event)) | |
151 | { | |
152 | Close( true ); | |
153 | } | |
154 | \end{verbatim} | |
155 | ||
156 | MyFrame::OnAbout() will display a small window with some text in it. In this | |
157 | case a typical "About" window with information about the program. | |
158 | ||
159 | \begin{verbatim} | |
160 | void MyFrame::OnAbout(wxCommandEvent& WXUNUSED(event)) | |
161 | { | |
162 | wxMessageBox( "This is a wxWidgets' Hello world sample", | |
163 | "About Hello World", wxOK | wxICON_INFORMATION ); | |
164 | } | |
165 | \end{verbatim} | |
166 |