X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/15f7744be816d8e9b6659a0e92dbe48efc9fb2ef..6b5a8c7d986d03935d4060c96c4884d5a2bf608c:/docs/latex/wx/txrc.tex diff --git a/docs/latex/wx/txrc.tex b/docs/latex/wx/txrc.tex index dc065629b3..bc3408e257 100644 --- a/docs/latex/wx/txrc.tex +++ b/docs/latex/wx/txrc.tex @@ -36,7 +36,7 @@ These are the typical steps for using XRC files in your application. \begin{itemize}\itemsep=0pt \item Include the appropriate headers: normally "wx/xrc/xmlres.h" will suffice; \item If you are going to use \helpref{XRS files}{binaryresourcefiles}, install -wxFileSystem ZIP handler first with {\tt wxFileSystem::AddHandler(new wxZipFSHandler);} +wxFileSystem archive handler first with {\tt wxFileSystem::AddHandler(new wxArchiveFSHandler);} \item call {\tt wxXmlResource::Get()->InitAllHandlers()} from your wxApp::OnInit function, and then call {\tt wxXmlResource::Get()->Load("myfile.xrc")} to load the resource file; \item to create a dialog from a resource, create it using the default constructor, and then @@ -97,14 +97,14 @@ For example: XRS file is essentially a renamed ZIP archive which means that you can manipulate it with standard ZIP tools. Note that if you are using XRS files, you have -to initialize the \helpref{wxFileSystem}{wxfilesystem} ZIP handler first! It is a simple +to initialize the \helpref{wxFileSystem}{wxfilesystem} archive handler first! It is a simple thing to do: \begin{verbatim} #include - #include + #include ... - wxFileSystem::AddHandler(new wxZipFSHandler); + wxFileSystem::AddHandler(new wxArchiveFSHandler); \end{verbatim} \subsection{Using embedded resources}\label{embeddedresource} @@ -507,7 +507,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. wxSIMPLE_BORDER, wxSUNKEN_BORDER, 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.