added and documented wxWS_EX_BLOCK_EVENTS flag
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@11887 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
parent
d11710cbb5
commit
e4b713a278
@ -70,8 +70,9 @@ protected:
|
|||||||
|
|
||||||
\subsection{How events are processed}\label{eventprocessing}
|
\subsection{How events are processed}\label{eventprocessing}
|
||||||
|
|
||||||
When an event is received from the windowing system, wxWindows calls \helpref{wxEvtHandler::ProcessEvent}{wxevthandlerprocessevent} on
|
When an event is received from the windowing system, wxWindows calls
|
||||||
the first event handler object belonging to the window generating the event.
|
\helpref{wxEvtHandler::ProcessEvent}{wxevthandlerprocessevent} on the first
|
||||||
|
event handler object belonging to the window generating the event.
|
||||||
|
|
||||||
It may be noted that wxWindows' event processing system implements something
|
It may be noted that wxWindows' event processing system implements something
|
||||||
very close to virtual methods in normal C++, i.e. it is possible to alter
|
very close to virtual methods in normal C++, i.e. it is possible to alter
|
||||||
@ -140,6 +141,23 @@ hierarchy from child to parent until an event handler is found that
|
|||||||
doesn't call event.Skip(). Events not derived from wxCommandEvent are
|
doesn't call event.Skip(). Events not derived from wxCommandEvent are
|
||||||
sent only to the window they occurred in and then stop.
|
sent only to the window they occurred in and then stop.
|
||||||
|
|
||||||
|
Finally, there is another additional complication (which, in fact, simplifies
|
||||||
|
life of wxWindows programmers significantly): when propagating the command
|
||||||
|
events upwards to the parent window, the event propagation stops when it
|
||||||
|
reaches the parent dialog, if any. This means that you don't risk to get
|
||||||
|
unexpected events from the dialog controls (which might be left unprocessed by
|
||||||
|
the dialog itself because it doesn't care about them) when a modal dialog is
|
||||||
|
popped up. The events do propagate beyond the frames, however. The rationale
|
||||||
|
for this choice is that there are only a few frames in a typical application
|
||||||
|
and their parent-child relation are well understood by the programmer while it
|
||||||
|
may be very difficult, if not impossible, to track down all the dialogs which
|
||||||
|
may be popped up in a complex program (remember that some are created
|
||||||
|
automatically by wxWindows). If you need to specify a different behaviour for
|
||||||
|
some reason, you can use
|
||||||
|
\helpref{SetExtraStyle(wxWS\_EX\_BLOCK\_EVENTS)}{wxwindowsetextrastyle}
|
||||||
|
explicitly to prevent the events from being propagated beyond the given window
|
||||||
|
or unset this flag for the dialogs which have it on by default.
|
||||||
|
|
||||||
Typically events that deal with a window as a window (size, motion,
|
Typically events that deal with a window as a window (size, motion,
|
||||||
paint, mouse, keyboard, etc.) are sent only to the window. Events
|
paint, mouse, keyboard, etc.) are sent only to the window. Events
|
||||||
that have a higher level of meaning and/or are generated by the window
|
that have a higher level of meaning and/or are generated by the window
|
||||||
@ -329,8 +347,8 @@ called via \helpref{wxWindow::Close}{wxwindowclose}.}
|
|||||||
file drop events.}
|
file drop events.}
|
||||||
\twocolitem{\helpref{wxEraseEvent}{wxeraseevent}}{The EVT\_ERASE\_BACKGROUND macro is used to handle window erase requests.}
|
\twocolitem{\helpref{wxEraseEvent}{wxeraseevent}}{The EVT\_ERASE\_BACKGROUND macro is used to handle window erase requests.}
|
||||||
\twocolitem{\helpref{wxFocusEvent}{wxfocusevent}}{The EVT\_SET\_FOCUS and EVT\_KILL\_FOCUS macros are used to handle keyboard focus events.}
|
\twocolitem{\helpref{wxFocusEvent}{wxfocusevent}}{The EVT\_SET\_FOCUS and EVT\_KILL\_FOCUS macros are used to handle keyboard focus events.}
|
||||||
\twocolitem{\helpref{wxKeyEvent}{wxkeyevent}}{EVT\_CHAR and EVT\_CHAR\_HOOK macros handle keyboard
|
\twocolitem{\helpref{wxKeyEvent}{wxkeyevent}}{EVT\_CHAR, EVT\_KEY\_DOWN and
|
||||||
input for any window.}
|
EVT\_KEY\_UP macros handle keyboard input for any window.}
|
||||||
\twocolitem{\helpref{wxIdleEvent}{wxidleevent}}{The EVT\_IDLE macro handle application idle events
|
\twocolitem{\helpref{wxIdleEvent}{wxidleevent}}{The EVT\_IDLE macro handle application idle events
|
||||||
(to process background tasks, for example).}
|
(to process background tasks, for example).}
|
||||||
\twocolitem{\helpref{wxInitDialogEvent}{wxinitdialogevent}}{The EVT\_INIT\_DIALOG macro is used
|
\twocolitem{\helpref{wxInitDialogEvent}{wxinitdialogevent}}{The EVT\_INIT\_DIALOG macro is used
|
||||||
|
@ -2062,6 +2062,12 @@ bits are:
|
|||||||
\twocolitem{\windowstyle{wxWS\_EX\_VALIDATE\_RECURSIVELY}}{TransferDataTo/FromWindow()
|
\twocolitem{\windowstyle{wxWS\_EX\_VALIDATE\_RECURSIVELY}}{TransferDataTo/FromWindow()
|
||||||
and Validate() methods will recursively descend into all children of the
|
and Validate() methods will recursively descend into all children of the
|
||||||
window if it has this style flag set.}
|
window if it has this style flag set.}
|
||||||
|
\twocolitem{\windowstyle{wxWS\_EX\_BLOCK\_EVENTS}}{Normally, the command
|
||||||
|
events are propagared upwards to the window parent recursively until a handler
|
||||||
|
for them is found. Using this style allows to prevent them from being
|
||||||
|
propagated beyond this window. Notice that wxDialog has this style on by
|
||||||
|
default for the reasons explained in the
|
||||||
|
\helpref{event processing overview}{eventprocessing}.}
|
||||||
\end{twocollist}
|
\end{twocollist}
|
||||||
|
|
||||||
\membersection{wxWindow::SetFocus}\label{wxwindowsetfocus}
|
\membersection{wxWindow::SetFocus}\label{wxwindowsetfocus}
|
||||||
|
@ -970,6 +970,13 @@ enum wxBorder
|
|||||||
// descend into all subwindows
|
// descend into all subwindows
|
||||||
#define wxWS_EX_VALIDATE_RECURSIVELY 0x00000001
|
#define wxWS_EX_VALIDATE_RECURSIVELY 0x00000001
|
||||||
|
|
||||||
|
// wxCommandEvents and the objects of the derived classes are forwarded to the
|
||||||
|
// parent window and so on recursively by default. Using this flag for the
|
||||||
|
// given window allows to block this propagation at this window, i.e. prevent
|
||||||
|
// the events from being propagated further upwards. The dialogs have this
|
||||||
|
// flag on by default.
|
||||||
|
#define wxWS_EX_BLOCK_EVENTS 0x00000002
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* wxFrame/wxDialog style flags
|
* wxFrame/wxDialog style flags
|
||||||
*/
|
*/
|
||||||
|
@ -57,6 +57,12 @@ WX_DELEGATE_TO_CONTROL_CONTAINER(wxDialogBase)
|
|||||||
void wxDialogBase::Init()
|
void wxDialogBase::Init()
|
||||||
{
|
{
|
||||||
m_returnCode = 0;
|
m_returnCode = 0;
|
||||||
|
|
||||||
|
// the dialogs have this flag on by default to prevent the events from the
|
||||||
|
// dialog controls from reaching the parent frame which is usually
|
||||||
|
// undesirable and can lead to unexpected and hard to find bugs
|
||||||
|
SetExtraStyle(GetExtraStyle() | wxWS_EX_BLOCK_EVENTS);
|
||||||
|
|
||||||
#ifdef wxTopLevelWindowNative // FIXME - temporary hack, should be always used!
|
#ifdef wxTopLevelWindowNative // FIXME - temporary hack, should be always used!
|
||||||
m_container.SetContainerWindow(this);
|
m_container.SetContainerWindow(this);
|
||||||
#endif
|
#endif
|
||||||
|
@ -1001,12 +1001,14 @@ bool wxEvtHandler::ProcessEvent(wxEvent& event)
|
|||||||
{
|
{
|
||||||
wxWindow *win = (wxWindow *)this;
|
wxWindow *win = (wxWindow *)this;
|
||||||
|
|
||||||
// also, don't propagate events beyond the first top level window: it
|
// honour the requests to stop propagation at this window: this is
|
||||||
// doesn't make sense to process dialogs events in the parent frame
|
// used by the dialogs, for example, to prevent processing the events
|
||||||
if ( !win->IsTopLevel() )
|
// from the dialog controls in the parent frame which rarely, if ever,
|
||||||
|
// makes sense
|
||||||
|
if ( !(win->GetExtraStyle() & wxWS_EX_BLOCK_EVENTS) )
|
||||||
{
|
{
|
||||||
wxWindow *parent = win->GetParent();
|
wxWindow *parent = win->GetParent();
|
||||||
if (parent && !parent->IsBeingDeleted())
|
if ( parent && !parent->IsBeingDeleted() )
|
||||||
return parent->GetEventHandler()->ProcessEvent(event);
|
return parent->GetEventHandler()->ProcessEvent(event);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user