Introduction to wxWidgets - The Code Project - Libraries

来源:百度文库 编辑:神马文学网 时间:2024/04/26 02:02:58
Download hello world demo project - 329 Kb
Download hello world demo project (alternate link)
Download eye care demo project - 387 Kb
Download eye care demo project (alternate link)
Introduction
wxWidgets formerly known as wxWindows is a framework fordeveloping cross-platform GUI applications in C++. Julian Smart startedthe framework in 1992 at the Artificial Intelligence ApplicationsInstitute, University of Edinburgh. In 1995, a port to Xt was releasedby Markus Holzem. In May 1997, the Windows and the GTK+ ports weremerged and put into a CVS repository.
What is wxWidgets
wxWidgets gives you a single, easy-to-use API for writing GUIapplications on multiple platforms. Link it with the appropriatelibrary for your platform (Windows/Unix/Mac) and compiler (almost anypopular C++ compiler), and your application will adopt the look andfeel appropriate to that platform. On top of the great GUIfunctionality, wxWindows gives you: online help, network programming,streams, clipboard and drag and drop, multithreading, image loading andsaving in a variety of popular formats, database support, HTML viewingand printing, and much more.
Who should use wxWidgets
wxWidgets is a framework very much similar to MFC, except fora few negative points of its own. Those MFC programmers who are awareof the growing number of Linux users and who want to write crossplatform GUI applications can use wxWidgets. With wxWidgets, it is veryeasy to use a framework based on C++ and it has a proven record of 13years. In fact, wxWidgets is very stable and is supported on:
Windows 3.1, Windows 95/98, Windows NT, Windows 2000/XP, Windows ME, Windows CE.
Linux and other UNIX platforms with GTK+.
UNIX with Motif or the free Motif clone Lesstif.
Mac OS.
Embedded platforms are being investigated. See thewxUniversal project.
An OS/2 port is in progress, and you can also compile wxWidgets for GTK+ or Motif on OS/2.
Why use wxWidgets
There are a number of options available for writing crossplatform GUI development, like: JAVA, Mono.NET, Qt, etc. Java hasfailed to prove itself as an efficient alternative. Qt is good butcommercial and nobody knows its future. Mono.NET seems to be good butis largely driven by Microsoft, it seems like a copy of the work doneby Microsoft and it has not yet proved itself as a successfulalternative. Also, people would not like to use an extra burden oflayer for highly efficient software. As wxWidgets does not use anymiddle layer and uses only the native controls available on theplatform, it gives a nice look and feel to the application.
It is very complete. There are many utility classes like : wxRegEx, wxFTP, wxSplashScreen, wxZipInputStream, etc.
It is still heavily developed, and has a lot of support from the open source community.
Many compilers and platforms are supported : Windows, Linux, Mac, Unix.
There‘s a lot of documentation available on the internet, forums, wxBook.
It‘s free for personal and commercial use, and is more flexible than the LGPL license.
Whenever possible, wxWindows uses the platform SDK. This means that a program compiled on Windows will have the look and feel of a Windows program, and when compiled on a Linux machine, it will have the look and feel of a Linux program.
Ease of learning, it has the same Event tables and similar API and classes like that of WINAPI and MFC.
A lot of sample is provided in the samples directory of the installation, which contains how to use the basic controls, multi threading, MDI, drag and drop, sockets, printing and lots more.
A lot of ready to use classes are available, like: 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.
A lot of add on libraries are available to make the programming task more easier:wxMozilla.
wxIndustrialControls.
wxCURL.
ToasterBox.
wxVTK.
wxDockIt.
wxIFM.
wxMathPlot.
wxTreeMultiCtrl.
wxAUI.
wxPropertyGrid.
wxSMTP.
wxResizeableControl.
wxOTL.
wxReportWriter.
wxHyperlinkCtrl.
wxSQLite.
wxIE.
wxCTB.
AWX.
wxSpellChecker.
wxArt2D.
wxImprola.
wxHTML.
wxStEdit.
wxLCDWindow.
mmwx.
LitWindow.
Keybinder.
wxBetterDialog.
wxBZipStream.
wxCrashReport.
wxHTTPServer.
wxRarInputStream.
wxSheet.
wxStreamMerger.
Main features
Multi threading.
Clipboard and drag and drop.
Network programming, like: wxSMTP, wxHTTP, wxFTP.
Image loading and saving in a variety of popular formats.
Streams (ZIP, Network, File, etc.), like: wxRarInputStream.
Database support, like: wxDao.
HTML viewing and printing, like: wxMozilla, wxIE.
XML based resource, multi language/Unicode support.
Default style themes available with the OS (e.g.: XP style themes).
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
CWinAppwxApp
CObjectwxObject
CCmdTargetwxEvtHandler
CCommandLineInfowxCmdLineParser
CMenuwxMenu,wMenuBar,wxMenuItem
CWaitCursorwxBusyCursor
CDataExchangewxValidator
Window Classes
MFC version wxWidgets version
CFrameWndwxFrame
CMDIFrameWndwxMDIParentFrame
CMDIChildWndwxMDIChildFrame
CSplitterWndwxSplitterWindow
CToolBarwxToolBar
CStatusBarwxStatusBar
CReBarwxCoolBar, but see contrib/src/fl andwxAUI,wxDockIt
CPropertyPagewxPanel
CPropertySheetwxNotebook,wxPropertySheetDialog
Dialog Classes
MFC version wxWidgets version
CDialogwxDialog
CColorDialogwxColourDialog
CFileDialogwxFileDialog
CFindReplaceDialogwxFindReplaceDialog
CFontDialogwxFontDialog
CPageSetupDialogwxPageSetupDialog
CPrintDialogwxPrintDialog
Control Classes
MFC version wxWidgets version
CAnimateCtrlwxMediaCtrl, wxAnimationCtrl
CButtonwxButton
CBitmapButtonwxBitmapButton
CComboBoxwxComboBox,wxChoice
CDateTimeCtrlwxDatePickerCtrl
CEditwxTextCtrl
CHotKeyCtrl None, but see Keybinder
CListBox, CDragListBoxwxListBox
CCheckListBoxwxCheckListBox
CListCtrlwxListCtrl,wxListView
CMonthCalCtrlwxCalendarCtrl
CProgressCtrlwxGauge
CReBarCtrl None, but see contrib/src/fl andwxAUI,wxDockIt
CRichEditCtrlwxTextCtrl
CScrollBarwxScrollBar
CSliderCtrlwxSlider
CSpinButtonCtrlwxSpinButton,wxSpinCtrl
CStaticwxStaticText,wxStaticLine,wxStaticBox,wxStaticBitmap
CStatusBarCtrlwxStatusBar
CTabCtrlwxTabCtrl
CToolBarCtrlwxToolBar
CToolTipCtrlwxToolTip
CTreeCtrlwxTreeCtrl
Graphics Classes
MFC version wxWidgets version
CBitmapwxBitmap,wxImage,wxIcon,wxCursor
CBrushwxBrush
CPenwxPen
CFontwxFont
CImageListwxImageList,wxIconBundle
CPalettewxPalette
CRgnwxRegion
CClientDCwxClientDC
CMetaFileDCwxMetaFileDC
CPaintDCwxPaintDC
CWindowDCwxWindowDC
CDCwxDC,wxMemoryDC
Data Structure Classes
MFC version wxWidgets version
CArray, CObArray, CPtrArraywxArray
CStringArraywxArrayString
CDWordArray, CByteArray, CUIntArraywxArrayInt
CList, CPtrList, CObListwxList
CStringListwxArrayString,wxStringList
CMapwxHashMap
CStringwxString
CPointwxPoint
CRectwxRect
CSizewxSize
CTimewxDateTime
CTimeSpanwxTimeSpan,wxDateSpan
COleVariantwxVariant
Internet Classes
MFC version wxWidgets version
CSocketwxSocket
CFtpConnectionwxFTP
CHttpConnectionwxHTTP
Document/View Classes
MFC version wxWidgets version
CDocumentwxDocument
CViewwxView
CDocTemplate, CSingleDocTemplate, CMultiDocTemplatewxDocTemplate
Drag and Drop Classes
MFC version wxWidgets version
COleDataSourcewxDataObject
COleDropSourcewxDropSource
COleDropTargetwxDropTarget
File Classes
MFC version wxWidgets version
CFilewxFile,wxFFile,wxTextFile
CMemFilewxMemoryInputStream,wxMemoryOutputStream
CSocketFilewxSocketInputStream,wxSocketOutputStream
CRecentFileListwxFileHistory
Multithreading Classes
MFC version wxWidgets version
CWinThreadwxThread
CCriticalSectionwxCriticalSection
CMutexwxMutex
CSemaphorewxSemaphore
Class hierarchy

Getting started
Starting with wxWidgets is really very easy. Just follow these steps:
Download thewxMSW-2.6.2-Setup.exe from the sourceforge.net website.
Run the setup‘s EXE and install it in say "C:\wxWidgets\" folder.
Add an environment variable $(WXWIN) to your system. The value will be the path of the folder where you have installed wxWidgets. Right click on the My Computer icon on your desktop.
Select Properties.
A dialog appears. Select the "Advanced" tab in that dialog.
Click "Environment Variables" button.
Another dialog appears. Click on the "New" button in the "System variables" box.
Add "WXWIN" in the "Variable name" text box and the folder path where you have installed wxWidgets in the "Variable value" text box.
Click the OK button till all the dialogs disappear.

Open "src\wxWindows.dsw" and "build\msw\wx.dsw" files in Visual studio and build the projects (libraries) in the solution for all the project configurations namely: Debug, Release, Debug DLL, Release DLL, Unicode Debug, Unicode Release, Unicode Debug DLL, Unicode Release DLL. These solution files are in the wxWidgets installation folder. This step will create some libraries needed by our application for linking. These files will be created in the "lib", "lib\vc_lib\" and "lib\vc_dll\" folders under your wxWidgets installation directory.
Now everything is ready to feel the power of wxWidgets.
Hello world
Hello world is a classic example to start learning any new language.It gives an overview of the language without going deeper into it.
Just create a new project "HelloWorld" in your Visual Studio editor of "Win32 Project" type:

In the Application Settings, choose the application type as "Windows Application" and in the Additional options check the "Empty project" checkbox and click the "Finish" button:

Now create a new file, by pressing "Ctrl+N", and select the type as "C++ File" in the "Visual C++" categories. Click Open:

Now type the following code into the file: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); }
Now save the file in the same project folder of "HelloWorld" as "Hello.cpp":

Now add the file to the project by right clicking on the "Source Files" >> "Add" >> "Add Existing Item…" in the Solution Explorer:

Select "Open":

Now, select the properties from the project menu:

Expand the "C/C++" node and select "General". In the "Additional Include Directories" add the following line for the "Debug" configuration: "$(WXWIN)\include";"$(WXWIN)\contrib\include";"$(WXWIN)\lib\mswd"
And for the "Release" configuration add the following line:
"$(WXWIN)\include";"$(WXWIN)\contrib\include";"$(WXWIN)\lib\msw"

In the Preprocessor tab, add the following line in the "Preprocessor Definitions" for the "Debug" configuration: WIN32;_DEBUG;_WINDOWS;__WINDOWS__;__WXMSW__;__WXDEBUG__;WXDEBUG=1; __WIN95__;__WIN32__;WINVER=0x0400;STRICT
And for the "Release" configuration, add the following line:
NDEBUG,WIN32,_WINDOWS,__WINDOWS__,__WXMSW__,__WIN95__,__WIN32__, WINVER=0x0400,STRICT

In the "Code Generation" select the "Runtime Library" for "Debug" configuration as: Multi-threaded Debug DLL (/MDd)
And for the "Releasse" configuration as:
Multi-threaded DLL (/MD)

Expand the "Linker" node and select "General". In the "Additional Library Directories", add the following line for "Debug" configuration: "$(WXWIN)\lib";"$(WXWIN)\contrib\lib";"$(WXWIN)\lib\vc_lib"
And for the "Release" configuration, add the following line:
"$(WXWIN)\lib";"$(WXWIN)\contrib\lib";"$(WXWIN)\lib\vc_lib"

In the "Input" tab add the following line in the "Additional Dependencies" for the "Debug" configuration: wxmsw26d_core.lib wxbase26d.lib wxtiffd.lib wxjpegd.lib wxpngd.lib wxzlibd.lib wxregexd.lib wxexpatd.lib winmm.lib comctl32.lib rpcrt4.lib wsock32.lib oleacc.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib
And for the "Release" configuration, add the following line: 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.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbccp32.lib

Press the "OK" button to save these changes and build the solution from the build menu:

Select the "Start" or "Start Without Debugging" from the "Debug" menu to execute the program:

Congratulations!
You have successfully created your first "Hello World" program with wxWidgets:

Install the Visual C++ 2005 Express by following the instructions given inManual Installation Instructions for Express Editions and then configure the platform SDK by following steps given inUsing 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.]
%program Files%\Microsoft Visual Studio 8\VC\VCProjectDefaultscorewin_express.vsprops
to set "_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE" as PreprocessorDefinitions.
An example corewin_express.vsprops file:

Then open the file $(WXWIN)\src\msw\main.cpp, search for the function ‘DllMain‘ and add the following lines:
#if _MSC_VER >= 1400 && _WINDLL#undef _WINDLL#endif
before the line:
#if defined(_WINDLL)
After you have configured your Visual Studio, the remaining stepsare the same, simply follow the instructions given above for VisualStudio .NET, and open the wx.dsw file and compile the librariesfor all the project configurations namely: Debug, Release, Debug DLL,Release DLL, Unicode Debug, Unicode Release, Unicode Debug DLL, UnicodeRelease 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:
#define wxUSE_NO_MANIFEST 1
Second, add these lines to your one of your source or header files to enable XP-Style common controls:
#if defined(__WXMSW__) && !defined(__WXWINCE__)#pragma comment(linker, "\"/manifestdependency:type=‘win32‘ name=‘Microsoft.Windows.Common-Controls‘ version=‘6.0.0.0‘processorArchitecture=‘X86‘ publicKeyToken=‘6595b64144ccf1df‘\"")#endifLinux
Due to the large number of pictures and high downloading time, thissection has been moved to a new article. Working with wxWidgets onLinux, can be foundhere.
Understanding the program
You have to include wxWidgets‘ header files, of course. This can be done on a file by file basis (such as #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
Practically, every app should define a new class derived from wxApp. By overriding wxApp‘s OnInit(), the program can be initialized, e.g. by creating a new main window.
class MyApp: public wxApp { virtual bool OnInit(); };
The main window is created by deriving a class from wxFrameand giving it a menu and a status bar in its constructor. Also, anyclass that wishes to respond to any "event" (such as mouse clicks ormessages from the menu or a button) must declare an event table usingthe 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()};
In order to be able to react to a menu command, it must be given a unique identifier such as a const or an enum.
enum{ID_Quit = 1,ID_About,};
We then proceed to actually implement an event table in which theevents are routed to their respective handler functions in the class MyFrame.There are predefined macros for routing all the common events, rangingfrom the selection of a list box entry to a resize event when a userresizes a window on the screen. If -1 is given as the ID, the givenhandler will be invoked for any event of the specified type, so thatyou could just add one entry in the event table for all menu commandsor all button commands etc. The origin of the event can still bedistinguished in the event handler as the (only) parameter in an eventhandler 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()
As in all programs, there must be a "main" function. UnderwxWidgets, main is implemented using this macro, which creates anapplication instance and starts the program:
IMPLEMENT_APP(MyApp)
As mentioned above, wxApp::OnInit() is called uponstartup and should be used to initialize the program, maybe for showinga "splash screen" and creating the main window (or several). The frameshould get a title bar text ("Hello World") and a position and start-upsize. 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;}
In the constructor of the main window (or later on) we create a menuwith two menu items as well as a status bar to be shown at the bottomof the main window. Both have to be "announced" to the frame with therespective calls:
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!" );}
Here are the actual event handlers. MyFrame::OnQuit() closes the main window by calling Close(). The parameter TRUEindicates 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. aMessage 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‘s Hello world sample","About Hello World", wxOK | wxICON_INFORMATION );}How events are processed
An event table is placed in an implementation file to tell wxWindowshow to map events to member functions. These member functions are not virtual functions, but they are all similar in form: they take a single wxEvent-derived argument, and have a void return type.
Here‘s an example of an event table:
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()
The first two entries map menu commands to two different member functions. The EVT_SIZEmacro doesn‘t need a window identifier, since normally you are onlyinterested in the current window‘s size events. (In fact, you couldintercept a particular window‘s size event by using EVT_CUSTOM(wxEVT_SIZE, ID, func).)
The EVT_BUTTON macro demonstrates that the originatingevent need not come from the window class implementing the event table- if the event source is a button within a panel within a frame, thiswill still work, because event tables are searched up through thehierarchy of Windows. In this case, the button‘s event table will besearched, then the parent panel‘s, and then the frame‘s.
As mentioned before, the member functions that handle events don‘t have to be virtual. Indeed, the member functions should not be virtual as the event handler ignores that the functions are virtual, i.e. overriding a virtualmember function in a derived class will not have any effect. Thesemember functions take an event argument, and the class of the eventdiffers according to the type of the event and the class of theoriginating 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 aswxTreeEvent for events fromwxTreeCtrl windows.
The event table in the implementation file must have a 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()};
When an event is received from the windowing system, wxWindows callswxEvtHandler::ProcessEvent on the first event handler object belonging to the window generating the event.
It may be noted that wxWindows‘ event processing system implements something very close to the virtualmethods in normal C++, i.e. it is possible to alter the behavior of aclass by overriding its event handling functions. In many cases, thisworks even for changing the behavior of native controls. For example,it is possible to filter out a number of key events sent by the systemto 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 nativecontrol - which might not be what is desired. In this case, the eventhandler function has to call Skip() so as to indicate that the search for the event handler should continue.
To summarize, instead of explicitly calling the base class version as you would do with C++ virtual functions (i.e. wxTextCtrl::OnChar()), you should instead callSkip.
In practice, this would look like the following if the derived text control only accepts ‘a‘ to ‘z‘ and ‘A‘ to ‘Z‘:
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‘t call event.Skip() so the// event is not processed anywhere else.wxBell();}}
The normal order of event table searching by ProcessEvent is as follows:
If the object is disabled (via a call towxEvtHandler::SetEvtHandlerEnabled) the function skips to step (6).
If the object is a wxWindow, the ProcessEvent is recursively called on the window‘swxValidator. 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.
The search is applied down the entire chain of event handlers (usually the chain has a length of one). If this succeeds, the function exits.
If the object is a wxWindow and the event is a wxCommandEvent, the ProcessEvent is recursively applied to the parent window‘s event handler. If this returns TRUE, the function exits.
Finally, ProcessEvent is called on the wxApp object.
Pay close attention to step 5: People often overlook or getconfused by this powerful feature of wxWindows event processing system.To put it a different way, events derived either directly or indirectlyfrom wxCommandEvent will travel up the containment hierarchy from child to parent until an event handler is found that doesn‘t call event.Skip(). Events not derived from wxCommandEvent are sent to the window where they occurred and are then stopped.
Finally, there is another additional complication (which, in fact,simplifies the life of wxWindows programmers significantly): whenpropagating the command events upwards to the parent window, the eventpropagation stops when it reaches the parent dialog, if any. This meansthat you don‘t risk to get unexpected events from the dialog controls(which might be left unprocessed by the dialog itself because itdoesn‘t care about them) when a modal dialog is popped up. The eventsdo propagate beyond the frames, however. The rationale for this choiceis that there are only a few frames in a typical application and theirparent-child relation are well understood by the programmer, while itmay be very difficult, if not impossible, to track down all the dialogswhich may be popped up in a complex program (remember that some arecreated automatically by wxWindows). If you need to specify a differentbehavior for some reason, you can useSetExtraStyle(wxWS_EX_BLOCK_EVENTS)explicitly to prevent the events from being propagated beyond the givenwindow 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 thathave a higher level of meaning and/or are generated by the windowitself, (button click, menu select, tree expand, etc.) are commandevents and are sent up to the parent to see if it is interested in theevent.
Note that your application may wish to override ProcessEventto redirect the processing of events. This is done in the document/viewframework, for example, to allow event handlers to be defined in thedocument or view. To test for command events (which are probably theonly events you wish to redirect), you may use wxEvent::IsCommandEvent for efficiency, instead of using the slower run-time type system.
As mentioned above, only the command events are recursively appliedto the parent‘s event handler. As this often causes confusion to theusers, here is a list of the system events that are not sent to the parent‘s event handler:
wxEvent The event base class.
wxActivateEvent A window or application activation event.
wxCloseEvent A close window or end session event.
wxEraseEvent An erase background event.
wxFocusEvent A window focus event.
wxKeyEvent A keypress event.
wxIdleEvent An idle event.
wxInitDialogEvent A dialog initialization event.
wxJoystickEvent A joystick event.
wxMenuEvent A menu event.
wxMouseEvent A mouse event.
wxMoveEvent A move event.
wxPaintEvent A paint event.
wxQueryLayoutInfoEvent Used to query layout information.
wxSizeEvent A size event.
wxScrollWinEvent A scroll event sent by a scrolled window (not a scroll bar).
wxSysColourChangedEvent A system color change event.
wxUpdateUIEvent A user interface update event.
In some cases, it might be desired by the programmer to get acertain number of system events in a parent window, for example, allthe key events sent to, but not used by, the native controls in adialog. In this case, a special event handler will have to be writtenthat will override ProcessEvent() in order to pass all the events (or any selection of them) to the parent window.
Additional points
You can create a "stdwx.h" file similar to the "stdafx.h" in MFC as a precompiled header. In the project settings in "C/C++" tab in the "Precompiled Headers" select "Automatically Generate (/YX)" for the "Create/Use Precompiled Header" and "stdwx.h" for the "Create/Use PCH Through File". The content of the "stdwx.h" file is as follows: #ifndef _stdwx_h_ #define _stdwx_h_ // SYSTEM INCLUDES #include #ifdef __BORLANDC__ #pragma hdrstop #endif #ifndef WX_PRECOMP #include "wx/wx.h" #endif // APPLICATION INCLUDES #endif
Also for the "Additional Include Directories" for the "Resources" tab in "General", for the Debug and Release configuration use: "$(WXWIN)\include";
The "setup.h" file in the wxWidgets installation has a number of switches. These switches can be used to enable/disable support for functionalities like ODBC, STL, etc. and will compile only those classes that will be used by you. They are simple define statements, whose value can be changed to 1 for enabling and 0 for disabling.
About EyeCare

Eye Care is basically inspired fromAlok Gupta‘sapplication. It‘s a small utility program that reminds you, after apreset time interval, to give rest to your eyes and wash them, when youare lost in the matrix of programming. It sits in the taskbar, andmonitors your eyes. Completely written in wxWidgets, it‘s anotherexample of how easy it is to program in wxWidgets. It also shows how toput an application icon in the taskbar, save application configuration,work with images, process window specific messages, use the wxCode components like wxHyperlinkCtrl, and other concepts.
wxVisualIntergration and wxVCExpressIntegration
wxVisualIntergration and wxVCExpressIntegration written by PriyankBolia, integrates wxWidgets support for Visual Studio .NET 2003 andVisual C++ 2005 Express by providing various wizards. ThewxVisualIntergration can be downloaded fromhere and the wxVCExpressIntegration can be downloaded fromhere.
Features
Provides project wizard for Windows, console and DLL based applications.
All types of project settings, like enable Unicode, static/dynamic link, using a few mouse clicks.
Additional properties to choose from, like: single instance, WinXP theme, wxFormBuilder support.
Saves a lot of precious time, and reduces the error due to manual setting.
Projects have debug memory management, pre compiled headers, default menus, toolbar, statusbar, etc.
Useful sites
wxwidgets HomePage.
wxCode Repository.
wxTutorial.
Drawing and Printing in C++ with wxWidgets.
wxWidgets Help integration with Visual Studio.NET.
wxGlade Flash Demo.
wxWidgets Forum.
wxBook Project.
Porting Windows MFC applications to Linux.
Some popular applications using wxWidgets
AOL Communicator
FileZilla
poedit
Audacity
AVG AntiVirus
CADToMill
Chandler
Chess Commander
CTSim
Display Doctor
EarthVision
Forte Agent
HelpBlocks
ImageLinks
Kirix Strata
Intuitive MX
iPodder
LDAP Explorer
ShareDaemon
Mahogany
MinGW Developer Studio
MojoWorld
Musik
StoryLines
TerraIM
TortoiseCVS
VietAnh
Voxel 3D
Vulcan
wxBlogger
xCHM
Zeemo
Zempt and moreapps /users
Conclusion
The wxWidgets license is essentially L-GPL (Library General PublicLicence), with the exception that the derived works in binary form maybe distributed on the user‘s own terms. This is a solution thatsatisfies those who wish to produce GPL‘ed software using wxWidgets,and also those producing proprietary software. As you have seen,wxWidgets is the fastest to learn, easiest to use and the best possiblesolution (no royalties, no patents) for Windows programmers in the evergrowing world of Linux and MAC.