X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/aa0ff209bc82d0f7c48263bb28609769d09f051b..0bd2681966523df88ad5cf8e505b532843e58d74:/docs/latex/wx/txrc.tex diff --git a/docs/latex/wx/txrc.tex b/docs/latex/wx/txrc.tex index f970dc0c52..01558bba48 100644 --- a/docs/latex/wx/txrc.tex +++ b/docs/latex/wx/txrc.tex @@ -55,7 +55,6 @@ To create an XRC file, you can use one of the following methods. dialog editor that you can find in the {\tt wxPython/tools} subdirectory of the wxWidgets CVS archive; \item use \urlref{wxGlade}{http://wxglade.sf.net}, a GUI designer written in wxPython. At the moment it can generate Python, C++ and XRC; -\item convert WIN32 RC files to XRC with the tool in {\tt contrib/utils/convertrc}. \end{itemize} A complete list of third-party tools that write to XRC can be found at \urlref{www.wxwidgets.org/lnk\_tool.htm}{http://www.wxwidgets.org/lnk\_tool.htm}. @@ -321,7 +320,7 @@ This is the XML file (resource.xrc) for the XRC sample. - + wxALIGN_CENTER @@ -380,7 +379,7 @@ This is the XML file (resource.xrc) for the XRC sample. 200,200d - + Hello, this is an ordinary multiline\n textctrl.... @@ -507,7 +506,112 @@ END_EVENT_TABLE() \end{verbatim} + + \subsection{Adding new resource handlers}\label{newresourcehandlers} -Coming soon. +Adding a new resource handler is pretty easy. +Typically, to add an handler for the {\tt MyControl} class, you'll want to create +the {\tt xh\_mycontrol.h} {\tt xh\_mycontrol.cpp} files. + +The header needs to contains the {\tt MyControlXmlHandler} class definition: + +\begin{verbatim} +class MyControlXmlHandler : public wxXmlResourceHandler +{ +public: + + // Constructor. + MyControlXmlHandler(); + + // Creates the control and returns a pointer to it. + virtual wxObject *DoCreateResource(); + + // Returns true if we know how to create a control for the given node. + virtual bool CanHandle(wxXmlNode *node); + + // Register with wxWidgets' dynamic class subsystem. + DECLARE_DYNAMIC_CLASS(MyControlXmlHandler) +}; +\end{verbatim} + +The implementation of your custom XML handler will typically look as: + +\begin{verbatim} +// Register with wxWidgets' dynamic class subsystem. +IMPLEMENT_DYNAMIC_CLASS(MyControlXmlHandler, wxXmlResourceHandler) + +MyControlXmlHandler::MyControlXmlHandler() +{ + // this call adds support for all wxWindows class styles + // (e.g. wxBORDER_SIMPLE, wxBORDER_SUNKEN, wxWS_EX_* etc etc) + AddWindowStyles(); + + // if MyControl class supports e.g. MYCONTROL_DEFAULT_STYLE + // you should use: + // XRC_ADD_STYLE(MYCONTROL_DEFAULT_STYLE); +} + +wxObject *MyControlXmlHandler::DoCreateResource() +{ + // the following macro will init a pointer named "control" + // with a new instance of the MyControl class, but will NOT + // Create() it! + XRC_MAKE_INSTANCE(control, MyControl) + + // this is the point where you'll typically need to do the most + // important changes: here the control is created and initialized. + // You'll want to use the wxXmlResourceHandler's getters to + // do most of your work. + // If e.g. the MyControl::Create function looks like: + // + // bool MyControl::Create(wxWindow *parent, int id, + // const wxBitmap &first, const wxPoint &posFirst, + // const wxBitmap &second, const wxPoint &posSecond, + // const wxString &theTitle, const wxFont &titleFont, + // const wxPoint &pos, const wxSize &size, + // long style = MYCONTROL_DEFAULT_STYLE, + // const wxString &name = wxT("MyControl")); + // + // then the XRC for your component should look like: + // + // + // first.xpm + // text.xpm + // 3,3 + // 4,4 + // a title + // + // + // + // + // + // + // and the code to read your custom tags from the XRC file is just: + control->Create(m_parentAsWindow, GetID(), + GetBitmap(wxT("first-bitmap")), + GetPosition(wxT("first-pos")), + GetBitmap(wxT("second-bitmap")), + GetPosition(wxT("second-pos")), + GetText(wxT("the-title")), + GetFont(wxT("title-font")), + GetPosition(), GetSize(), GetStyle(), GetName()); + + SetupWindow(control); + + return control; +} + +bool MyControlXmlHandler::CanHandle(wxXmlNode *node) +{ + // this function tells XRC system that this handler can parse + // the tags + return IsOfClass(node, wxT("MyControl")); +} +\end{verbatim} + +You may want to check the \helpref{wxXmlResourceHandler}{wxxmlresourcehandler} documentation +to see how many built-in getters it contains. It's very easy to retrieve also complex structures +out of XRC files using them.