Fix problem with COMDLG_FILTERSPEC declaration with MinGW-w64 4.8.
[wxWidgets.git] / docs / doxygen / overviews / customwidgets.h
CommitLineData
64dd2650
FM
1/////////////////////////////////////////////////////////////////////////////
2// Name: customwidgets.h
3// Purpose: topic overview
4// Author: wxWidgets team
526954c5 5// Licence: wxWindows licence
64dd2650
FM
6/////////////////////////////////////////////////////////////////////////////
7
8/**
9
ce154616 10@page overview_customwidgets Creating a Custom Widget
64dd2650 11
ce154616 12@tableofcontents
64dd2650 13
ce154616
BP
14Typically combining the existing @ref group_class_ctrl controls in wxDialogs
15and wxFrames is sufficient to fullfill any GUI design. Using the wxWidgets
16standard controls makes your GUI looks native on all ports and is obviously
17easier and faster.
64dd2650 18
ce154616
BP
19However there are situations where you need to show some particular kind of
20data which is not suited to any existing control. In these cases rather than
21hacking an existing control for something it has not been conceived for, it's
22better to write a new widget.
64dd2650 23
64dd2650 24
64dd2650 25
ce154616 26@section overview_customwidgets_how Writing a Custom Widget
64dd2650
FM
27
28There are at least two very different ways to implement a new widget.
29
30The first is to build it upon wxWidgets existing classes, thus deriving it from
ce154616
BP
31wxControl or wxWindow. In this way you'll get a @b generic widget. This method
32has the advantage that writing a single implementation works on all ports; the
33disadvantage is that it the widget will look the same on all platforms, and
34thus it may not integrate well with the native look and feel.
64dd2650 35
ce154616
BP
36The second method is to build it directly upon the native toolkits of the
37platforms you want to support (e.g. GTK+, Carbon and GDI). In this way you'll
38get a @b native widget. This method in fact has the advantage of a native look
39and feel but requires different implementations and thus more work.
64dd2650
FM
40
41In both cases you'll want to better explore some hot topics like:
42- @ref overview_windowsizing
3e083d65 43- @ref overview_events_custom to implement your custom widget's events.
ce154616
BP
44
45You will probably need also to gain some familiarity with the wxWidgets
46sources, since you'll need to interface with some undocumented wxWidgets
47internal mechanisms.
64dd2650
FM
48
49
ce154616
BP
50
51@subsection overview_customwidgets_how_generic Writing a Generic Widget
64dd2650
FM
52
53Generic widgets are typically derived from wxControl or wxWindow.
54They are easy to write. The typical "template" is as follows:
55
56@code
64dd2650
FM
57enum MySpecialWidgetStyles
58{
59 SWS_LOOK_CRAZY = 1,
60 SWS_LOOK_SERIOUS = 2,
61 SWS_SHOW_BUTTON = 4,
62
63 SWS_DEFAULT_STYLE = (SWS_SHOW_BUTTON|SWS_LOOK_SERIOUS)
64};
65
66class MySpecialWidget : public wxControl
67{
68public:
69 MySpecialWidget() { Init(); }
70
71 MySpecialWidget(wxWindow *parent,
72 wxWindowID winid,
73 const wxString& label,
74 const wxPoint& pos = wxDefaultPosition,
75 const wxSize& size = wxDefaultSize,
76 long style = SWS_DEFAULT_STYLE,
77 const wxValidator& val = wxDefaultValidator,
78 const wxString& name = "MySpecialWidget")
79 {
80 Init();
81
82 Create(parent, winid, label, pos, size, style, val, name);
83 }
84
85 bool Create(wxWindow *parent,
86 wxWindowID winid,
87 const wxString& label,
88 const wxPoint& pos = wxDefaultPosition,
89 const wxSize& size = wxDefaultSize,
90 long style = SWS_DEFAULT_STYLE,
91 const wxValidator& val = wxDefaultValidator,
92 const wxString& name = wxCollapsiblePaneNameStr);
93
94 // accessors...
95
96protected:
97
98 void Init() {
99 // init widget's internals...
100 }
101
102 virtual wxSize DoGetBestSize() const {
103 // we need to calculate and return the best size of the widget...
104 }
105
106 void OnPaint(wxPaintEvent&) {
107 // draw the widget on a wxDC...
108 }
109
110private:
111 DECLARE_DYNAMIC_CLASS(MySpecialWidget)
112 DECLARE_EVENT_TABLE()
113};
114@endcode
115
116
117
ce154616 118@subsection overview_customwidgets_how_native Writing a Native Widget
64dd2650 119
ce154616
BP
120Writing a native widget is typically more difficult as it requires you to know
121the APIs of the platforms you want to support. See @ref page_port_nativedocs
122for links to the documentation manuals of the various toolkits.
64dd2650
FM
123
124The organization used by wxWidgets consists in:
125- declaring the common interface of the control in a generic header, using
126 the 'Base' postfix; e.g. MySpecialWidgetBase.
127 See for example the wxWidgets' @c "wx/button.h" file.
128
129- declaring the real widget class inheriting from the Base version in
130 platform-specific headers; see for example the wxWidgets' @c "wx/gtk/button.h" file.
131
d13b34d3 132- separating the different implementations in different source files, putting
64dd2650
FM
133 all common stuff in a separate source.
134 See for example the wxWidgets' @c "src/common/btncmn.cpp", @c "src/gtk/button.cpp"
135 and @c "src/msw/button.cpp" files.
136
137*/