removed section on porting from 1.x. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@13766 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
		
			
				
	
	
		
			336 lines
		
	
	
		
			16 KiB
		
	
	
	
		
			TeX
		
	
	
	
	
	
			
		
		
	
	
			336 lines
		
	
	
		
			16 KiB
		
	
	
	
		
			TeX
		
	
	
	
	
	
\section{The wxWindows resource system}\label{resourceformats}
 | 
						|
 | 
						|
wxWindows has an optional {\it resource file} facility,
 | 
						|
which allows separation of dialog, menu, bitmap and icon specifications
 | 
						|
from the application code.
 | 
						|
 | 
						|
{\bf NOTE:} this format is now deprecated in favour of the XML-based \helpref{XRC resource system}{xrcoverview}.
 | 
						|
However it is still available if wxUSE\_RESOURCES is enabled.
 | 
						|
 | 
						|
The format is similar in principle to the Windows resource file (whose ASCII form is
 | 
						|
suffixed .RC and whose binary form is suffixed .RES). The wxWindows resource
 | 
						|
file is currently ASCII-only, suffixed .WXR. Note that under Windows,
 | 
						|
the .WXR file does not {\it replace} the native Windows resource file,
 | 
						|
it merely supplements it. There is no existing native resource format in X
 | 
						|
(except for the defaults file, which has limited expressive power).
 | 
						|
 | 
						|
For details of functions for manipulating resource files and loading
 | 
						|
user interface elements, see \helpref{wxWindows resource functions}{resourcefuncs}.
 | 
						|
 | 
						|
You can use Dialog Editor to create resource files. Unfortunately neither
 | 
						|
Dialog Editor nor the .WXR format currently cover all wxWindows controls;
 | 
						|
some are missing, such as wxSpinCtrl, wxSpinButton, wxListCtrl, wxTreeCtrl and others.
 | 
						|
 | 
						|
Note that in later versions of wxWindows, this resource format will be replaced
 | 
						|
by XML specifications that can also include sizers.
 | 
						|
 | 
						|
\subsection{The format of a .WXR file}
 | 
						|
 | 
						|
A wxWindows resource file may look a little odd at first. It is C++
 | 
						|
compatible, comprising mostly of static string variable declarations with
 | 
						|
wxExpr syntax within the string.
 | 
						|
 | 
						|
Here's a sample .WXR file:
 | 
						|
 | 
						|
\begin{verbatim}
 | 
						|
/*
 | 
						|
 * wxWindows Resource File
 | 
						|
 *
 | 
						|
 */
 | 
						|
 | 
						|
#include "noname.ids"
 | 
						|
 | 
						|
static char *my_resource = "bitmap(name = 'my_resource',\
 | 
						|
  bitmap = ['myproject', wxBITMAP_TYPE_BMP_RESOURCE, 'WINDOWS'],\
 | 
						|
  bitmap = ['myproject.xpm', wxBITMAP_TYPE_XPM, 'X']).";
 | 
						|
 | 
						|
static char *menuBar11 = "menu(name = 'menuBar11',\
 | 
						|
  menu = \
 | 
						|
  [\
 | 
						|
    ['&File', 1, '', \
 | 
						|
      ['&Open File', 2, 'Open a file'],\
 | 
						|
      ['&Save File', 3, 'Save a file'],\
 | 
						|
      [],\
 | 
						|
      ['E&xit', 4, 'Exit program']\
 | 
						|
    ],\
 | 
						|
    ['&Help', 5, '', \
 | 
						|
      ['&About', 6, 'About this program']\
 | 
						|
    ]\
 | 
						|
  ]).";
 | 
						|
 | 
						|
static char *project_resource = "icon(name = 'project_resource',\
 | 
						|
  icon = ['project', wxBITMAP_TYPE_ICO_RESOURCE, 'WINDOWS'],\
 | 
						|
  icon = ['project_data', wxBITMAP_TYPE_XBM, 'X']).";
 | 
						|
 | 
						|
static char *panel3 = "dialog(name = 'panel3',\
 | 
						|
  style = '',\
 | 
						|
  title = 'untitled',\
 | 
						|
  button_font = [14, 'wxSWISS', 'wxNORMAL', 'wxBOLD', 0],\
 | 
						|
  label_font = [10, 'wxSWISS', 'wxNORMAL', 'wxNORMAL', 0],\
 | 
						|
  x = 0, y = 37, width = 292, height = 164,\
 | 
						|
  control = [1000, wxButton, 'OK', '', 'button5', 23, 34, -1, -1, 'my_resource'],\
 | 
						|
  control = [1001, wxStaticText, 'A Label', '', 'message7', 166, 61, -1, -1, 'my_resource'],\
 | 
						|
  control = [1002, wxTextCtrl, 'Text', 'wxTE_MULTITEXT', 'text8', 24, 110, -1, -1]).";
 | 
						|
\end{verbatim}
 | 
						|
 | 
						|
As you can see, C++-style comments are allowed, and apparently include files
 | 
						|
are supported too: but this is a special case, where the included file
 | 
						|
is a file of defines shared by the C++ application code and resource file
 | 
						|
to relate identifiers (such as FILE\_OPEN) to integers.
 | 
						|
 | 
						|
Each {\it resource object} is of standard \helpref{wxExpr}{wxexpr} syntax, that is,
 | 
						|
an object name such as {\bf dialog} or {\bf icon}, then an open
 | 
						|
parenthesis, a list of comma-delimited attribute/value pairs, a closing
 | 
						|
parenthesis, and a full stop. Backslashes are required to escape newlines,
 | 
						|
for the benefit of C++ syntax. If double quotation marks are used to
 | 
						|
delimit strings, they need to be escaped with backslash within a C++ string
 | 
						|
(so it is easier to use single quotation marks instead).
 | 
						|
 | 
						|
\normalbox{{\it A note on string syntax:} A string that begins with
 | 
						|
an alphabetic character, and contains only alphanumeric characters,
 | 
						|
hyphens and underscores, need not be quoted at all. Single quotes and double
 | 
						|
quotes may be used to delimit more complex strings. In fact, single-quoted
 | 
						|
and no-quoted strings are actually called {\it words}, but are treated
 | 
						|
as strings for the purpose of the resource system.}
 | 
						|
 | 
						|
A resource file like this is typically included in the application main file,
 | 
						|
as if it were a normal C++ file. This eliminates the need for a separate
 | 
						|
resource file to be distributed alongside the executable. However, the
 | 
						|
resource file can be dynamically loaded if desired (useful for non-C++
 | 
						|
languages such as Python).
 | 
						|
 | 
						|
Once included, the resources need to be `parsed' (interpreted), because
 | 
						|
so far the data is just a number of static string variables. The function\rtfsp
 | 
						|
{\bf ::wxResourceParseData} is called early on in initialization of the application
 | 
						|
(usually in {\bf wxApp::OnInit}) with a variable as argument. This may need to be
 | 
						|
called a number of times, one for each variable. However, more than one
 | 
						|
resource `object' can be stored in one string variable at a time, so you can
 | 
						|
get all your resources into one variable if you want to.
 | 
						|
 | 
						|
{\bf ::wxResourceParseData} parses the contents of the resource, ready for use
 | 
						|
by functions such as {\bf ::wxResourceCreateBitmap} and {\bf wxPanel::LoadFromResource}.
 | 
						|
 | 
						|
If a wxWindows resource object (such as a bitmap resource) refers to a
 | 
						|
C++ data structure, such as static XPM data, a further call ({\bf ::wxResourceRegisterBitmapData}) needs
 | 
						|
to be made on initialization to tell
 | 
						|
wxWindows about this data. The wxWindows resource object will refer to a
 | 
						|
string identifier, such as `project\_data' in the example file above.
 | 
						|
This identifier will be looked up in a table to get the C++ static data
 | 
						|
to use for the bitmap or icon.
 | 
						|
 | 
						|
In the C++ fragment below, the WXR resource file is included,
 | 
						|
and appropriate resource initialization is carried out in {\bf OnInit}.
 | 
						|
Note that at this stage, no actual wxWindows dialogs, menus, bitmaps or
 | 
						|
icons are created; their `templates' are merely being set up for later
 | 
						|
use.
 | 
						|
 | 
						|
\begin{verbatim}
 | 
						|
/*
 | 
						|
 * File:    project.cpp
 | 
						|
 * Purpose: main application module
 | 
						|
 */
 | 
						|
 | 
						|
#include "wx/wx.h"
 | 
						|
#include "project.h"
 | 
						|
 | 
						|
// Includes the dialog, menu etc. resources
 | 
						|
#include "project.wxr"
 | 
						|
 | 
						|
// Includes XPM data
 | 
						|
#include "project.xpm"
 | 
						|
 | 
						|
IMPLEMENT_APP(AppClass)
 | 
						|
 | 
						|
// Called to initialize the program
 | 
						|
bool AppClass::OnInit()
 | 
						|
{
 | 
						|
  wxResourceRegisterBitmapData("project_data", project_bits, project_width, project_height);
 | 
						|
 | 
						|
  wxResourceParseData(menuBar11);
 | 
						|
  wxResourceParseData(my_resource);
 | 
						|
  wxResourceParseData(project_resource);
 | 
						|
  wxResourceParseData(panel3);
 | 
						|
  ...
 | 
						|
 | 
						|
  return TRUE;
 | 
						|
}
 | 
						|
\end{verbatim}
 | 
						|
 | 
						|
The following code shows a dialog:
 | 
						|
 | 
						|
\begin{verbatim}
 | 
						|
  // project.wxr contains dialog1
 | 
						|
  MyDialog *dialog = new MyDialog;
 | 
						|
  if (dialog->LoadFromResource(this, "dialog1"))
 | 
						|
  {
 | 
						|
    wxTextCtrl *text = (wxTextCtrl *)wxFindWindowByName("text3", dialog);
 | 
						|
    if (text)
 | 
						|
      text->SetValue("wxWindows resource demo");
 | 
						|
    dialog->ShowModal();
 | 
						|
  }
 | 
						|
  dialog->Destroy();
 | 
						|
\end{verbatim}
 | 
						|
 | 
						|
Please see also the resource sample.
 | 
						|
 | 
						|
\subsection{Dialog resource format}
 | 
						|
 | 
						|
A dialog resource object may be used for either panels or dialog boxes, and
 | 
						|
consists of the following attributes. In the following, a {\it font specification}\rtfsp
 | 
						|
is a list consisting of point size, family, style, weight, underlined, optional facename.
 | 
						|
 | 
						|
\begin{twocollist}\itemsep=0pt
 | 
						|
\twocolitemruled{Attribute}{Value}
 | 
						|
\twocolitem{id}{The integer identifier of the resource.}
 | 
						|
\twocolitem{name}{The name of the resource.}
 | 
						|
\twocolitem{style}{Optional dialog box or panel window style.}
 | 
						|
\twocolitem{title}{The title of the dialog box (unused if a panel).}.
 | 
						|
\twocolitem{modal}{Whether modal: 1 if modal, 0 if modeless, absent if a panel resource.}
 | 
						|
\twocolitem{use\_dialog\_units}{If 1, use dialog units (dependent on the dialog font size) for control sizes and positions.}
 | 
						|
\twocolitem{use\_system\_defaults}{If 1, override colours and fonts to use system settings instead.}
 | 
						|
\twocolitem{button\_font}{The font used for control buttons: a list comprising point size (integer),
 | 
						|
family (string), font style (string), font weight (string) and underlining (0 or 1).}
 | 
						|
\twocolitem{label\_font}{The font used for control labels: a list comprising point size (integer),
 | 
						|
family (string), font style (string), font weight (string) and underlining (0 or 1). Now obsolete; use button\_font instead.}
 | 
						|
\twocolitem{x}{The x position of the dialog or panel.}
 | 
						|
\twocolitem{y}{The y position of the dialog or panel.}
 | 
						|
\twocolitem{width}{The width of the dialog or panel.}
 | 
						|
\twocolitem{height}{The height of the dialog or panel.}
 | 
						|
\twocolitem{background\_colour}{The background colour of the dialog or panel.}
 | 
						|
\twocolitem{label\_colour}{The default label colour for the children of the dialog or panel. Now obsolete; use button\_colour instead.}
 | 
						|
\twocolitem{button\_colour}{The default button text colour for the children of the dialog or panel.}
 | 
						|
\end{twocollist}
 | 
						|
 | 
						|
Then comes zero or more attributes named `control' for each control
 | 
						|
(panel item) on the dialog or panel. The value is a list of further
 | 
						|
elements. In the table below, the names in the first column correspond to
 | 
						|
the first element of the value list, and the second column details the
 | 
						|
remaining elements of the list. Note that titles for some controls are obsolete
 | 
						|
(they don't have titles), but the syntax is retained for backward compatibility.
 | 
						|
 | 
						|
\begin{twocollist}\itemsep=0pt
 | 
						|
\twocolitemruled{Control}{Values}
 | 
						|
\twocolitem{wxButton}{id (integer), title (string), window style (string), name (string), x, y, width, height, button bitmap resource (optional string), button font spec}
 | 
						|
\twocolitem{wxCheckBox}{id (integer), title (string), window style (string), name (string), x, y, width, height, default value (optional integer, 1 or 0), label font spec}
 | 
						|
\twocolitem{wxChoice}{id (integer), title (string), window style (string), name (string), x, y, width, height, values (optional list of strings), label font spec, button font spec}
 | 
						|
\twocolitem{wxComboBox}{id (integer), title (string), window style (string), name (string), x, y, width, height, default text value, values (optional list of strings), label font spec, button font spec}
 | 
						|
\twocolitem{wxGauge}{id (integer), title (string), window style (string), name (string), x, y, width, height, value (optional integer), range (optional integer), label font spec, button font spec}
 | 
						|
\twocolitem{wxStaticBox}{id (integer), title (string), window style (string), name (string), x, y, width, height, label font spec}
 | 
						|
\twocolitem{wxListBox}{id (integer), title (string), window style (string), name (string), x, y, width, height, values (optional list of strings), multiple (optional string, wxSINGLE or wxMULTIPLE),
 | 
						|
label font spec, button font spec}
 | 
						|
\twocolitem{wxStaticText}{id (integer), title (string), window style (string), name (string), x, y, width, height, message bitmap resource (optional string), label font spec}
 | 
						|
\twocolitem{wxRadioBox}{id (integer), title (string), window style (string), name (string), x, y, width, height, values (optional list of strings), number of rows or cols,
 | 
						|
label font spec, button font spec}
 | 
						|
\twocolitem{wxRadioButton}{id (integer), title (string), window style (string), name (string), x, y, width, height, default value (optional integer, 1 or 0), label font spec}
 | 
						|
\twocolitem{wxScrollBar}{id (integer), title (string), window style (string), name (string), x, y, width, height, value (optional integer),
 | 
						|
page length (optional integer), object length (optional integer), view length (optional integer)}
 | 
						|
\twocolitem{wxSlider}{id (integer), title (string), window style (string), name (string), x, y, width, height, value (optional integer), minimum (optional integer), maximum (optional integer),
 | 
						|
label font spec, button font spec}
 | 
						|
\twocolitem{wxTextCtrl}{id (integer), title (string), window style (string), name (string), x, y, width, height, default value (optional string),
 | 
						|
label font spec, button font spec}
 | 
						|
\end{twocollist}
 | 
						|
 | 
						|
\subsection{Menubar resource format}
 | 
						|
 | 
						|
A menubar resource object consists of the following attributes.
 | 
						|
 | 
						|
\begin{twocollist}\itemsep=0pt
 | 
						|
\twocolitemruled{Attribute}{Value}
 | 
						|
\twocolitem{name}{The name of the menubar resource.}
 | 
						|
\twocolitem{menu}{A list containing all the menus, as detailed below.}
 | 
						|
\end{twocollist}
 | 
						|
 | 
						|
The value of the {\bf menu} attribute is a list of menu item specifications, where each menu
 | 
						|
item specification is itself a list comprising:
 | 
						|
 | 
						|
\begin{itemize}\itemsep=0pt
 | 
						|
\item title (a string)
 | 
						|
\item menu item identifier (a string or non-zero integer, see below)
 | 
						|
\item help string (optional)
 | 
						|
\item 0 or 1 for the `checkable' parameter (optional)
 | 
						|
\item optionally, further menu item specifications if this item is a pulldown menu.
 | 
						|
\end{itemize}
 | 
						|
 | 
						|
If the menu item specification is the empty list ([]), this is interpreted as a menu separator.
 | 
						|
 | 
						|
If further (optional) information is associated with each menu item in a future release of wxWindows,
 | 
						|
it will be placed after the help string and before the optional pulldown menu specifications.
 | 
						|
 | 
						|
Note that the menu item identifier must be an integer if the resource is being
 | 
						|
included as C++ code and then parsed on initialisation. Unfortunately,\rtfsp
 | 
						|
\#define substitution is not performed inside strings, and
 | 
						|
therefore the program cannot know the mapping. However, if the .WXR file
 | 
						|
is being loaded dynamically, wxWindows will attempt to replace string
 | 
						|
identifiers with \#defined integers, because it is able to parse
 | 
						|
the included \#defines.
 | 
						|
 | 
						|
\subsection{Bitmap resource format}
 | 
						|
 | 
						|
A bitmap resource object consists of a name attribute, and one or more {\bf bitmap} attributes.
 | 
						|
There can be more than one of these to allow specification of bitmaps that are optimum for the
 | 
						|
platform and display.
 | 
						|
 | 
						|
\begin{itemize}\itemsep=0pt
 | 
						|
\item Bitmap name or filename.
 | 
						|
\item Type of bitmap; for example, wxBITMAP\_TYPE\_BMP\_RESOURCE. See class reference under {\bf wxBitmap} for
 | 
						|
a full list).
 | 
						|
\item Platform this bitmap is valid for; one of WINDOWS, X, MAC and ANY.
 | 
						|
\item Number of colours (optional).
 | 
						|
\item X resolution (optional).
 | 
						|
\item Y resolution (optional).
 | 
						|
\end{itemize}
 | 
						|
 | 
						|
\subsection{Icon resource format}
 | 
						|
 | 
						|
An icon resource object consists of a name attribute, and one or more {\bf icon} attributes.
 | 
						|
There can be more than one of these to allow specification of icons that are optimum for the
 | 
						|
platform and display.
 | 
						|
 | 
						|
\begin{itemize}\itemsep=0pt
 | 
						|
\item Icon name or filename.
 | 
						|
\item Type of icon; for example, wxBITMAP\_TYPE\_ICO\_RESOURCE. See class reference under {\bf wxBitmap} for
 | 
						|
a full list).
 | 
						|
\item Platform this bitmap is valid for; one of WINDOWS, X, MAC and ANY.
 | 
						|
\item Number of colours (optional).
 | 
						|
\item X resolution (optional).
 | 
						|
\item Y resolution (optional).
 | 
						|
\end{itemize}
 | 
						|
 | 
						|
\subsection{Resource format design issues}
 | 
						|
 | 
						|
The .WXR file format is a recent addition and subject to change.
 | 
						|
The use of an ASCII resource file format may seem rather inefficient, but this
 | 
						|
choice has a number of advantages:
 | 
						|
 | 
						|
\begin{itemize}\itemsep=0pt
 | 
						|
\item Since it is C++ compatible, it can be included into an application's source code,
 | 
						|
eliminating the problems associated with distributing a separate resource file
 | 
						|
with the executable. However, it can also be loaded dynamically from a file, which will be required
 | 
						|
for non-C++ programs that use wxWindows.
 | 
						|
\item No extra binary file format and separate converter need be maintained for the wxWindows project
 | 
						|
(although others are welcome to add the equivalent of the Windows `rc' resource
 | 
						|
parser and a binary format).
 | 
						|
\item It would be difficult to append a binary resource component onto an executable
 | 
						|
in a portable way.
 | 
						|
\item The file format is essentially the \helpref{wxExpr}{wxexpr} object format, for which
 | 
						|
a parser already exists, so parsing is easy. For those programs that use wxExpr
 | 
						|
anyway, the size overhead of the parser is minimal.
 | 
						|
\end{itemize}
 | 
						|
 | 
						|
The disadvantages of the approach include:
 | 
						|
 | 
						|
\begin{itemize}\itemsep=0pt
 | 
						|
\item Parsing adds a small execution overhead to program initialization.
 | 
						|
\item Under 16-bit Windows especially, global data is at a premium.
 | 
						|
Using a .RC resource table for some wxWindows resource data may be a partial solution,
 | 
						|
although .RC strings are limited to 255 characters.
 | 
						|
\item Without a resource preprocessor, it is not possible to substitute integers
 | 
						|
for identifiers (so menu identifiers have to be written as integers in the resource
 | 
						|
object, in addition to providing \#defines for application code convenience).
 | 
						|
\end{itemize}
 | 
						|
 | 
						|
\subsection{Compiling the resource system}
 | 
						|
 | 
						|
To enable the resource system, set {\bf wxUSE\_WX\_RESOURCES} to 1 in setup.h.
 | 
						|
 |