Introduction to wxWidgets――跨平台界面开发的优秀工具
<![CDATA[
文章来源: http://www.codeproject.com/library/wxwidgets.asp
wxWidegets是个好东西,我喜欢,后面开始学习
wxWidgets formerly known as wxWindows is a framework for developing cross-platform GUI applications in C++. Julian Smart started the framework in 1992 at the Artificial Intelligence Applications Institute, University of Edinburgh. In 1995, a port to Xt was released by Markus Holzem. In May 1997, the Windows and the GTK+ ports were merged and put into a CVS repository. wxWidgets gives you a single, easy-to-use API for writing GUI applications on multiple platforms. Link it with the appropriate library for your platform (Windows/Unix/Mac) and compiler (almost any popular C++ compiler), and your application will adopt the look and feel appropriate to that platform. On top of the great GUI functionality, wxWindows gives you: online help, network programming, streams, clipboard and drag and drop, multithreading, image loading and saving in a variety of popular formats, database support, HTML viewing and printing, and much more. wxWidgets is a framework very much similar to MFC, except for a few negative points of its own. Those MFC programmers who are aware of the growing number of Linux users and who want to write cross platform GUI applications can use wxWidgets. With wxWidgets, it is very easy to use a framework based on C++ and it has a proven record of 13 years. In fact, wxWidgets is very stable and is supported on: There are a number of options available for writing cross platform GUI development, like: JAVA, Mono.NET, Qt, etc. Java has failed to prove itself as an efficient alternative. Qt is good but commercial and nobody knows its future. Mono.NET seems to be good but is largely driven by Microsoft, it seems like a copy of the work done by Microsoft and it has not yet proved itself as a successful alternative. Also, people would not like to use an extra burden of layer for highly efficient software. As wxWidgets does not use any middle layer and uses only the native controls available on the platform, it gives a nice look and feel to the application.
Starting with wxWidgets is really very easy. Just follow these steps: Hello world is a classic example to start learning any new language. It gives an overview of the language without going deeper into it. And for the “Release” configuration add the following line: And for the “Release” configuration, add the following line: And for the “Releasse” configuration as: And for the “Release” configuration, add the following line: You have successfully created your first “Hello World” program with wxWidgets: Install the Visual C++ 2005 Express by following the instructions given in Manual Installation Instructions for Express Editions and then configure the platform SDK by following steps given in Using Visual C++ 2005 Express Beta 2 with the Microsoft Platform SDK. After this, you need to change the following: [Editor comment: Line breaks used to avoid scrolling.] to set “ An example corewin_express.vsprops file: Then open the file $(WXWIN)\src\msw\main.cpp, search for the function &apos before the line: After you have configured your Visual Studio, the remaining steps are the same, simply follow the instructions given above for Visual Studio .NET, and open the wx.dsw file and compile the libraries for all the project configurations namely: Debug, Release, Debug DLL, Release DLL, Unicode Debug, Unicode Release, Unicode Debug DLL, Unicode Release DLL. VC8 has also changed the way manifests are embedded in your executable. Your project will not be built if you include wx.manifest in your resource file. First, exclude the manifest from your resources by adding the define statement to your YourAppName.rc file: Second, add these lines to your one of your source or header files to enable XP-Style common controls: Due to the large number of pictures and high downloading time, this section has been moved to a new article. Working with wxWidgets on Linux, can be found here. You have to include wxWidgets&apos header files, of course. This can be done on a file by file basis (such as Practically, every app should define a new class derived from The main window is created by deriving a class from In order to be able to react to a menu command, it must be given a unique identifier such as a We then proceed to actually implement an event table in which the events are routed to their respective handler functions in the class As in all programs, there must be a “main” function. Under wxWidgets, main is implemented using this macro, which creates an application instance and starts the program: As mentioned above, In the constructor of the main window (or later on) we create a menu with two menu items as well as a status bar to be shown at the bottom of the main window. Both have to be “announced” to the frame with the respective calls: Here are the actual event handlers. An event table is placed in an implementation file to tell wxWindows how to map events to member functions. These member functions are not Here&aposs an example of an event table: The first two entries map menu commands to two different member functions. The The As mentioned before, the member functions that handle events don&apost have to be The event table in the implementation file must have a When an event is received from the windowing system, wxWindows calls wxEvtHandler::ProcessEvent on the first event handler object belonging to the window generating the event. It may be noted that wxWindows&apos event processing system implements something very close to the To summarize, instead of explicitly calling the base class version as you would do with C++ In practice, this would look like the following if the derived text control only accepts &aposa&apos to &aposz&apos and &aposA&apos to &aposZ&apos: The normal order of event table searching by Pay close attention to step 5: People often overlook or get confused by this powerful feature of wxWindows event processingsystem. To put it a different way, events derived either directly or indirectly from Finally, there is another additional complication (which, in fact, simplifies the 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&apost risk to get unexpected events from the dialog controls (which might be left unprocessed by the dialog itself because it doesn&apost 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 behavior for some reason, you can use SetExtraStyle(wxWS_EX_BLOCK_EVENTS) explicitly to prevent the events from being propagated beyond the given window or unset this flag for the dialogs which have it by default. Typically events that deal with a window as a window (size, motion, 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 itself, (button click, menu select, tree expand, etc.) are command events and are sent up to the parent to see if it is interested in the event. Note that your application may wish to override As mentioned above, only the command events are recursively applied to the parent&aposs event handler. As this often causes confusion to the users, here is a list of the system events that are not sent to the parent&aposs event handler:
Introduction
What is wxWidgets
Who should use wxWidgets
Why use wxWidgets
wxRegEx, wxFTP, wxSplashScreen, wxZipInputStream, etc.
wxGenericDirCtrl, wxCalendarCtrl, wxDatePickerCtrl, wxTipWindow, wxStyledTextCtrl, wxStaticPicture, wxLEDNumberCtrl, wxEditableListBox, wxFoldPanelBar, wxGIFAnimationCtrl, wxSplashScreen, OGL (Object Graphics Library), FL (Frame Layout), etc. This is one of the main repository.
Main features
wxSMTP, wxHTTP, wxFTP.
wxRarInputStream.
wxDao.
wxMozilla, wxIE.
Similarity to MFC
MFC and wxWidgets macros
MFC version
wxWidgets version
BEGIN_MESSAGE_MAP
BEGIN_EVENT_TABLE
END_MESSAGE_MAP
END_EVENT_TABLE
DECLARE_DYNAMIC
DECLARE_CLASS
DECLARE_DYNCREATE
DECLARE_DYMAMIC_CLASS
IMPLEMENT_DYNAMIC
IMPLEMENT_CLASS
IMPLEMENT_DYNCREATE
IMPLEMENT_DYNAMIC_CLASS
IsKindOf(RUNTIME_CLASS(CWindow))
IsKindOf(CLASSINFO(wxWindow))MFC and wxWidgets classes
Miscellaneous Classes
MFC version
wxWidgets version
CWinApp
wxApp
CObject
wxObject
CCmdTarget
wxEvtHandler
CCommandLineInfo
wxCmdLineParser
CMenu
wxMenu, wMenuBar, wxMenuItem
CWaitCursor
wxBusyCursor
CDataExchange
wxValidator
Window Classes
MFC version
wxWidgets version
CFrameWnd
wxFrame
CMDIFrameWnd
wxMDIParentFrame
CMDIChildWnd
wxMDIChildFrame
CSplitterWnd
wxSplitterWindow
CToolBar
wxToolBar
CStatusBar
wxStatusBar
CReBar
wxCoolBar, but see contrib/src/fl and wxAUI, wxDockIt
CPropertyPage
wxPanel
CPropertySheet
wxNotebook, wxPropertySheetDialog
Dialog Classes
MFC version
wxWidgets version
CDialog
wxDialog
CColorDialog
wxColourDialog
CFileDialog
wxFileDialog
CFindReplaceDialog
wxFindReplaceDialog
CFontDialog
wxFontDialog
CPageSetupDialog
wxPageSetupDialog
CPrintDialog
wxPrintDialog
Control Classes
MFC version
wxWidgets version
CAnimateCtrl
wxMediaCtrl, wxAnimationCtrl
CButton
wxButton
CBitmapButton
wxBitmapButton
CComboBox
wxComboBox, wxChoice
CDateTimeCtrl
wxDatePickerCtrl
CEdit
wxTextCtrl
CHotKeyCtrl
None, but see Keybinder
CListBox, CDragListBox
wxListBox
CCheckListBox
wxCheckListBox
CListCtrl
wxListCtrl, wxListView
CMonthCalCtrl
wxCalendarCtrl
CProgressCtrl
wxGauge
CReBarCtrl
None, but see contrib/src/fl and wxAUI, wxDockIt
CRichEditCtrl
wxTextCtrl
CScrollBar
wxScrollBar
CSliderCtrl
wxSlider
CSpinButtonCtrl
wxSpinButton, wxSpinCtrl
CStatic
wxStaticText, wxStaticLine, wxStaticBox, wxStaticBitmap
CStatusBarCtrl
wxStatusBar
CTabCtrl
wxTabCtrl
CToolBarCtrl
wxToolBar
CToolTipCtrl
wxToolTip
CTreeCtrl
wxTreeCtrl
Graphics Classes
MFC version
wxWidgets version
CBitmap
wxBitmap, wxImage, wxIcon, wxCursor
CBrush
wxBrush
CPen
wxPen
CFont
wxFont
CImageList
wxImageList, wxIconBundle
CPalette
wxPalette
CRgn
wxRegion
CClientDC
wxClientDC
CMetaFileDC
wxMetaFileDC
CPaintDC
wxPaintDC
CWindowDC
wxWindowDC
CDC
wxDC, wxMemoryDC
Data Structure Classes
MFC version
wxWidgets version
CArray, CObArray, CPtrArray
wxArray
CStringArray
wxArrayString
CDWordArray, CByteArray, CUIntArray
wxArrayInt
CList, CPtrList, CObList
wxList
CStringList
wxArrayString, wxStringList
CMap
wxHashMap
CString
wxString
CPoint
wxPoint
CRect
wxRect
CSize
wxSize
CTime
wxDateTime
CTimeSpan
wxTimeSpan, wxDateSpan
COleVariant
wxVariant
Internet Classes
MFC version
wxWidgets version
CSocket
wxSocket
CFtpConnection
wxFTP
CHttpConnection
wxHTTP
Document/View Classes
MFC version
wxWidgets version
CDocument
wxDocument
CView
wxView
CDocTemplate, CSingleDocTemplate, CMultiDocTemplate
wxDocTemplate
Drag and Drop Classes
MFC version
wxWidgets version
COleDataSource
wxDataObject
COleDropSource
wxDropSource
COleDropTarget
wxDropTarget
File Classes
MFC version
wxWidgets version
CFile
wxFile, wxFFile, wxTextFile
CMemFile
wxMemoryInputStream, wxMemoryOutputStream
CSocketFile
wxSocketInputStream, wxSocketOutputStream
CRecentFileList
wxFileHistory
Multithreading Classes
MFC version
wxWidgets version
CWinThread
wxThread
CCriticalSection
wxCriticalSection
CMutex
wxMutex
CSemaphore
wxSemaphore Class hierarchy
Getting started
0 && image.height>0){if(image.width>=510){this.width=510;this.height=image.height*510/image.width;}}” height=303 src=”http://www.codeproject.com/library/wxWidgets/image001.jpg” width=500>
Hello world
0 && image.height>0){if(image.width>=510){this.width=510;this.height=image.height*510/image.width;}}” height=393 src=”http://www.codeproject.com/library/wxWidgets/image002.jpg” width=531>
0 && image.height>0){if(image.width>=510){this.width=510;this.height=image.height*510/image.width;}}” height=385 src=”http://www.codeproject.com/library/wxWidgets/image003.jpg” width=541>
0 && image.height>0){if(image.width>=510){this.width=510;this.height=image.height*510/image.width;}}” height=373 src=”http://www.codeproject.com/library/wxWidgets/image004.jpg” width=531>
0 && image.height>0){if(image.width>=510){this.width=510;this.height=image.height*510/image.width;}}” id=preimg0 style=”CURSOR: hand” height=9 src=”http://www.codeproject.com/images/minus.gif” width=9 preid=”0″> Collapse
/* * hworld.cpp * Hello world sample by Robert Roebling */ #include “wx/wx.h” class MyApp: public wxApp{ virtual bool OnInit();}; class MyFrame: public wxFrame{public: MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size); void OnQuit(wxCommandEvent& event); void OnAbout(wxCommandEvent& event); DECLARE_EVENT_TABLE()};enum{ ID_Quit = 1, ID_About,}; BEGIN_EVENT_TABLE(MyFrame, wxFrame) EVT_MENU(ID_Quit, MyFrame::OnQuit) EVT_MENU(ID_About, MyFrame::OnAbout)END_EVENT_TABLE() IMPLEMENT_APP(MyApp)bool MyApp::OnInit(){ MyFrame *frame = new MyFrame( “Hello World”, wxPoint(50,50), wxSize(450,340) ); frame->Show(TRUE); SetTopWindow(frame); return TRUE;} MyFrame::MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size): wxFrame((wxFrame *)NULL, -1, title, pos, size){ wxMenu *menuFile = new wxMenu; menuFile->Append( ID_About, “&About…” ); menuFile->AppendSeparator(); menuFile->Append( ID_Quit, “E&xit” ); wxMenuBar *menuBar = new wxMenuBar; menuBar->Append( menuFile, “&File” ); SetMenuBar( menuBar ); CreateStatusBar(); SetStatusText( “Welcome to wxWindows!” );} void MyFrame::OnQuit(wxCommandEvent& WXUNUSED(event)){ Close(TRUE);} void MyFrame::OnAbout(wxCommandEvent& WXUNUSED(event)){ wxMessageBox(“This is a wxWindows Hello world sample”, “About Hello World”, wxOK | wxICON_INFORMATION, this);}
0 && image.height>0){if(image.width>=510){this.width=510;this.height=image.height*510/image.width;}}” height=327 src=”http://www.codeproject.com/library/wxWidgets/image005.jpg” width=500>
0 && image.height>0){if(image.width>=510){this.width=510;this.height=image.height*510/image.width;}}” height=419 src=”http://www.codeproject.com/library/wxWidgets/image006.jpg” width=411>
0 && image.height>0){if(image.width>=510){this.width=510;this.height=image.height*510/image.width;}}” height=327 src=”http://www.codeproject.com/library/wxWidgets/image007.jpg” width=500>
0 && image.height>0){if(image.width>=510){this.width=510;this.height=image.height*510/image.width;}}”height=299 src=”http://www.codeproject.com/library/wxWidgets/image008.jpg” width=342>
“$(WXWIN)\include”;“$(WXWIN)\contrib\include”;“$(WXWIN)\lib\mswd”
“$(WXWIN)\include”;“$(WXWIN)\contrib\include”;“$(WXWIN)\lib\msw”
0 && image.height>0){if(image.width>=510){this.width=510;this.height=image.height*510/image.width;}}” height=308 src=”http://www.codeproject.com/library/wxWidgets/image009.jpg” width=452>
WIN32;_DEBUG;_WINDOWS;__WINDOWS__;__WXMSW__;__WXDEBUG__;WXDEBUG=1;__WIN95__;__WIN32__;WINVER=0×0400;STRICT
NDEBUG,WIN32,_WINDOWS,__WINDOWS__,__WXMSW__,__WIN95__,__WIN32__, WINVER=0×0400,STRICT
0 && image.height>0){if(image.width>=510){this.width=510;this.height=image.height*510/image.width;}}” height=308 src=”http://www.codeproject.com/library/wxWidgets/image010.jpg” width=452>
Multi-threaded Debug DLL (/MDd)
Multi-threaded DLL (/MD)
0 && image.height>0){if(image.width>=510){this.width=510;this.height=image.height*510/image.width;}}” height=308 src=”http://www.codeproject.com/library/wxWidgets/image011.jpg” width=452>
“$(WXWIN)\lib”;“$(WXWIN)\contrib\lib”;“$(WXWIN)\lib\vc_lib”
“$(WXWIN)\lib”;“$(WXWIN)\contrib\lib”;“$(WXWIN)\lib\vc_lib”
0 && image.height>0){if(image.width>=510){this.width=510;this.height=image.height*510/image.width;}}” height=308 src=”http://www.codeproject.com/library/wxWidgets/image012.jpg” width=451>
wxmsw26d_core.lib wxbase26d.lib wxtiffd.lib wxjpegd.lib wxpngd.lib wxzlibd.lib wxregexd.lib wxexpatd.libwinmm.lib comctl32.lib rpcrt4.lib wsock32.lib oleacc.lib kernel32.lib user32.lib gdi32.lib winspool.libcomdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib
wxmsw26_core.lib wxbase26.lib wxtiff.lib wxjpeg.lib wxpng.lib wxzlib.lib wxregex.lib wxexpat.lib winmm.lib comctl32.lib rpcrt4.lib wsock32.lib oleacc.lib odbc32.lib kernel32.lib user32.lib gdi32.libwinspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbccp32.lib
0 && image.height>0){if(image.width>=510){this.width=510;this.height=image.height*510/image.width;}}” height=308 src=”http://www.codeproject.com/library/wxWidgets/image013.jpg” width=451>
0 && image.height>0){if(image.width>=510){this.width=510;this.height=image.height*510/image.width;}}” height=269 src=”http://www.codeproject.com/library/wxWidgets/image014.jpg” width=220>
0 && image.height>0){if(image.width>=510){this.width=510;this.height=image.height*510/image.width;}}” height=238 src=”http://www.codeproject.com/library/wxWidgets/image015.jpg” width=236>
Congratulations!
0 && image.height>0){if(image.width>=510){this.width=510;this.height=image.height*510/image.width;}}” height=340 src=”http://www.codeproject.com/library/wxWidgets/image016.jpg” width=450>
Visual C++ 2005 Express
%program Files%\Microsoft Visual Studio 8\VC\VCProjectDefaults\ corewin_express.vsprops
_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE” as PreprocessorDefinitions.
DllMain&apos and add the following lines:#if _MSC_VER >= 1400 && _WINDLL#undef _WINDLL#endif
#if defined(_WINDLL)
#definewxUSE_NO_MANIFEST 1
#if defined(__WXMSW__) && !defined(__WXWINCE__)#pragma comment(linker, “\”/manifestdependency:type=&aposwin32&apos name=&aposMicrosoft.Windows.Common-Controls&apos version=&apos6.0.0.0&apos processorArchitecture=&aposX86&apos publicKeyToken=&apos6595b64144ccf1df&apos\“”)#endif
Linux
Understanding the program
#include “wx/window.h”) or using one global include (#include “wx/wx.h”). This is also useful on platforms that support precompiled headers such as all major compilers on the Windows platform:// file name: hworld.cpp//// purpose: wxWidgets “Hello world”//// For compilers that support precompilation,// includes “wx/wx.h”.#include “wx/wxprec.h”#ifdef __BORLANDC__ #pragma hdrstop#endif#ifndef WX_PRECOMP #include “wx/wx.h”#endif
wxApp. By overriding wxApp&aposs OnInit(), the program can be initialized, e.g. by creating a new main window.class MyApp: public wxApp { virtual bool OnInit(); };
wxFrame and giving it a menu and a status bar in its constructor. Also, any class that wishes to respond to any “event” (such as mouse clicks or messages from the menu or a button) must declare an event table using the macro below. Finally, a way to react to such events must be done in “handlers”. In our sample, we react to two menu items, one for “Quit” and one for displaying an “About” window. These handlers should not be virtual:class MyFrame: public wxFrame{public: MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size); void OnQuit(wxCommandEvent& event); void OnAbout(wxCommandEvent& event);private: DECLARE_EVENT_TABLE()};
const or an enum.enum{ ID_Quit = 1, ID_About,};
MyFrame. There are predefined macros for routing all the common events, ranging from the selection of a list box entry to a resize event when a user resizes a window on the screen. If -1 is given as the ID, the given handler will be invoked for any event of the specified type, so that you could just add one entry in the event table for all menu commands or all button commands etc. The origin of the event can still be distinguished in the event handler as the (only) parameter in an event handler is a reference to a wxEvent object, which holds information about the event (such as the ID of and a pointer to the class, which caused the event).BEGIN_EVENT_TABLE(MyFrame, wxFrame) EVT_MENU(ID_Quit, MyFrame::OnQuit) EVT_MENU(ID_About, MyFrame::OnAbout)END_EVENT_TABLE()
IMPLEMENT_APP(MyApp)
wxApp::OnInit() is called upon startup and should be used to initialize the program, maybe for showing a “splash screen” and creating the main window (or several). The frame should get a title bar text (”Hello World”) and a position and start-up size. One frame can also be declared as the top window. Returning TRUE indicates a successful initialization:bool MyApp::OnInit(){ MyFrame *frame = new MyFrame( “Hello World”, wxPoint(50,50), wxSize(450,340) ); frame->Show( TRUE ); SetTopWindow( frame ); return TRUE;}
MyFrame::MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size) : wxFrame((wxFrame *)NULL, -1, title, pos, size){ wxMenu *menuFile = new wxMenu; menuFile->Append( ID_About, “&About…” ); menuFile->AppendSeparator(); menuFile->Append( ID_Quit, “E&xit” ); wxMenuBar *menuBar = new wxMenuBar; menuBar->Append( menuFile, “&File” ); SetMenuBar( menuBar ); CreateStatusBar(); SetStatusText( “Welcome to wxWidgets!” );}
MyFrame::OnQuit() closes the main window by calling Close(). The parameter TRUE indicates that other Windows have no veto power, such as after asking “Do you really want to close?”. If there is no other main window left, the application will quit:void MyFrame::OnQuit(wxCommandEvent& WXUNUSED(event)){ Close( TRUE );}
MyFrame::OnAbout() will display a small window i.e. a Message box with some text in it. In this case, a typical “About” window with information about the program:void MyFrame::OnAbout(wxCommandEvent& WXUNUSED(event)){ wxMessageBox( “This is a wxWidgets&aposs Hello world sample”, “About Hello World”, wxOK | wxICON_INFORMATION );}
How events are processed
virtual functions, but they are all similar in form: they take a single wxEvent-derived argument, and have a void return type.BEGIN_EVENT_TABLE(MyFrame, wxFrame) EVT_MENU (wxID_EXIT, MyFrame::OnExit) EVT_MENU (DO_TEST, MyFrame::DoTest) EVT_SIZE ( MyFrame::OnSize) EVT_BUTTON (BUTTON1, MyFrame::OnButton1)END_EVENT_TABLE()
EVT_SIZE macro doesn&apost need a window identifier, since normally you are only interested in the current window&aposs size events. (In fact, you could intercept a particular window&aposs size event by using EVT_CUSTOM(wxEVT_SIZE, ID, func).)EVT_BUTTON macro demonstrates that the originating event need not come from the window class implementing the event table - if the event source is a button within a panel within a frame, this will still work, because event tables are searched up through the hierarchy of Windows. In this case, the button&aposs event table will be searched, then the parent panel&aposs, and then the frame&aposs.virtual. Indeed, the member functions should not be virtual as the event handler ignores that the functions are virtual, i.e. overriding a virtual member function in a derived class will not have any effect. These member functions take an event argument, and the class of the event differs according to the type of the event and the class of the originating window. For the size events, wxSizeEvent is used. For menu commands and most control commands (such as button presses), wxCommandEvent is used. When controls get more complicated, then specific event classes are used, such as wxTreeEvent for events from wxTreeCtrl windows.DECLARE_EVENT_TABLE macro in the class definition. For example:class MyFrame: public wxFrame { DECLARE_DYNAMIC_CLASS(MyFrame)public: … void OnExit(wxCommandEvent& event); void OnSize(wxSizeEvent& event);protected: int m_count; … DECLARE_EVENT_TABLE()};
virtual methods in normal C++, i.e. it is possible to alter the behavior of a class by overriding its event handling functions. In many cases, this works even for changing the behavior of native controls. For example, it is possible to filter out a number of key events sent by the system to a native text control by overriding wxTextCtrl and defining a handler for key events using EVT_KEY_DOWN. This would indeed prevent any key events from being sent to the native control - which might not be what is desired. In this case, the event handler function has to call Skip() so as to indicate that the searchfor the event handler should continue.virtual functions (i.e. wxTextCtrl::OnChar()), you should instead call Skip.void MyTextCtrl::OnChar(wxKeyEvent& event){ if ( isalpha( event.KeyCode() ) ) { // key code is within legal range. we call event.Skip() so the // event can be processed either in the base wxWindows class // or the native control. event.Skip(); } else { // illegal key hit. we don&apost call event.Skip() so the // event is not processed anywhere else. wxBell(); }}
ProcessEvent is as follows:
wxWindow, the ProcessEvent is recursively called on the window&aposs wxValidator. If this returns TRUE, the function exits.
SearchEventTable is called for this event handler. If this fails, the base class table is tried, and so on, until no more tables exist or an appropriate function is found, in which case the function exits.
wxWindow and the event is a wxCommandEvent, the ProcessEvent is recursively applied to the parent window&aposs event handler. If this returns TRUE, the function exits.
ProcessEvent is called on the wxApp object. wxCommandEvent will travel up the containment hierarchy from child to parent until an event handler is found that doesn&apost call event.Skip(). Events not derived from wxCommandEvent are sent to the window where they occurred and are then stopped.ProcessEvent to redirect the processing of events. This is done in the document/view framework, for example, to allow event handlers to be defined in the document or view. To test for command events (which are probably the only events you wish to redirect), you may use wxEvent::IsCommandEvent for efficiency, instead of using the slower run-time type system.
wxEvent
The event base class.
Leave a Reply