\item {\bf centreY:} represents the vertical centre point of the window
\end{itemize}
-Most constraints are initially set to have the relationship wxUnconstrained,
+The constraints are initially set to have the relationship wxUnconstrained,
which means that their values should be calculated by looking at known constraints.
-The exceptions are {\it width} and {\it height}, which are set to wxAsIs to
-ensure that if the user does not specify a constraint, the existing
-width and height will be used, to be compatible with panel items which often
-have take a default size. If the constraint is wxAsIs, the dimension will
-not be changed.
-
-To call the \helpref{wxWindow::Layout}{wxwindowlayout} function which evaluates
-constraints, you can either call wxWindow::SetAutoLayout to tell
-default OnSize handlers to call Layout, or override OnSize and call Layout yourself.
+To calculate the position and size of the control, the layout algorithm needs to
+know exactly 4 constraints (as it has 4 numbers to calculate from them), so you
+should always set exactly 4 of the constraints from the above table.
+
+If you want the controls height or width to have the default value, you may use
+a special value for the constraint: wxAsIs. If the constraint is wxAsIs, the
+dimension will not be changed which is useful for the dialog controls which
+often have the default size (e.g. the buttons whose size is determined by their
+label).
+
+The constrains calculation is done in \helpref{wxWindow::Layout}{wxwindowlayout}
+function which evaluates constraints. To call it you can either call
+wxWindow::SetAutoLayout to tell default OnSize handlers to call Layout
+automatically whenever the window size changes, or override OnSize and call Layout
+yourself.
\subsection{Constraint layout: more detail}
By default, windows do not have a wxLayoutConstraints object. In this case, much layout
must be done explicitly, by performing calculations in OnSize members, except
-for the case of frames that have one subwindow, where wxFrame::OnSize takes care
-of resizing the child.
+for the case of frames that have exactly one subwindow (not counting toolbar and
+statusbar which are also positioned by the frame automatically), where wxFrame::OnSize
+takes care of resizing the child to always fill the frame.
To avoid the need for these rather awkward calculations, the user can create
a wxLayoutConstraints object and associate it with a window with wxWindow::SetConstraints.
It then sets all the window positions and sizes according to the values it has found.
Because the algorithm is iterative, the order in which constraints are considered is
-irrelevant.
+irrelevant, however you may reduce the number of iterations (and thus speed up
+the layout calculations) by creating the controls in such order that as many
+constraints as possible can be calculated during the first iteration. For example, if
+you have 2 buttons which you'd like to position in the lower right corner, it is
+slighty more efficient to first create the second button and specify that its
+right border IsSameAs(parent, wxRight) and then create the first one by
+specifying that it should be LeftOf() the second one than to do in a more
+natural left-to-right order.
\subsection{Window layout examples}\label{layoutexamples}
\subsubsection{Example 1: subwindow layout}
-This example specifies a panel and a canvas side by side,
-with a text subwindow below it.
+This example specifies a panel and a window side by side,
+with a text subwindow below it.
\begin{verbatim}
- frame->panel = new wxPanel(frame, 0, 0, 1000, 500, 0);
- frame->canvas = new MyCanvas(frame, 0, 0, 400, 400, wxRETAINED);
- frame->text_window = new MyTextWindow(frame, 0, 250, 400, 250, wxNATIVE_IMPL);
+ frame->panel = new wxPanel(frame, -1, wxPoint(0, 0), wxSize(1000, 500), 0);
+ frame->scrollWindow = new MyScrolledWindow(frame, -1, wxPoint(0, 0), wxSize(400, 400), wxRETAINED);
+ frame->text_window = new MyTextWindow(frame, -1, wxPoint(0, 250), wxSize(400, 250));
// Set constraints for panel subwindow
wxLayoutConstraints *c1 = new wxLayoutConstraints;
frame->panel->SetConstraints(c1);
- // Set constraints for canvas subwindow
+ // Set constraints for scrollWindow subwindow
wxLayoutConstraints *c2 = new wxLayoutConstraints;
c2->left.SameAs (frame->panel, wxRight);
c2->right.SameAs (frame, wxRight);
c2->height.PercentOf (frame, wxHeight, 50);
- frame->canvas->SetConstraints(c2);
+ frame->scrollWindow->SetConstraints(c2);
// Set constraints for text subwindow
wxLayoutConstraints *c3 = new wxLayoutConstraints;
\begin{verbatim}
// Create some panel items
- wxButton *btn1 = new wxButton(frame->panel, (wxFunction)NULL, "A button") ;
+ wxButton *btn1 = new wxButton(frame->panel, -1, "A button") ;
wxLayoutConstraints *b1 = new wxLayoutConstraints;
b1->centreX.SameAs (frame->panel, wxCentreX);
b1->height.PercentOf (frame->panel, wxHeight, 10);
btn1->SetConstraints(b1);
- wxListBox *list = new wxListBox(frame->panel, (wxFunction)NULL, "A list",
- wxSINGLE, -1, -1, 200, 100);
+ wxListBox *list = new wxListBox(frame->panel, -1, "A list",
+ wxPoint(-1, -1), wxSize(200, 100));
wxLayoutConstraints *b2 = new wxLayoutConstraints;
b2->top.Below (btn1, 5);
b2->bottom.SameAs (frame->panel, wxBottom, 5);
list->SetConstraints(b2);
- wxMultiText *mtext = new wxMultiText(frame->panel, (wxFunction)NULL, "Multiline text", "Some text",
- -1, -1, 150, 100);
-
+ wxTextCtrl *mtext = new wxTextCtrl(frame->panel, -1, "Multiline text", "Some text",
+ wxPoint(-1, -1), wxSize(150, 100), wxTE_MULTILINE);
+
wxLayoutConstraints *b3 = new wxLayoutConstraints;
b3->top.Below (btn1, 5);
b3->left.RightOf (list, 5);