1998-07-18 17:57:52 -04:00
|
|
|
\chapter{Topic overviews}
|
|
|
|
\setheader{{\it CHAPTER \thechapter}}{}{}{}{}{{\it CHAPTER \thechapter}}%
|
|
|
|
\setfooter{\thepage}{}{}{}{}{\thepage}
|
|
|
|
|
|
|
|
The following sections describe particular topics.
|
|
|
|
|
|
|
|
\section{OGL overview}\label{ogloverview}
|
|
|
|
|
|
|
|
\helpref{wxShapeCanvas}{wxshapecanvas}, derived from {\bf wxCanvas}, is the drawing area
|
|
|
|
for a number of \helpref{wxShape}{wxshape} instances. Everything drawn on a
|
|
|
|
wxShapeCanvas is derived from wxShape, which provides virtual
|
|
|
|
member functions for redrawing, creating and destroying
|
|
|
|
resize/selection `handles', movement and erasing behaviour, mouse
|
|
|
|
click behaviour, calculating the bounding box of the shape, linking
|
|
|
|
nodes with arcs, and so on.
|
|
|
|
|
|
|
|
The way a client application copes with `damage' to the canvas is to
|
|
|
|
erase (white out) anything should no longer be displayed, redraw the shape,
|
|
|
|
and then redraw everything on the canvas to repair any damage. If quick edit
|
|
|
|
mode is on for the canvas, the complete should be omitted by OGL and the
|
|
|
|
application.
|
|
|
|
|
|
|
|
Selection handles (called control points in the code) are implemented as
|
|
|
|
wxRectangleShapes.
|
|
|
|
|
|
|
|
Events are passed to shapes by the canvas in a high-level form, for example {\bf OnLeftClick},
|
|
|
|
{\bf OnBeginDragLeft}, {\bf OnDragLeft}, {\bf OnEndDragLeft}. The canvas decides
|
|
|
|
what is a click and what is a drag, whether it is on a shape or the canvas itself,
|
|
|
|
and (by interrogating the shape) which attachment point the click is associated with.
|
|
|
|
|
|
|
|
In order to provide event-handling flexibility, each shapes has an `event handler' associated with it,
|
|
|
|
which by default is the shape itself (all shapes derive from wxShapeEvtHandler).
|
|
|
|
An application can modify the event-handling behaviour simply by plugging a new
|
|
|
|
event handler into the shape. This can avoid the need for multiple inheritance when
|
|
|
|
new properties and behaviour are required for a number of different shape classes: instead
|
|
|
|
of overriding each class, one new event handler class can be defined and used for all
|
|
|
|
existing shape classes.
|
|
|
|
|
|
|
|
A range of shapes have been predefined in the library, including rectangles, ellipses,
|
|
|
|
polygons. A client application can derive from these shapes and/or derive entirely
|
|
|
|
new shapes from wxShape.
|
|
|
|
|
|
|
|
Instances of a class called \helpref{wxDiagram}{wxdiagram} organise collections of
|
|
|
|
shapes, providing default file input and output behaviour.
|
|
|
|
|
|
|
|
\section{wxDividedShape overview}\label{dividedshapeoverview}
|
|
|
|
|
|
|
|
Classes: \helpref{wxDividedShape}{wxdividedshape}
|
|
|
|
|
|
|
|
A wxDividedShape is a rectangle with a number of vertical divisions. Each
|
|
|
|
division may have its text formatted with independent characteristics, and
|
|
|
|
the size of each division relative to the whole image may be specified.
|
|
|
|
|
|
|
|
Once a wxDividedShape has been created, the user may move the divisions with the
|
|
|
|
mouse. By pressing Ctrl while right-clicking, the region attributes can be edited.
|
|
|
|
|
|
|
|
Here are examples of creating wxDividedShape objects:
|
|
|
|
|
|
|
|
{\small
|
|
|
|
\begin{verbatim}
|
|
|
|
/*
|
|
|
|
* Divided rectangle with 3 regions
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
|
|
|
|
wxDividedShape *dividedRect = new wxDividedShape(50, 60);
|
|
|
|
|
|
|
|
wxShapeRegion *region = new wxShapeRegion;
|
|
|
|
region->SetProportions(0.0, 0.25);
|
|
|
|
dividedRect->AddRegion(region);
|
|
|
|
|
|
|
|
region = new wxShapeRegion;
|
|
|
|
region->SetProportions(0.0, 0.5);
|
|
|
|
dividedRect->AddRegion(region);
|
|
|
|
|
|
|
|
region = new wxShapeRegion;
|
|
|
|
region->SetProportions(0.0, 0.25);
|
|
|
|
dividedRect->AddRegion(region);
|
|
|
|
|
|
|
|
dividedRect->SetSize(50, 60); // Allow it to calculate region sizes
|
|
|
|
dividedRect->SetPen(wxBLACK_PEN);
|
|
|
|
dividedRect->SetBrush(wxWHITE_BRUSH);
|
|
|
|
dividedRect->Show(TRUE);
|
|
|
|
dividedRect->NameRegions();
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Divided rectangle with 3 regions, rounded
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
|
|
|
|
wxDividedShape *dividedRect3 = new wxDividedShape(50, 60);
|
|
|
|
dividedRect3->SetCornerRadius(-0.4);
|
|
|
|
|
|
|
|
region = new wxShapeRegion;
|
|
|
|
region->SetProportions(0.0, 0.25);
|
|
|
|
dividedRect3->AddRegion(region);
|
|
|
|
|
|
|
|
region = new wxShapeRegion;
|
|
|
|
region->SetProportions(0.0, 0.5);
|
|
|
|
dividedRect3->AddRegion(region);
|
|
|
|
|
|
|
|
region = new wxShapeRegion;
|
|
|
|
region->SetProportions(0.0, 0.25);
|
|
|
|
dividedRect3->AddRegion(region);
|
|
|
|
|
|
|
|
dividedRect3->SetSize(50, 60); // Allow it to calculate region sizes
|
|
|
|
dividedRect3->SetPen(wxBLACK_PEN);
|
|
|
|
dividedRect3->SetBrush(wxWHITE_BRUSH);
|
|
|
|
dividedRect3->Show(TRUE);
|
|
|
|
dividedRect3->NameRegions();
|
|
|
|
\end{verbatim}
|
|
|
|
}
|
|
|
|
|
|
|
|
\section{wxCompositeShape overview}\label{compositeshapeoverview}
|
|
|
|
|
1998-09-08 10:38:35 -04:00
|
|
|
Classes: \helpref{wxCompositeShape}{wxcompositeshape}, \helpref{wxOGLConstraint}{wxoglconstraint}
|
1998-07-18 17:57:52 -04:00
|
|
|
|
|
|
|
The wxCompositeShape allows fairly complex shapes to be created, and maintains
|
|
|
|
a set of constraints which specify the layout and proportions of child shapes.
|
|
|
|
|
|
|
|
Add child shapes to a wxCompositeShape using \helpref{AddChild}{wxcompositeshapeaddchild}, and
|
|
|
|
add constraints using \helpref{AddConstraint}{wxcompositeshapeaddconstraint}.
|
|
|
|
|
|
|
|
After children and shapes have been added, call \helpref{Recompute}{wxcompositeshaperecompute} which
|
|
|
|
will return TRUE is the constraints could be satisfied, FALSE otherwise. If
|
|
|
|
constraints have been correctly and consistently specified, this call will succeed.
|
|
|
|
|
|
|
|
If there is more than one child, constraints must be specified: OGL cannot calculate
|
|
|
|
the size and position of children otherwise. Don't assume that children will simply
|
|
|
|
move relative to the parent without the use of constraints.
|
|
|
|
|
|
|
|
To specify a constraint, you need three things:
|
|
|
|
|
|
|
|
\begin{enumerate}\itemsep=0pt
|
|
|
|
\item a constraint type, such as gyCONSTRAINT\_CENTRED\_VERTICALLY;
|
|
|
|
\item a reference shape, with respect to which other shapes are going to be positioned - the\rtfsp
|
|
|
|
{\it constraining} shape;
|
|
|
|
\item a list of one or more shapes to be constrained: the {\it constrained} shapes.
|
|
|
|
\end{enumerate}
|
|
|
|
|
|
|
|
The constraining shape can be either the parent of the constrained shapes, or a sibling. The
|
|
|
|
constrained shapes must all be siblings of each other.
|
|
|
|
|
1998-09-08 10:38:35 -04:00
|
|
|
For an exhaustive list and description of the available constraint types, see the \helpref{wxOGLConstraint constructor}{wxoglconstraintconstr}.
|
1998-07-18 17:57:52 -04:00
|
|
|
Note that most constraints operate in one dimension only (vertically or horizontally), so you will
|
|
|
|
usually need to specify constraints in pairs.
|
|
|
|
|
|
|
|
You can set the spacing between constraining and constrained shapes by
|
1998-09-08 10:38:35 -04:00
|
|
|
calling \helpref{wxOGLConstraint::SetSpacing}{wxoglconstraintsetspacing}.
|
1998-07-18 17:57:52 -04:00
|
|
|
|
|
|
|
Finally, a wxCompositeShape can have {\it divisions}, which are special child shapes of class
|
|
|
|
wxDivisionShape (not to be confused with wxDividedShape). The purpose of this is to allow
|
|
|
|
the composite to be divided into user-adjustable regions (divisions) into which other shapes
|
|
|
|
can be dropped dynamically, given suitable application code. Divisons allow the child
|
|
|
|
shapes to have an identity of their own - they can be manipulated independently of their container -
|
|
|
|
but to behave as if they are contained with the division, moving with the parent shape.
|
|
|
|
Divisions boundaries can themselves be moved using the mouse.
|
|
|
|
|
|
|
|
To create an initial division, call \helpref{wxCompositeShape::MakeContainer}{wxcompositeshapemakecontainer}.
|
|
|
|
Make further divisions by calling \helpref{wxDivisionShape::Divide}{wxdivisionshapedivide}.
|
|
|
|
|