A little documentation about custom events as
per the discussion on the mailing list. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@30859 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -356,21 +356,6 @@ you can use identifiers below wxID\_LOWEST.
|
|||||||
|
|
||||||
\subsection{Event macros summary}\label{eventmacros}
|
\subsection{Event macros summary}\label{eventmacros}
|
||||||
|
|
||||||
\wxheading{Generic event table macros}
|
|
||||||
|
|
||||||
\twocolwidtha{8cm}%
|
|
||||||
\begin{twocollist}\itemsep=0pt
|
|
||||||
\twocolitem{\windowstyle{EVT\_CUSTOM(event, id, func)}}{Allows you to add a custom event table
|
|
||||||
entry by specifying the event identifier (such as wxEVT\_SIZE), the window identifier,
|
|
||||||
and a member function to call.}
|
|
||||||
\twocolitem{\windowstyle{EVT\_CUSTOM\_RANGE(event, id1, id2, func)}}{The same as EVT\_CUSTOM,
|
|
||||||
but responds to a range of window identifiers.}
|
|
||||||
\twocolitem{\windowstyle{EVT\_COMMAND(id, event, func)}}{The same as EVT\_CUSTOM, but
|
|
||||||
expects a member function with a wxCommandEvent argument.}
|
|
||||||
\twocolitem{\windowstyle{EVT\_COMMAND\_RANGE(id1, id2, event, func)}}{The same as EVT\_CUSTOM\_RANGE, but
|
|
||||||
expects a member function with a wxCommandEvent argument.}
|
|
||||||
\end{twocollist}
|
|
||||||
|
|
||||||
\wxheading{Macros listed by event class}
|
\wxheading{Macros listed by event class}
|
||||||
|
|
||||||
The documentation for specific event macros is organised by event class. Please refer
|
The documentation for specific event macros is organised by event class. Please refer
|
||||||
@@ -413,3 +398,170 @@ update pseudo-events, which are generated to give the application the chance to
|
|||||||
toolbars and controls.}
|
toolbars and controls.}
|
||||||
\end{twocollist}
|
\end{twocollist}
|
||||||
|
|
||||||
|
\subsection{Custom event summary}\label{customevents}
|
||||||
|
|
||||||
|
\wxheading{General approach}
|
||||||
|
|
||||||
|
Since version 2.2.x of wxWidgets, each event type is identified by ID which
|
||||||
|
is given to the event type {\it at runtime} which makes it possible to add
|
||||||
|
new event types to the library or application without risking ID clashes
|
||||||
|
(two different event types mistakingly getting the same event ID). This
|
||||||
|
event type ID is stored in a struct of type {\bf const wxEventType}.
|
||||||
|
|
||||||
|
In order to define a new event type, there are principally two choices.
|
||||||
|
One is to define a entirely new event class (typically deriving from
|
||||||
|
\helpref{wxEvent}{wxevent} or \helpref{wxCommandEvent}{wxcommandevent}.
|
||||||
|
The other is to use the existing event classes and give them an new event
|
||||||
|
type. You'll have to define and declare a new event type using either way,
|
||||||
|
and this is done using the following macros:
|
||||||
|
|
||||||
|
\begin{verbatim}
|
||||||
|
// in the header of the source file
|
||||||
|
DECLARE_EVENT_TYPE(name, value)
|
||||||
|
|
||||||
|
// in the implementation
|
||||||
|
DEFINE_EVENT_TYPE(name)
|
||||||
|
\end{verbatim}
|
||||||
|
|
||||||
|
You can ignore the {\it value} parameter of the DECLARE\_EVENT\_TYPE macro
|
||||||
|
since it used only for backwards compatibility with wxWidgets 2.0.x based
|
||||||
|
applications where you have to give the event type ID an explicit value.
|
||||||
|
|
||||||
|
\wxheading{Using existing event classes}
|
||||||
|
|
||||||
|
If you just want to use a \helpref{wxCommandEvent}{wxcommandevent} with
|
||||||
|
a new event type, you can then use one of the generic event table macros
|
||||||
|
listed below, without having to define a new macro yourself. This also
|
||||||
|
has the advantage that you won't have to define a new \helpref{wxEvent::Clone()}{wxeventclone}
|
||||||
|
method for posting events between threads etc. This could look like this
|
||||||
|
in your code:
|
||||||
|
|
||||||
|
{\small%
|
||||||
|
\begin{verbatim}
|
||||||
|
DECLARE_EVENT_TYPE(wxEVT_MY_EVENT, -1)
|
||||||
|
|
||||||
|
DEFINE_EVENT_TYPE(wxEVT_MY_EVENT)
|
||||||
|
|
||||||
|
// user code intercepting the event
|
||||||
|
|
||||||
|
BEGIN_EVENT_TABLE(MyFrame, wxFrame)
|
||||||
|
EVT_MENU (wxID_EXIT, MyFrame::OnExit)
|
||||||
|
// ....
|
||||||
|
EVT_COMMAND (wxEVT_MY_EVENT, ID_MY_WINDOW, MyFrame::OnMyEvent)
|
||||||
|
END_EVENT_TABLE()
|
||||||
|
|
||||||
|
void MyFrame::OnMyEvent( wxCommandEvent &event )
|
||||||
|
{
|
||||||
|
// do something
|
||||||
|
wxString text = event.GetText();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// user code sending the event
|
||||||
|
|
||||||
|
void MyWindow::SendEvent()
|
||||||
|
{
|
||||||
|
wxCommandEvent event( wxEVT_MY_EVENT, GetId() );
|
||||||
|
event.SetEventObject( this );
|
||||||
|
// Give it some contents
|
||||||
|
event.SetText( wxT("Hallo") );
|
||||||
|
// Send it
|
||||||
|
GetEventHandler()->ProcessEvent( event );
|
||||||
|
}
|
||||||
|
\end{verbatim}
|
||||||
|
}%
|
||||||
|
|
||||||
|
|
||||||
|
\wxheading{Generic event table macros}
|
||||||
|
|
||||||
|
\twocolwidtha{8cm}%
|
||||||
|
\begin{twocollist}\itemsep=0pt
|
||||||
|
\twocolitem{\windowstyle{EVT\_CUSTOM(event, id, func)}}{Allows you to add a custom event table
|
||||||
|
entry by specifying the event identifier (such as wxEVT\_SIZE), the window identifier,
|
||||||
|
and a member function to call.}
|
||||||
|
\twocolitem{\windowstyle{EVT\_CUSTOM\_RANGE(event, id1, id2, func)}}{The same as EVT\_CUSTOM,
|
||||||
|
but responds to a range of window identifiers.}
|
||||||
|
\twocolitem{\windowstyle{EVT\_COMMAND(id, event, func)}}{The same as EVT\_CUSTOM, but
|
||||||
|
expects a member function with a wxCommandEvent argument.}
|
||||||
|
\twocolitem{\windowstyle{EVT\_COMMAND\_RANGE(id1, id2, event, func)}}{The same as EVT\_CUSTOM\_RANGE, but
|
||||||
|
expects a member function with a wxCommandEvent argument.}
|
||||||
|
\twocolitem{\windowstyle{EVT\_NOTIFY(id, event, func)}}{The same as EVT\_CUSTOM, but
|
||||||
|
expects a member function with a wxNotifyEvent argument.}
|
||||||
|
\twocolitem{\windowstyle{EVT\_NOTIFY\_RANGE(id1, id2, event, func)}}{The same as EVT\_CUSTOM\_RANGE, but
|
||||||
|
expects a member function with a wxNotifyEvent argument.}
|
||||||
|
\end{twocollist}
|
||||||
|
|
||||||
|
|
||||||
|
\wxheading{Defining your own event class}
|
||||||
|
|
||||||
|
Under certain circumstances, it will be required to define your own event
|
||||||
|
class e.g. for sending more complex data from one place to another. Apart
|
||||||
|
from defining your event class, you will also need to define your own
|
||||||
|
event table macro (which is quite long). Watch out to put in enough
|
||||||
|
casts to the inherited event function. Here is an example, taken mostly
|
||||||
|
from the {\it wxPlot} library, which is in the {\it contrib} section of
|
||||||
|
the wxWidgets sources.
|
||||||
|
|
||||||
|
{\small%
|
||||||
|
\begin{verbatim}
|
||||||
|
|
||||||
|
// code defining event
|
||||||
|
|
||||||
|
class wxPlotEvent: public wxNotifyEvent
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
wxPlotEvent( wxEventType commandType = wxEVT_NULL, int id = 0 );
|
||||||
|
|
||||||
|
// accessors
|
||||||
|
wxPlotCurve *GetCurve()
|
||||||
|
{ return m_curve; }
|
||||||
|
|
||||||
|
// required for sending with wxPostEvent()
|
||||||
|
wxEvent* Clone();
|
||||||
|
|
||||||
|
private:
|
||||||
|
wxPlotCurve *m_curve;
|
||||||
|
};
|
||||||
|
|
||||||
|
DECLARE_EVENT_MACRO( wxEVT_PLOT_ACTION, -1 )
|
||||||
|
|
||||||
|
typedef void (wxEvtHandler::*wxPlotEventFunction)(wxPlotEvent&);
|
||||||
|
|
||||||
|
#define EVT_PLOT(id, fn) \
|
||||||
|
DECLARE_EVENT_TABLE_ENTRY( wxEVT_PLOT_ACTION, id, -1, \
|
||||||
|
(wxObjectEventFunction) (wxEventFunction) (wxCommandEventFunction) (wxNotifyEventFunction) \
|
||||||
|
wxStaticCastEvent( wxPlotEventFunction, & fn ), (wxObject *) NULL ),
|
||||||
|
|
||||||
|
|
||||||
|
// code implementing the event type and the event class
|
||||||
|
|
||||||
|
DEFINE_EVENT_TYPE( wxEVT_PLOT_ACTION )
|
||||||
|
|
||||||
|
wxPlotEvent::wxPlotEvent( ...
|
||||||
|
|
||||||
|
|
||||||
|
// user code intercepting the event
|
||||||
|
|
||||||
|
BEGIN_EVENT_TABLE(MyFrame, wxFrame)
|
||||||
|
EVT_PLOT (ID_MY_WINDOW, MyFrame::OnPlot)
|
||||||
|
END_EVENT_TABLE()
|
||||||
|
|
||||||
|
void MyFrame::OnPlot( wxPlotEvent &event )
|
||||||
|
{
|
||||||
|
wxPlotCurve *curve = event.GetCurve();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// user code sending the event
|
||||||
|
|
||||||
|
void MyWindow::SendEvent()
|
||||||
|
{
|
||||||
|
wxPlotEvent event( wxEVT_PLOT_ACTION, GetId() );
|
||||||
|
event.SetEventObject( this );
|
||||||
|
event.SetCurve( m_curve );
|
||||||
|
GetEventHandler()->ProcessEvent( event );
|
||||||
|
}
|
||||||
|
|
||||||
|
\end{verbatim}
|
||||||
|
}%
|
||||||
|
|
||||||
|
@@ -2427,6 +2427,13 @@ typedef void (wxEvtHandler::*wxMouseCaptureChangedEventFunction)(wxMouseCaptureC
|
|||||||
#define EVT_CUSTOM(event, winid, func) DECLARE_EVENT_TABLE_ENTRY( event, winid, wxID_ANY, (wxObjectEventFunction) wxStaticCastEvent( wxEventFunction, & func ), (wxObject *) NULL ),
|
#define EVT_CUSTOM(event, winid, func) DECLARE_EVENT_TABLE_ENTRY( event, winid, wxID_ANY, (wxObjectEventFunction) wxStaticCastEvent( wxEventFunction, & func ), (wxObject *) NULL ),
|
||||||
#define EVT_CUSTOM_RANGE(event, id1, id2, func) DECLARE_EVENT_TABLE_ENTRY( event, id1, id2, (wxObjectEventFunction) wxStaticCastEvent( wxEventFunction, & func ), (wxObject *) NULL ),
|
#define EVT_CUSTOM_RANGE(event, id1, id2, func) DECLARE_EVENT_TABLE_ENTRY( event, id1, id2, (wxObjectEventFunction) wxStaticCastEvent( wxEventFunction, & func ), (wxObject *) NULL ),
|
||||||
|
|
||||||
|
// EVT_COMMAND
|
||||||
|
#define EVT_COMMAND(winid, event, fn) DECLARE_EVENT_TABLE_ENTRY( event, winid, wxID_ANY, (wxObjectEventFunction) (wxEventFunction) wxStaticCastEvent( wxCommandEventFunction, & fn ), (wxObject *) NULL ),
|
||||||
|
#define EVT_COMMAND_RANGE(id1, id2, event, fn) DECLARE_EVENT_TABLE_ENTRY( event, id1, id2, (wxObjectEventFunction) (wxEventFunction) wxStaticCastEvent( wxCommandEventFunction, & fn ), (wxObject *) NULL ),
|
||||||
|
|
||||||
|
#define EVT_NOTIFY(event, winid, func) DECLARE_EVENT_TABLE_ENTRY( event, winid, wxID_ANY, (wxObjectEventFunction) (wxEventFunction) (wxCommandEventFunction) wxStaticCastEvent( wxNotifyFunction, & func ), (wxObject *) NULL ),
|
||||||
|
#define EVT_NOTIFY_RANGE(event, id1, id2, func) DECLARE_EVENT_TABLE_ENTRY( event, id1, id2, (wxObjectEventFunction) (wxEventFunction) (wxCommandEventFunction) wxStaticCastEvent( wxNotifyFunction, & func ), (wxObject *) NULL ),
|
||||||
|
|
||||||
// Miscellaneous
|
// Miscellaneous
|
||||||
#define EVT_SIZE(func) DECLARE_EVENT_TABLE_ENTRY( wxEVT_SIZE, wxID_ANY, wxID_ANY, (wxObjectEventFunction) (wxEventFunction) wxStaticCastEvent( wxSizeEventFunction, & func ), (wxObject *) NULL ),
|
#define EVT_SIZE(func) DECLARE_EVENT_TABLE_ENTRY( wxEVT_SIZE, wxID_ANY, wxID_ANY, (wxObjectEventFunction) (wxEventFunction) wxStaticCastEvent( wxSizeEventFunction, & func ), (wxObject *) NULL ),
|
||||||
#define EVT_SIZING(func) DECLARE_EVENT_TABLE_ENTRY( wxEVT_SIZING, wxID_ANY, wxID_ANY, (wxObjectEventFunction) (wxEventFunction) wxStaticCastEvent( wxSizeEventFunction, & func ), (wxObject *) NULL ),
|
#define EVT_SIZING(func) DECLARE_EVENT_TABLE_ENTRY( wxEVT_SIZING, wxID_ANY, wxID_ANY, (wxObjectEventFunction) (wxEventFunction) wxStaticCastEvent( wxSizeEventFunction, & func ), (wxObject *) NULL ),
|
||||||
@@ -2502,10 +2509,6 @@ typedef void (wxEvtHandler::*wxMouseCaptureChangedEventFunction)(wxMouseCaptureC
|
|||||||
DECLARE_EVENT_TABLE_ENTRY( wxEVT_LEAVE_WINDOW, wxID_ANY, wxID_ANY, (wxObjectEventFunction) (wxEventFunction) wxStaticCastEvent( wxMouseEventFunction, & func ), (wxObject *) NULL ),\
|
DECLARE_EVENT_TABLE_ENTRY( wxEVT_LEAVE_WINDOW, wxID_ANY, wxID_ANY, (wxObjectEventFunction) (wxEventFunction) wxStaticCastEvent( wxMouseEventFunction, & func ), (wxObject *) NULL ),\
|
||||||
DECLARE_EVENT_TABLE_ENTRY( wxEVT_MOUSEWHEEL, wxID_ANY, wxID_ANY, (wxObjectEventFunction) (wxEventFunction) wxStaticCastEvent( wxMouseEventFunction, & func ), (wxObject *) NULL ),
|
DECLARE_EVENT_TABLE_ENTRY( wxEVT_MOUSEWHEEL, wxID_ANY, wxID_ANY, (wxObjectEventFunction) (wxEventFunction) wxStaticCastEvent( wxMouseEventFunction, & func ), (wxObject *) NULL ),
|
||||||
|
|
||||||
// EVT_COMMAND
|
|
||||||
#define EVT_COMMAND(winid, event, fn) DECLARE_EVENT_TABLE_ENTRY( event, winid, wxID_ANY, (wxObjectEventFunction) (wxEventFunction) wxStaticCastEvent( wxCommandEventFunction, & fn ), (wxObject *) NULL ),
|
|
||||||
#define EVT_COMMAND_RANGE(id1, id2, event, fn) DECLARE_EVENT_TABLE_ENTRY( event, id1, id2, (wxObjectEventFunction) (wxEventFunction) wxStaticCastEvent( wxCommandEventFunction, & fn ), (wxObject *) NULL ),
|
|
||||||
|
|
||||||
// Scrolling from wxWindow (sent to wxScrolledWindow)
|
// Scrolling from wxWindow (sent to wxScrolledWindow)
|
||||||
#define EVT_SCROLLWIN(func) \
|
#define EVT_SCROLLWIN(func) \
|
||||||
DECLARE_EVENT_TABLE_ENTRY( wxEVT_SCROLLWIN_TOP, wxID_ANY, wxID_ANY, (wxObjectEventFunction) (wxEventFunction) wxStaticCastEvent( wxScrollWinEventFunction, & func ), (wxObject *) NULL ),\
|
DECLARE_EVENT_TABLE_ENTRY( wxEVT_SCROLLWIN_TOP, wxID_ANY, wxID_ANY, (wxObjectEventFunction) (wxEventFunction) wxStaticCastEvent( wxScrollWinEventFunction, & func ), (wxObject *) NULL ),\
|
||||||
|
Reference in New Issue
Block a user