| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137 |
- /////////////////////////////////////////////////////////////////////////////
- // Name: customwidgets.h
- // Purpose: topic overview
- // Author: wxWidgets team
- // Licence: wxWindows licence
- /////////////////////////////////////////////////////////////////////////////
- /**
- @page overview_customwidgets Creating a Custom Widget
- @tableofcontents
- Typically combining the existing @ref group_class_ctrl controls in wxDialogs
- and wxFrames is sufficient to fullfill any GUI design. Using the wxWidgets
- standard controls makes your GUI looks native on all ports and is obviously
- easier and faster.
- However there are situations where you need to show some particular kind of
- data which is not suited to any existing control. In these cases rather than
- hacking an existing control for something it has not been conceived for, it's
- better to write a new widget.
- @section overview_customwidgets_how Writing a Custom Widget
- There are at least two very different ways to implement a new widget.
- The first is to build it upon wxWidgets existing classes, thus deriving it from
- wxControl or wxWindow. In this way you'll get a @b generic widget. This method
- has the advantage that writing a single implementation works on all ports; the
- disadvantage is that it the widget will look the same on all platforms, and
- thus it may not integrate well with the native look and feel.
- The second method is to build it directly upon the native toolkits of the
- platforms you want to support (e.g. GTK+, Carbon and GDI). In this way you'll
- get a @b native widget. This method in fact has the advantage of a native look
- and feel but requires different implementations and thus more work.
- In both cases you'll want to better explore some hot topics like:
- - @ref overview_windowsizing
- - @ref overview_events_custom to implement your custom widget's events.
- You will probably need also to gain some familiarity with the wxWidgets
- sources, since you'll need to interface with some undocumented wxWidgets
- internal mechanisms.
- @subsection overview_customwidgets_how_generic Writing a Generic Widget
- Generic widgets are typically derived from wxControl or wxWindow.
- They are easy to write. The typical "template" is as follows:
- @code
- enum MySpecialWidgetStyles
- {
- SWS_LOOK_CRAZY = 1,
- SWS_LOOK_SERIOUS = 2,
- SWS_SHOW_BUTTON = 4,
- SWS_DEFAULT_STYLE = (SWS_SHOW_BUTTON|SWS_LOOK_SERIOUS)
- };
- class MySpecialWidget : public wxControl
- {
- public:
- MySpecialWidget() { Init(); }
- MySpecialWidget(wxWindow *parent,
- wxWindowID winid,
- const wxString& label,
- const wxPoint& pos = wxDefaultPosition,
- const wxSize& size = wxDefaultSize,
- long style = SWS_DEFAULT_STYLE,
- const wxValidator& val = wxDefaultValidator,
- const wxString& name = "MySpecialWidget")
- {
- Init();
- Create(parent, winid, label, pos, size, style, val, name);
- }
- bool Create(wxWindow *parent,
- wxWindowID winid,
- const wxString& label,
- const wxPoint& pos = wxDefaultPosition,
- const wxSize& size = wxDefaultSize,
- long style = SWS_DEFAULT_STYLE,
- const wxValidator& val = wxDefaultValidator,
- const wxString& name = wxCollapsiblePaneNameStr);
- // accessors...
- protected:
- void Init() {
- // init widget's internals...
- }
- virtual wxSize DoGetBestSize() const {
- // we need to calculate and return the best size of the widget...
- }
- void OnPaint(wxPaintEvent&) {
- // draw the widget on a wxDC...
- }
- private:
- DECLARE_DYNAMIC_CLASS(MySpecialWidget)
- DECLARE_EVENT_TABLE()
- };
- @endcode
- @subsection overview_customwidgets_how_native Writing a Native Widget
- Writing a native widget is typically more difficult as it requires you to know
- the APIs of the platforms you want to support. See @ref page_port_nativedocs
- for links to the documentation manuals of the various toolkits.
- The organization used by wxWidgets consists in:
- - declaring the common interface of the control in a generic header, using
- the 'Base' postfix; e.g. MySpecialWidgetBase.
- See for example the wxWidgets' @c "wx/button.h" file.
- - declaring the real widget class inheriting from the Base version in
- platform-specific headers; see for example the wxWidgets' @c "wx/gtk/button.h" file.
- - separating the different implementations in different source files, putting
- all common stuff in a separate source.
- See for example the wxWidgets' @c "src/common/btncmn.cpp", @c "src/gtk/button.cpp"
- and @c "src/msw/button.cpp" files.
- */
|