git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@10320 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
		
			
				
	
	
		
			333 lines
		
	
	
		
			16 KiB
		
	
	
	
		
			TeX
		
	
	
	
	
	
			
		
		
	
	
			333 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.
 | |
| 
 | |
| It 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.
 | |
| 
 |