removed useless spaces
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@51911 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -7,9 +7,9 @@
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
/*!
|
||||
|
||||
|
||||
@page xrc_overview XML-based resource system overview
|
||||
|
||||
|
||||
Classes: #wxXmlResource, #wxXmlResourceHandler
|
||||
The XML-based resource system, known as XRC, allows user interface elements such as
|
||||
dialogs, menu bars and toolbars, to be stored in text files and loaded into
|
||||
@@ -17,8 +17,8 @@
|
||||
code (the former makes it possible to store all resources in a single file and the latter
|
||||
is useful when you want to embed the resources into the executable).
|
||||
There are several advantages to using XRC resources.
|
||||
|
||||
|
||||
|
||||
|
||||
Recompiling and linking an application is not necessary if the
|
||||
resources change.
|
||||
If you use a dialog designer that generates C++ code, it can be hard
|
||||
@@ -30,8 +30,8 @@
|
||||
The XRC format is a wxWidgets standard,
|
||||
and can be generated or postprocessed by any program that understands it. As it is based
|
||||
on the XML standard, existing XML editors can be used for simple editing purposes.
|
||||
|
||||
|
||||
|
||||
|
||||
XRC was written by Vaclav Slavik.
|
||||
@ref xrcconcepts_overview
|
||||
@ref binaryresourcefiles_overview
|
||||
@@ -41,13 +41,13 @@
|
||||
@ref xrcfileformat_overview
|
||||
@ref xrccppheader_overview
|
||||
@ref newresourcehandlers_overview
|
||||
|
||||
|
||||
|
||||
|
||||
@section xrcconcepts XRC concepts
|
||||
|
||||
|
||||
These are the typical steps for using XRC files in your application.
|
||||
|
||||
|
||||
|
||||
|
||||
Include the appropriate headers: normally "wx/xrc/xmlres.h" will suffice;
|
||||
If you are going to use @ref binaryresourcefiles_overview, install
|
||||
wxFileSystem archive handler first with @c wxFileSystem::AddHandler(new wxArchiveFSHandler);
|
||||
@@ -57,11 +57,11 @@
|
||||
load it using for example @c wxXmlResource::Get()-LoadDialog(dlg, this, "dlg1");
|
||||
set up event tables as usual but use the @c XRCID(str) macro to translate from XRC string names
|
||||
to a suitable integer identifier, for example @c EVT_MENU(XRCID("quit"), MyFrame::OnQuit).
|
||||
|
||||
|
||||
|
||||
|
||||
To create an XRC file, you can use one of the following methods.
|
||||
|
||||
|
||||
|
||||
|
||||
Create the file by hand;
|
||||
use #wxDesigner, a commercial dialog designer/RAD tool;
|
||||
use #DialogBlocks, a commercial dialog editor;
|
||||
@@ -69,8 +69,8 @@
|
||||
dialog editor that you can find in the @c wxPython/tools subdirectory of the wxWidgets
|
||||
CVS archive;
|
||||
use #wxGlade, a GUI designer written in wxPython. At the moment it can generate Python, C++ and XRC;
|
||||
|
||||
|
||||
|
||||
|
||||
A complete list of third-party tools that write to XRC can be found at #www.wxwidgets.org/lnk_tool.htm.
|
||||
It is highly recommended that you use a resource editing tool, since it's fiddly writing
|
||||
XRC files by hand.
|
||||
@@ -78,58 +78,58 @@
|
||||
You can pass an XRC file (XML-based text resource file)
|
||||
or a @ref binaryresourcefiles_overview (extension ZIP or XRS) containing other XRC.
|
||||
You can also use @ref embeddedresource_overview
|
||||
|
||||
|
||||
@section binaryresourcefiles Using binary resource files
|
||||
|
||||
|
||||
To compile binary resource files, use the command-line wxrc utility. It takes one or more file parameters
|
||||
(the input XRC files) and the following switches and options:
|
||||
|
||||
|
||||
|
||||
|
||||
-h (--help): show a help message
|
||||
-v (--verbose): show verbose logging information
|
||||
-c (--cpp-code): write C++ source rather than a XRS file
|
||||
-e (--extra-cpp-code): if used together with -c, generates C++ header file
|
||||
containing class definitions for the windows defined by the XRC file (see special subsection)
|
||||
containing class definitions for the windows defined by the XRC file (see special subsection)
|
||||
-u (--uncompressed): do not compress XML files (C++ only)
|
||||
-g (--gettext): output underscore-wrapped strings that poEdit or gettext can scan. Outputs to stdout, or a file if -o is used
|
||||
-n (--function) name: specify C++ function name (use with -c)
|
||||
-o (--output) filename: specify the output file, such as resource.xrs or resource.cpp
|
||||
-l (--list-of-handlers) filename: output a list of necessary handlers to this file
|
||||
|
||||
|
||||
|
||||
|
||||
For example:
|
||||
|
||||
|
||||
@code
|
||||
% wxrc resource.xrc
|
||||
% wxrc resource.xrc -o resource.xrs
|
||||
% wxrc resource.xrc -v -c -o resource.cpp
|
||||
@endcode
|
||||
|
||||
|
||||
@b Note
|
||||
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 #wxFileSystem archive handler first! It is a simple
|
||||
thing to do:
|
||||
|
||||
|
||||
@code
|
||||
#include wx/filesys.h
|
||||
#include wx/fs_arc.h
|
||||
...
|
||||
wxFileSystem::AddHandler(new wxArchiveFSHandler);
|
||||
@endcode
|
||||
|
||||
|
||||
|
||||
|
||||
@section embeddedresource Using embedded resources
|
||||
|
||||
|
||||
It is sometimes useful to embed resources in the executable itself instead
|
||||
of loading an external file (e.g. when your app is small and consists only of one
|
||||
exe file). XRC provides means to convert resources into regular C++ file that
|
||||
can be compiled and included in the executable.
|
||||
can be compiled and included in the executable.
|
||||
Use the @c -c switch to
|
||||
@c wxrc utility to produce C++ file with embedded resources. This file will
|
||||
contain a function called @e InitXmlResource (unless you override this with
|
||||
a command line switch). Use it to load the resource:
|
||||
|
||||
|
||||
@code
|
||||
extern void InitXmlResource(); // defined in generated file
|
||||
...
|
||||
@@ -137,124 +137,124 @@
|
||||
InitXmlResource();
|
||||
...
|
||||
@endcode
|
||||
|
||||
|
||||
|
||||
|
||||
@section xrccppsample XRC C++ sample
|
||||
|
||||
|
||||
This is the C++ source file (xrcdemo.cpp) for the XRC sample.
|
||||
|
||||
|
||||
@code
|
||||
#include "wx/wx.h"
|
||||
#include "wx/image.h"
|
||||
#include "wx/xrc/xmlres.h"
|
||||
|
||||
|
||||
// the application icon
|
||||
#if defined(__WXGTK__) || defined(__WXMOTIF__) || defined(__WXMAC__)
|
||||
#include "rc/appicon.xpm"
|
||||
#endif
|
||||
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// private classes
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
|
||||
// Define a new application type, each program should derive a class from wxApp
|
||||
class MyApp : public wxApp
|
||||
{
|
||||
public:
|
||||
// override base class virtuals
|
||||
// ----------------------------
|
||||
|
||||
|
||||
// this one is called on application startup and is a good place for the app
|
||||
// initialization (doing it here and not in the ctor allows to have an error
|
||||
// return: if OnInit() returns @false, the application terminates)
|
||||
virtual bool OnInit();
|
||||
};
|
||||
|
||||
|
||||
// Define a new frame type: this is going to be our main frame
|
||||
class MyFrame : public wxFrame
|
||||
{
|
||||
public:
|
||||
// ctor(s)
|
||||
MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size);
|
||||
|
||||
|
||||
// event handlers (these functions should _not_ be virtual)
|
||||
void OnQuit(wxCommandEvent& event);
|
||||
void OnAbout(wxCommandEvent& event);
|
||||
void OnDlg1(wxCommandEvent& event);
|
||||
void OnDlg2(wxCommandEvent& event);
|
||||
|
||||
|
||||
private:
|
||||
// any class wishing to process wxWidgets events must use this macro
|
||||
DECLARE_EVENT_TABLE()
|
||||
};
|
||||
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// event tables and other macros for wxWidgets
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
|
||||
BEGIN_EVENT_TABLE(MyFrame, wxFrame)
|
||||
EVT_MENU(XRCID("menu_quit"), MyFrame::OnQuit)
|
||||
EVT_MENU(XRCID("menu_about"), MyFrame::OnAbout)
|
||||
EVT_MENU(XRCID("menu_dlg1"), MyFrame::OnDlg1)
|
||||
EVT_MENU(XRCID("menu_dlg2"), MyFrame::OnDlg2)
|
||||
END_EVENT_TABLE()
|
||||
|
||||
|
||||
IMPLEMENT_APP(MyApp)
|
||||
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// the application class
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
|
||||
// 'Main program' equivalent: the program execution "starts" here
|
||||
bool MyApp::OnInit()
|
||||
{
|
||||
wxImage::AddHandler(new wxGIFHandler);
|
||||
wxXmlResource::Get()-InitAllHandlers();
|
||||
wxXmlResource::Get()-Load("rc/resource.xrc");
|
||||
|
||||
|
||||
MyFrame *frame = new MyFrame("XML resources demo",
|
||||
wxPoint(50, 50), wxSize(450, 340));
|
||||
frame-Show(@true);
|
||||
return @true;
|
||||
}
|
||||
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// main frame
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
|
||||
// frame constructor
|
||||
MyFrame::MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size)
|
||||
: wxFrame((wxFrame *)@NULL, -1, title, pos, size)
|
||||
{
|
||||
SetIcon(wxICON(appicon));
|
||||
|
||||
|
||||
SetMenuBar(wxXmlResource::Get()-LoadMenuBar("mainmenu"));
|
||||
SetToolBar(wxXmlResource::Get()-LoadToolBar(this, "toolbar"));
|
||||
}
|
||||
|
||||
|
||||
// event handlers
|
||||
void MyFrame::OnQuit(wxCommandEvent& WXUNUSED(event))
|
||||
{
|
||||
// @true is to force the frame to close
|
||||
Close(@true);
|
||||
}
|
||||
|
||||
|
||||
void MyFrame::OnAbout(wxCommandEvent& WXUNUSED(event))
|
||||
{
|
||||
wxString msg;
|
||||
msg.Printf( _T("This is the about dialog of XML resources demo.\n")
|
||||
_T("Welcome to %s"), wxVERSION_STRING);
|
||||
|
||||
|
||||
wxMessageBox(msg, "About XML resources demo", wxOK | wxICON_INFORMATION, this);
|
||||
}
|
||||
|
||||
|
||||
void MyFrame::OnDlg1(wxCommandEvent& WXUNUSED(event))
|
||||
{
|
||||
wxDialog dlg;
|
||||
wxXmlResource::Get()-LoadDialog(, this, "dlg1");
|
||||
dlg.ShowModal();
|
||||
}
|
||||
|
||||
|
||||
void MyFrame::OnDlg2(wxCommandEvent& WXUNUSED(event))
|
||||
{
|
||||
wxDialog dlg;
|
||||
@@ -262,12 +262,12 @@
|
||||
dlg.ShowModal();
|
||||
}
|
||||
@endcode
|
||||
|
||||
|
||||
|
||||
|
||||
@section xrcsample XRC resource file sample
|
||||
|
||||
|
||||
This is the XML file (resource.xrc) for the XRC sample.
|
||||
|
||||
|
||||
@code
|
||||
?xml version="1.0"?
|
||||
resource version="2.3.0.1"
|
||||
@@ -424,15 +424,15 @@
|
||||
/object
|
||||
/resource
|
||||
@endcode
|
||||
|
||||
|
||||
|
||||
|
||||
@section xrcfileformat XRC file format
|
||||
|
||||
|
||||
Please see Technical Note 14 (docs/tech/tn0014.txt) in your wxWidgets
|
||||
distribution.
|
||||
|
||||
|
||||
@section xrccppheader C++ header file generation
|
||||
|
||||
|
||||
Using the @c -e switch together with @c -c, a C++ header file is written
|
||||
containing class definitions for the GUI windows defined in the XRC file.
|
||||
This code generation can make it easier to use XRC and automate program
|
||||
@@ -441,13 +441,13 @@
|
||||
programmer from dealing with most of the XRC specifics (e.g. @c XRCCTRL).
|
||||
For each top level window defined in the XRC file a C++ class definition is
|
||||
generated, containing as class members the named widgets of the window.
|
||||
A default constructor for each class is also generated. Inside the constructor
|
||||
all XRC loading is done and all class members representing widgets are initialized.
|
||||
A default constructor for each class is also generated. Inside the constructor
|
||||
all XRC loading is done and all class members representing widgets are initialized.
|
||||
A simple example will help understand how the scheme works. Suppose you have
|
||||
a XRC file defining a top level window @c TestWnd_Base, which subclasses @c wxFrame (any
|
||||
a XRC file defining a top level window @c TestWnd_Base, which subclasses @c wxFrame (any
|
||||
other class like @c wxDialog will do also), and has subwidgets @c wxTextCtrl A and @c wxButton B.
|
||||
The XRC file and corresponding class definition in the header file will be something like:
|
||||
|
||||
|
||||
@code
|
||||
?xml version="1.0"?
|
||||
resource version="2.3.0.1"
|
||||
@@ -469,13 +469,13 @@
|
||||
/object
|
||||
/object
|
||||
/resource
|
||||
|
||||
|
||||
|
||||
|
||||
class TestWnd_Base : public wxFrame {
|
||||
protected:
|
||||
wxTextCtrl* A;
|
||||
wxButton* B;
|
||||
|
||||
|
||||
private:
|
||||
void InitWidgetsFromXRC(){
|
||||
wxXmlResource::Get()-LoadObject(this,@NULL,"TestWnd","wxFrame");
|
||||
@@ -488,110 +488,110 @@
|
||||
}
|
||||
};
|
||||
@endcode
|
||||
|
||||
|
||||
The generated window class can be used as basis for the full window class. The
|
||||
class members which represent widgets may be accessed by name instead of using
|
||||
@c XRCCTRL every time you wish to reference them (note that they are @c protected class members),
|
||||
@c XRCCTRL every time you wish to reference them (note that they are @c protected class members),
|
||||
though you must still use @c XRCID to refer to widget IDs in the event
|
||||
table.
|
||||
table.
|
||||
Example:
|
||||
|
||||
|
||||
@code
|
||||
#include "resource.h"
|
||||
|
||||
|
||||
class TestWnd : public TestWnd_Base {
|
||||
public:
|
||||
TestWnd(){
|
||||
// A, B already initialised at this point
|
||||
A-SetValue("Updated in TestWnd::TestWnd");
|
||||
B-SetValue("Nice :)");
|
||||
}
|
||||
void OnBPressed(wxEvent& event){
|
||||
Close();
|
||||
}
|
||||
DECLARE_EVENT_TABLE();
|
||||
public:
|
||||
TestWnd(){
|
||||
// A, B already initialised at this point
|
||||
A-SetValue("Updated in TestWnd::TestWnd");
|
||||
B-SetValue("Nice :)");
|
||||
}
|
||||
void OnBPressed(wxEvent& event){
|
||||
Close();
|
||||
}
|
||||
DECLARE_EVENT_TABLE();
|
||||
};
|
||||
|
||||
|
||||
BEGIN_EVENT_TABLE(TestWnd,TestWnd_Base)
|
||||
EVT_BUTTON(XRCID("B"),TestWnd::OnBPressed)
|
||||
END_EVENT_TABLE()
|
||||
@endcode
|
||||
|
||||
|
||||
It is also possible to access the wxSizerItem of a sizer that is part of
|
||||
a resource. This can be done using @c XRCSIZERITEM as shown. The
|
||||
resource file can have something like this for a sizer item.
|
||||
|
||||
|
||||
@code
|
||||
object class="spacer" name="area"
|
||||
size400, 300/size
|
||||
/object
|
||||
@endcode
|
||||
|
||||
|
||||
The code can then access the sizer item by using @c XRCSIZERITEM and
|
||||
@c XRCID together.
|
||||
|
||||
|
||||
@code
|
||||
wxSizerItem* item = XRCSIZERITEM(*this, "area");
|
||||
@endcode
|
||||
|
||||
|
||||
|
||||
|
||||
@section newresourcehandlers Adding new resource handlers
|
||||
|
||||
|
||||
Adding a new resource handler is pretty easy.
|
||||
Typically, to add an handler for the @c MyControl class, you'll want to create
|
||||
the @c xh_mycontrol.h @c xh_mycontrol.cpp files.
|
||||
The header needs to contains the @c MyControlXmlHandler class definition:
|
||||
|
||||
|
||||
@code
|
||||
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)
|
||||
};
|
||||
@endcode
|
||||
|
||||
|
||||
The implementation of your custom XML handler will typically look as:
|
||||
|
||||
|
||||
@code
|
||||
// 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,
|
||||
// bool MyControl::Create(wxWindow *parent, int id,
|
||||
// const wxBitmap , const wxPoint ,
|
||||
// const wxBitmap , const wxPoint ,
|
||||
// const wxString , const wxFont ,
|
||||
@@ -623,12 +623,12 @@
|
||||
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
|
||||
@@ -636,11 +636,11 @@
|
||||
return IsOfClass(node, wxT("MyControl"));
|
||||
}
|
||||
@endcode
|
||||
|
||||
|
||||
You may want to check the #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.
|
||||
|
||||
|
||||
*/
|
||||
|
||||
|
||||
|
||||
|
||||
|
Reference in New Issue
Block a user