the default value for the constraints is wxUnconstrained, not wxAsIs

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@2711 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin
1999-06-08 15:08:42 +00:00
parent 910f1f8ce6
commit 945bda7d9a

View File

@@ -20,24 +20,31 @@ constraints.
\item {\bf centreY:} represents the vertical centre point of the window \item {\bf centreY:} represents the vertical centre point of the window
\end{itemize} \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. 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 To calculate the position and size of the control, the layout algorithm needs to
ensure that if the user does not specify a constraint, the existing know exactly 4 constraints (as it has 4 numbers to calculate from them), so you
width and height will be used, to be compatible with panel items which often should always set exactly 4 of the constraints from the above table.
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 If you want the controls height or width to have the default value, you may use
constraints, you can either call wxWindow::SetAutoLayout to tell a special value for the constraint: wxAsIs. If the constraint is wxAsIs, the
default OnSize handlers to call Layout, or override OnSize and call Layout yourself. 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} \subsection{Constraint layout: more detail}
By default, windows do not have a wxLayoutConstraints object. In this case, much layout 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 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 for the case of frames that have exactly one subwindow (not counting toolbar and
of resizing the child. 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 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. a wxLayoutConstraints object and associate it with a window with wxWindow::SetConstraints.
@@ -74,14 +81,21 @@ there are unknown edges or dimensions but there has been no change in this cycle
It then sets all the window positions and sizes according to the values it has found. 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 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} \subsection{Window layout examples}\label{layoutexamples}
\subsubsection{Example 1: subwindow layout} \subsubsection{Example 1: subwindow layout}
This example specifies a panel and a window side by side, This example specifies a panel and a window side by side,
with a text subwindow below it. with a text subwindow below it.
\begin{verbatim} \begin{verbatim}
frame->panel = new wxPanel(frame, -1, wxPoint(0, 0), wxSize(1000, 500), 0); frame->panel = new wxPanel(frame, -1, wxPoint(0, 0), wxSize(1000, 500), 0);
@@ -148,7 +162,7 @@ the remainder of the width. Margins of 5 pixels are used.
wxTextCtrl *mtext = new wxTextCtrl(frame->panel, -1, "Multiline text", "Some text", wxTextCtrl *mtext = new wxTextCtrl(frame->panel, -1, "Multiline text", "Some text",
wxPoint(-1, -1), wxSize(150, 100), wxTE_MULTILINE); wxPoint(-1, -1), wxSize(150, 100), wxTE_MULTILINE);
wxLayoutConstraints *b3 = new wxLayoutConstraints; wxLayoutConstraints *b3 = new wxLayoutConstraints;
b3->top.Below (btn1, 5); b3->top.Below (btn1, 5);
b3->left.RightOf (list, 5); b3->left.RightOf (list, 5);