Introduction
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.
What is wxWidgets
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.
Who should use wxWidgets
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:
- 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 the wxUniversal 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 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.
- 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 |
|---|---|
| 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
Starting with wxWidgets is really very easy. Just follow these steps:
-
Download the wxMSW-2.8.10-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:
/*
* 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:
wxmsw28d_core.lib wxbase28d.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:
wxmsw28_core.lib wxbase28.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:

Visual C++ 2005 Express
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:
%program Files%\Microsoft Visual Studio 8\VC\VCProjectDefaults\corewin_express.vsprops
to set "_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE" as PreprocessorDefinitions.
An example corewin_express.vsprops file:
<VisualStudioPropertySheet ProjectType="Visual C++" Version="8.00" Name="Core Windows Libraries">
<Tool Name="VCLinkerTool" AdditionalDependencies="kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib" />
<Tool Name="VCCLCompilerTool" PreprocessorDefinitions="_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE" />
</VisualStudioPropertySheet>
Then open the file $(WXWIN)\src\msw\main.cpp, search for the function 'DllMain' and add the following lines:
#undef _WINDLL
#endif
before the line:
#if defined(_WINDLL)
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:
#define wxUSE_NO_MANIFEST 1
Second, add these lines to your one of your source or header files to enable XP-Style common controls:
#pragma comment(linker, "\"/manifestdependency:type='win32'
name='Microsoft.Windows.Common-Controls' version='6.0.0.0'
processorArchitecture='X86' publicKeyToken='6595b64144ccf1df'\"")
#endif
| Attachment | Size |
|---|---|
| HelloWorld.zip | 329.89 KB |
| EyeCare.zip | 387.29 KB |
