]>
Commit | Line | Data |
---|---|---|
a660d684 KB |
1 | \section{\class{wxEvtHandler}}\label{wxevthandler} |
2 | ||
3 | A class that can handle events from the windowing system. | |
4 | wxWindow (and therefore all window classes) are derived from | |
5 | this class. | |
6 | ||
a685e84a DE |
7 | When events are received, wxEvtHandler invokes the method listed in the |
8 | event table using itself as the object. When using multiple inheritance | |
9 | it is imperative that the wxEvtHandler(-derived) class be the first | |
10 | class inherited such that the "this" pointer for the overall object | |
11 | will be identical to the "this" pointer for the wxEvtHandler portion. | |
12 | ||
a660d684 KB |
13 | \wxheading{Derived from} |
14 | ||
15 | \helpref{wxObject}{wxobject} | |
16 | ||
954b8ae6 JS |
17 | \wxheading{Include files} |
18 | ||
19 | <wx/event.h> | |
20 | ||
a7af285d VZ |
21 | \wxheading{Library} |
22 | ||
23 | \helpref{wxBase}{librarieslist} | |
24 | ||
a660d684 KB |
25 | \wxheading{See also} |
26 | ||
27 | \overview{Event handling overview}{eventhandlingoverview} | |
28 | ||
29 | \latexignore{\rtfignore{\wxheading{Members}}} | |
30 | ||
b236c10f | 31 | \membersection{wxEvtHandler::wxEvtHandler}\label{wxevthandlerctor} |
a660d684 KB |
32 | |
33 | \func{}{wxEvtHandler}{\void} | |
34 | ||
35 | Constructor. | |
36 | ||
b236c10f | 37 | \membersection{wxEvtHandler::\destruct{wxEvtHandler}}\label{wxevthandlerdtor} |
a660d684 KB |
38 | |
39 | \func{}{\destruct{wxEvtHandler}}{\void} | |
40 | ||
41 | Destructor. If the handler is part of a chain, the destructor will | |
42 | unlink itself and restore the previous and next handlers so that they point to | |
43 | each other. | |
44 | ||
8a293590 RR |
45 | \membersection{wxEvtHandler::AddPendingEvent}\label{wxevthandleraddpendingevent} |
46 | ||
76bfdc9a | 47 | \func{virtual void}{AddPendingEvent}{\param{const wxEvent\& }{event}} |
8a293590 | 48 | |
8e72b8b5 | 49 | This function posts an event to be processed later. |
8a293590 RR |
50 | |
51 | \wxheading{Parameters} | |
52 | ||
53 | \docparam{event}{Event to add to process queue.} | |
54 | ||
55 | \wxheading{Remarks} | |
56 | ||
8e72b8b5 RR |
57 | The difference between sending an event (using the |
58 | \helpref{ProcessEvent}{wxevthandlerprocessevent} method) and posting it is | |
59 | that in the first case the event is processed before the function returns, | |
60 | while in the second case, the function returns immediately and the event will | |
61 | be processed sometime later (usually during the next event loop iteration). | |
62 | ||
63 | A copy of {\it event} is made by the function, so the original can be deleted | |
64 | as soon as function returns (it is common that the original is created on the | |
65 | stack). This requires that the \helpref{wxEvent::Clone}{wxeventclone} method | |
66 | be implemented by {\it event} so that it can be duplicated and stored until | |
67 | it gets processed. | |
68 | ||
69 | This is also the method to call for inter-thread communication---it will | |
70 | post events safely between different threads which means that this method is | |
71 | thread-safe by using critical sections where needed. In a multi-threaded | |
72 | program, you often need to inform the main GUI thread about the status of | |
73 | other working threads and such notification should be done using this method. | |
74 | ||
75 | This method automatically wakes up idle handling if the underlying window | |
76 | system is currently idle and thus would not send any idle events. (Waking | |
77 | up idle handling is done calling \helpref{::wxWakeUpIdle}{wxwakeupidle}.) | |
8a293590 | 78 | |
f60d0f94 JS |
79 | \membersection{wxEvtHandler::Connect}\label{wxevthandlerconnect} |
80 | ||
18e33484 | 81 | \func{void}{Connect}{\param{int}{ id}, \param{int}{ lastId}, |
f60d0f94 | 82 | \param{wxEventType }{eventType}, \param{wxObjectEventFunction}{ function}, |
97e1d37c | 83 | \param{wxObject*}{ userData = NULL}, \param{wxEvtHandler*}{ eventSink = NULL}} |
f60d0f94 | 84 | |
18e33484 | 85 | \func{void}{Connect}{\param{int}{ id}, |
f60d0f94 | 86 | \param{wxEventType }{eventType}, \param{wxObjectEventFunction}{ function}, |
97e1d37c | 87 | \param{wxObject*}{ userData = NULL}, \param{wxEvtHandler*}{ eventSink = NULL}} |
f60d0f94 | 88 | |
18e33484 VZ |
89 | \func{void}{Connect}{\param{wxEventType }{eventType}, \param{wxObjectEventFunction}{ function}, |
90 | \param{wxObject*}{ userData = NULL}, \param{wxEvtHandler*}{ eventSink = NULL}} | |
91 | ||
f60d0f94 | 92 | Connects the given function dynamically with the event handler, id and event type. This |
f70c0443 | 93 | is an alternative to the use of static event tables. See the 'event' or the old 'dynamic' sample for usage. |
f60d0f94 JS |
94 | |
95 | \wxheading{Parameters} | |
96 | ||
18e33484 VZ |
97 | \docparam{id}{The identifier (or first of the identifier range) to be |
98 | associated with the event handler function. For the version not taking this | |
99 | argument, it defaults to \texttt{wxID\_ANY}.} | |
f60d0f94 JS |
100 | |
101 | \docparam{lastId}{The second part of the identifier range to be associated with the event handler function.} | |
102 | ||
103 | \docparam{eventType}{The event type to be associated with this event handler.} | |
104 | ||
18e33484 VZ |
105 | \docparam{function}{The event handler function. Note that this function should |
106 | be explicitly converted to the correct type which can be done using a macro | |
107 | called \texttt{wxFooHandler} for the handler for any \texttt{wxFooEvent}.} | |
f60d0f94 JS |
108 | |
109 | \docparam{userData}{Data to be associated with the event table entry.} | |
110 | ||
97e1d37c | 111 | \docparam{eventSink}{Object whose member function should be called. If this is NULL, |
18e33484 | 112 | \textit{this} will be used.} |
97e1d37c | 113 | |
f60d0f94 JS |
114 | \wxheading{Example} |
115 | ||
116 | \begin{verbatim} | |
117 | frame->Connect( wxID_EXIT, | |
118 | wxEVT_COMMAND_MENU_SELECTED, | |
18e33484 | 119 | wxCommandEventHandler(MyFrame::OnQuit) ); |
f60d0f94 JS |
120 | \end{verbatim} |
121 | ||
2bbd97f4 MB |
122 | \perlnote{In wxPerl this function takes 4 arguments: \texttt{id, |
123 | lastid, type, method}; if \texttt{method} is \texttt{undef}, the | |
124 | handler is disconnected.} | |
125 | ||
8a293590 RR |
126 | \membersection{wxEvtHandler::Disconnect}\label{wxevthandlerdisconnect} |
127 | ||
bdbe28fa VZ |
128 | \func{bool}{Disconnect}{\param{wxEventType }{eventType = wxEVT\_NULL}, \param{wxObjectEventFunction}{ function = NULL}, |
129 | \param{wxObject*}{ userData = NULL}, \param{wxEvtHandler*}{ eventSink = NULL}} | |
130 | ||
e554d626 | 131 | \func{bool}{Disconnect}{\param{int}{ id = \texttt{wxID\_ANY}}, |
605d715d | 132 | \param{wxEventType }{eventType = wxEVT\_NULL}, \param{wxObjectEventFunction}{ function = NULL}, |
97e1d37c | 133 | \param{wxObject*}{ userData = NULL}, \param{wxEvtHandler*}{ eventSink = NULL}} |
8a293590 | 134 | |
e554d626 | 135 | \func{bool}{Disconnect}{\param{int}{ id}, \param{int}{ lastId = \texttt{wxID\_ANY}}, |
605d715d | 136 | \param{wxEventType }{eventType = wxEVT\_NULL}, \param{wxObjectEventFunction}{ function = NULL}, |
97e1d37c | 137 | \param{wxObject*}{ userData = NULL}, \param{wxEvtHandler*}{ eventSink = NULL}} |
a660d684 | 138 | |
8a293590 | 139 | Disconnects the given function dynamically from the event handler, using the specified |
cc81d32f | 140 | parameters as search criteria and returning true if a matching function has been |
ccaaf5b0 | 141 | found and removed. This method can only disconnect functions which have been added |
8a293590 | 142 | using the \helpref{wxEvtHandler::Connect}{wxevthandlerconnect} method. There is no way |
ccaaf5b0 | 143 | to disconnect functions connected using the (static) event tables. |
a660d684 | 144 | |
8a293590 | 145 | \wxheading{Parameters} |
a660d684 | 146 | |
8a293590 | 147 | \docparam{id}{The identifier (or first of the identifier range) associated with the event handler function.} |
a660d684 | 148 | |
8a293590 | 149 | \docparam{lastId}{The second part of the identifier range associated with the event handler function.} |
a660d684 | 150 | |
8a293590 | 151 | \docparam{eventType}{The event type associated with this event handler.} |
a660d684 | 152 | |
8a293590 | 153 | \docparam{function}{The event handler function.} |
a660d684 | 154 | |
ccaaf5b0 | 155 | \docparam{userData}{Data associated with the event table entry.} |
a660d684 | 156 | |
97e1d37c JS |
157 | \docparam{eventSink}{Object whose member function should be called.} |
158 | ||
2bbd97f4 MB |
159 | \perlnote{In wxPerl this function takes 3 arguments: \texttt{id, |
160 | lastid, type}.} | |
161 | ||
a660d684 KB |
162 | \membersection{wxEvtHandler::GetClientData}\label{wxevthandlergetclientdata} |
163 | ||
ccaaf5b0 | 164 | \func{void* }{GetClientData}{\void} |
a660d684 KB |
165 | |
166 | Gets user-supplied client data. | |
167 | ||
168 | \wxheading{Remarks} | |
169 | ||
170 | Normally, any extra data the programmer wishes to associate with the object | |
ccaaf5b0 | 171 | should be made available by deriving a new class with new data members. |
a660d684 KB |
172 | |
173 | \wxheading{See also} | |
174 | ||
175 | \helpref{wxEvtHandler::SetClientData}{wxevthandlersetclientdata} | |
176 | ||
e3ba9f88 RR |
177 | \membersection{wxEvtHandler::GetClientObject}\label{wxevthandlergetclientobject} |
178 | ||
179 | \constfunc{wxClientData*}{GetClientObject}{\void} | |
180 | ||
181 | Get a pointer to the user-supplied client data object. | |
182 | ||
183 | \wxheading{See also} | |
184 | ||
185 | \helpref{wxEvtHandler::SetClientObject}{wxevthandlersetclientobject}, | |
186 | \helpref{wxClientData}{wxclientdata} | |
187 | ||
a660d684 KB |
188 | \membersection{wxEvtHandler::GetEvtHandlerEnabled}\label{wxevthandlergetevthandlerenabled} |
189 | ||
190 | \func{bool}{GetEvtHandlerEnabled}{\void} | |
191 | ||
cc81d32f | 192 | Returns true if the event handler is enabled, false otherwise. |
a660d684 KB |
193 | |
194 | \wxheading{See also} | |
195 | ||
196 | \helpref{wxEvtHandler::SetEvtHandlerEnabled}{wxevthandlersetevthandlerenabled} | |
197 | ||
198 | \membersection{wxEvtHandler::GetNextHandler}\label{wxevthandlergetnexthandler} | |
199 | ||
200 | \func{wxEvtHandler*}{GetNextHandler}{\void} | |
201 | ||
202 | Gets the pointer to the next handler in the chain. | |
203 | ||
204 | \wxheading{See also} | |
205 | ||
b4a2ab72 | 206 | \helpref{wxEvtHandler::SetNextHandler}{wxevthandlersetnexthandler},\rtfsp |
a660d684 KB |
207 | \helpref{wxEvtHandler::GetPreviousHandler}{wxevthandlergetprevioushandler},\rtfsp |
208 | \helpref{wxEvtHandler::SetPreviousHandler}{wxevthandlersetprevioushandler},\rtfsp | |
a660d684 KB |
209 | \helpref{wxWindow::PushEventHandler}{wxwindowpusheventhandler},\rtfsp |
210 | \helpref{wxWindow::PopEventHandler}{wxwindowpopeventhandler} | |
211 | ||
212 | \membersection{wxEvtHandler::GetPreviousHandler}\label{wxevthandlergetprevioushandler} | |
213 | ||
214 | \func{wxEvtHandler*}{GetPreviousHandler}{\void} | |
215 | ||
216 | Gets the pointer to the previous handler in the chain. | |
217 | ||
218 | \wxheading{See also} | |
219 | ||
a660d684 | 220 | \helpref{wxEvtHandler::SetPreviousHandler}{wxevthandlersetprevioushandler},\rtfsp |
b4a2ab72 SB |
221 | \helpref{wxEvtHandler::GetNextHandler}{wxevthandlergetnexthandler},\rtfsp |
222 | \helpref{wxEvtHandler::SetNextHandler}{wxevthandlersetnexthandler},\rtfsp | |
a660d684 KB |
223 | \helpref{wxWindow::PushEventHandler}{wxwindowpusheventhandler},\rtfsp |
224 | \helpref{wxWindow::PopEventHandler}{wxwindowpopeventhandler} | |
225 | ||
226 | \membersection{wxEvtHandler::ProcessEvent}\label{wxevthandlerprocessevent} | |
227 | ||
228 | \func{virtual bool}{ProcessEvent}{\param{wxEvent\& }{event}} | |
229 | ||
230 | Processes an event, searching event tables and calling zero or more suitable event handler function(s). | |
231 | ||
232 | \wxheading{Parameters} | |
233 | ||
234 | \docparam{event}{Event to process.} | |
235 | ||
236 | \wxheading{Return value} | |
237 | ||
cc81d32f | 238 | true if a suitable event handler function was found and executed, and the function did not |
a660d684 KB |
239 | call \helpref{wxEvent::Skip}{wxeventskip}. |
240 | ||
241 | \wxheading{Remarks} | |
242 | ||
fc2171bd | 243 | Normally, your application would not call this function: it is called in the wxWidgets |
a660d684 KB |
244 | implementation to dispatch incoming user interface events to the framework (and application). |
245 | ||
246 | However, you might need to call it if implementing new functionality (such as a new control) where | |
247 | you define new event types, as opposed to allowing the user to override virtual functions. | |
248 | ||
249 | An instance where you might actually override the {\bf ProcessEvent} function is where you want | |
fc2171bd | 250 | to direct event processing to event handlers not normally noticed by wxWidgets. For example, |
a660d684 KB |
251 | in the document/view architecture, documents and views are potential event handlers. |
252 | When an event reaches a frame, {\bf ProcessEvent} will need to be called on the associated | |
253 | document and view in case event handler functions are associated with these objects. | |
254 | The property classes library (wxProperty) also overrides {\bf ProcessEvent} for similar reasons. | |
255 | ||
256 | The normal order of event table searching is as follows: | |
257 | ||
258 | \begin{enumerate}\itemsep=0pt | |
259 | \item If the object is disabled (via a call to \helpref{wxEvtHandler::SetEvtHandlerEnabled}{wxevthandlersetevthandlerenabled}) | |
260 | the function skips to step (6). | |
261 | \item If the object is a wxWindow, {\bf ProcessEvent} is recursively called on the window's\rtfsp | |
cc81d32f | 262 | \helpref{wxValidator}{wxvalidator}. If this returns true, the function exits. |
a660d684 KB |
263 | \item {\bf SearchEventTable} is called for this event handler. If this fails, the base |
264 | class table is tried, and so on until no more tables exist or an appropriate function was found, | |
265 | in which case the function exits. | |
266 | \item The search is applied down the entire chain of event handlers (usually the chain has a length | |
267 | of one). If this succeeds, the function exits. | |
268 | \item If the object is a wxWindow and the event is a wxCommandEvent, {\bf ProcessEvent} is | |
cc81d32f | 269 | recursively applied to the parent window's event handler. If this returns true, the function exits. |
a660d684 KB |
270 | \item Finally, {\bf ProcessEvent} is called on the wxApp object. |
271 | \end{enumerate} | |
272 | ||
273 | \wxheading{See also} | |
274 | ||
275 | \helpref{wxEvtHandler::SearchEventTable}{wxevthandlersearcheventtable} | |
276 | ||
277 | \membersection{wxEvtHandler::SearchEventTable}\label{wxevthandlersearcheventtable} | |
278 | ||
4cee05ac | 279 | \func{virtual bool}{SearchEventTable}{\param{wxEventTable\& }{table}, \param{wxEvent\& }{event}} |
a660d684 KB |
280 | |
281 | Searches the event table, executing an event handler function if an appropriate one | |
282 | is found. | |
283 | ||
284 | \wxheading{Parameters} | |
285 | ||
286 | \docparam{table}{Event table to be searched.} | |
287 | ||
288 | \docparam{event}{Event to be matched against an event table entry.} | |
289 | ||
290 | \wxheading{Return value} | |
291 | ||
cc81d32f | 292 | true if a suitable event handler function was found and executed, and the function did not |
a660d684 KB |
293 | call \helpref{wxEvent::Skip}{wxeventskip}. |
294 | ||
295 | \wxheading{Remarks} | |
296 | ||
297 | This function looks through the object's event table and tries to find an entry | |
298 | that will match the event. | |
299 | ||
300 | An entry will match if: | |
301 | ||
302 | \begin{enumerate}\itemsep=0pt | |
303 | \item The event type matches, and | |
304 | \item the identifier or identifier range matches, or the event table entry's identifier is zero. | |
305 | \end{enumerate} | |
306 | ||
307 | If a suitable function is called but calls \helpref{wxEvent::Skip}{wxeventskip}, this function will | |
308 | fail, and searching will continue. | |
309 | ||
310 | \wxheading{See also} | |
311 | ||
312 | \helpref{wxEvtHandler::ProcessEvent}{wxevthandlerprocessevent} | |
313 | ||
314 | \membersection{wxEvtHandler::SetClientData}\label{wxevthandlersetclientdata} | |
315 | ||
ccaaf5b0 | 316 | \func{void}{SetClientData}{\param{void* }{data}} |
a660d684 KB |
317 | |
318 | Sets user-supplied client data. | |
319 | ||
320 | \wxheading{Parameters} | |
321 | ||
322 | \docparam{data}{Data to be associated with the event handler.} | |
323 | ||
324 | \wxheading{Remarks} | |
325 | ||
ccaaf5b0 RR |
326 | Normally, any extra data the programmer wishes to associate with |
327 | the object should be made available by deriving a new class | |
e3ba9f88 RR |
328 | with new data members. You must not call this method and |
329 | \helpref{SetClientObject}{wxevthandlersetclientobject} on the | |
330 | same class - only one of them. | |
a660d684 KB |
331 | |
332 | \wxheading{See also} | |
333 | ||
334 | \helpref{wxEvtHandler::GetClientData}{wxevthandlergetclientdata} | |
335 | ||
e3ba9f88 RR |
336 | \membersection{wxEvtHandler::SetClientObject}\label{wxevthandlersetclientobject} |
337 | ||
338 | \func{void}{SetClientObject}{\param{wxClientData* }{data}} | |
339 | ||
340 | Set the client data object. Any previous object will be deleted. | |
341 | ||
342 | \wxheading{See also} | |
343 | ||
344 | \helpref{wxEvtHandler::GetClientObject}{wxevthandlergetclientobject}, | |
345 | \helpref{wxClientData}{wxclientdata} | |
346 | ||
a660d684 KB |
347 | \membersection{wxEvtHandler::SetEvtHandlerEnabled}\label{wxevthandlersetevthandlerenabled} |
348 | ||
349 | \func{void}{SetEvtHandlerEnabled}{\param{bool }{enabled}} | |
350 | ||
351 | Enables or disables the event handler. | |
352 | ||
353 | \wxheading{Parameters} | |
354 | ||
cc81d32f | 355 | \docparam{enabled}{true if the event handler is to be enabled, false if it is to be disabled.} |
a660d684 KB |
356 | |
357 | \wxheading{Remarks} | |
358 | ||
359 | You can use this function to avoid having to remove the event handler from the chain, for example | |
360 | when implementing a dialog editor and changing from edit to test mode. | |
361 | ||
362 | \wxheading{See also} | |
363 | ||
364 | \helpref{wxEvtHandler::GetEvtHandlerEnabled}{wxevthandlergetevthandlerenabled} | |
365 | ||
366 | \membersection{wxEvtHandler::SetNextHandler}\label{wxevthandlersetnexthandler} | |
367 | ||
368 | \func{void}{SetNextHandler}{\param{wxEvtHandler* }{handler}} | |
369 | ||
370 | Sets the pointer to the next handler. | |
371 | ||
372 | \wxheading{Parameters} | |
373 | ||
374 | \docparam{handler}{Event handler to be set as the next handler.} | |
375 | ||
376 | \wxheading{See also} | |
377 | ||
378 | \helpref{wxEvtHandler::GetNextHandler}{wxevthandlergetnexthandler},\rtfsp | |
379 | \helpref{wxEvtHandler::SetPreviousHandler}{wxevthandlersetprevioushandler},\rtfsp | |
380 | \helpref{wxEvtHandler::GetPreviousHandler}{wxevthandlergetprevioushandler},\rtfsp | |
381 | \helpref{wxWindow::PushEventHandler}{wxwindowpusheventhandler},\rtfsp | |
382 | \helpref{wxWindow::PopEventHandler}{wxwindowpopeventhandler} | |
383 | ||
384 | \membersection{wxEvtHandler::SetPreviousHandler}\label{wxevthandlersetprevioushandler} | |
385 | ||
386 | \func{void}{SetPreviousHandler}{\param{wxEvtHandler* }{handler}} | |
387 | ||
388 | Sets the pointer to the previous handler. | |
389 | ||
390 | \wxheading{Parameters} | |
391 | ||
392 | \docparam{handler}{Event handler to be set as the previous handler.} | |
393 | ||
394 | \wxheading{See also} | |
395 | ||
396 | \helpref{wxEvtHandler::GetPreviousHandler}{wxevthandlergetprevioushandler},\rtfsp | |
397 | \helpref{wxEvtHandler::SetNextHandler}{wxevthandlersetnexthandler},\rtfsp | |
398 | \helpref{wxEvtHandler::GetNextHandler}{wxevthandlergetnexthandler},\rtfsp | |
399 | \helpref{wxWindow::PushEventHandler}{wxwindowpusheventhandler},\rtfsp | |
400 | \helpref{wxWindow::PopEventHandler}{wxwindowpopeventhandler} | |
401 | ||
402 |