git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@95 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
		
			
				
	
	
		
			161 lines
		
	
	
		
			7.2 KiB
		
	
	
	
		
			TeX
		
	
	
	
	
	
			
		
		
	
	
			161 lines
		
	
	
		
			7.2 KiB
		
	
	
	
		
			TeX
		
	
	
	
	
	
\section{Constraints overview}\label{constraintsoverview}
 | 
						|
 | 
						|
Classes: \helpref{wxLayoutConstraints}{wxlayoutconstraints}, \helpref{wxIndividualLayoutConstraint}{wxindividuallayoutconstraint}.
 | 
						|
 | 
						|
Objects of class wxLayoutConstraint can be associated with a window to define the
 | 
						|
way its subwindows are laid out, with respect to their siblings or parent.
 | 
						|
 | 
						|
The class consists of the following eight constraints of class wxIndividualLayoutConstraint,
 | 
						|
some or all of which should be accessed directly to set the appropriate
 | 
						|
constraints.
 | 
						|
 | 
						|
\begin{itemize}\itemsep=0pt
 | 
						|
\item {\bf left:} represents the left hand edge of the window
 | 
						|
\item {\bf right:} represents the right hand edge of the window
 | 
						|
\item {\bf top:} represents the top edge of the window
 | 
						|
\item {\bf bottom:} represents the bottom edge of the window
 | 
						|
\item {\bf width:} represents the width of the window
 | 
						|
\item {\bf height:} represents the height of the window
 | 
						|
\item {\bf centreX:} represents the horizontal centre point of the window
 | 
						|
\item {\bf centreY:} represents the vertical centre point of the window
 | 
						|
\end{itemize}
 | 
						|
 | 
						|
Most 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.
 | 
						|
 | 
						|
\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.
 | 
						|
 | 
						|
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.
 | 
						|
This object contains a constraint for each of the window edges, two for the centre point,
 | 
						|
and two for the window size. By setting some or all of these constraints appropriately,
 | 
						|
the user can achieve quite complex layout by defining relationships between windows.
 | 
						|
 | 
						|
In wxWindows, each window can be constrained relative to either its {\it
 | 
						|
siblings} on the same window, or the {\it parent}. The layout algorithm
 | 
						|
therefore operates in a top-down manner, finding the correct layout for
 | 
						|
the children of a window, then the layout for the grandchildren, and so
 | 
						|
on. Note that this differs markedly from native Motif layout, where
 | 
						|
constraints can ripple upwards and can eventually change the frame
 | 
						|
window or dialog box size. We assume in wxWindows that the {\it user} is
 | 
						|
always `boss' and specifies the size of the outer window, to which
 | 
						|
subwindows must conform. Obviously, this might be a limitation in some
 | 
						|
circumstances, but it suffices for most situations, and the
 | 
						|
simplification avoids some of the nightmarish problems associated with
 | 
						|
programming Motif.
 | 
						|
 | 
						|
When the user sets constraints, many of the constraints for windows
 | 
						|
edges and dimensions remain unconstrained. For a given window,
 | 
						|
the wxWindow::Layout algorithm first resets all constraints
 | 
						|
in all children to have unknown edge or dimension values, and then iterates through the constraints,
 | 
						|
evaulating them. For unconstrained edges and dimensions, it
 | 
						|
tries to find the value using known relationships that always hold. For example,
 | 
						|
an unconstrained {\it width} may be calculated from the {\it left} and {\it right edges}, if
 | 
						|
both are currently known. For edges and dimensions with user-supplied constraints, these
 | 
						|
constraints are evaulated if the inputs of the constraint are known.
 | 
						|
 | 
						|
The algorithm stops when all child edges and dimension are known (success), or there
 | 
						|
there are unknown edges or dimensions but there has been no change in this cycle (failure).
 | 
						|
 | 
						|
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.
 | 
						|
 | 
						|
\subsection{Window layout examples}\label{layoutexamples}
 | 
						|
 | 
						|
\subsubsection{Example 1: subwindow layout}
 | 
						|
 | 
						|
This example specifies a panel and a window side by side,
 | 
						|
with a text subwindow below it. 
 | 
						|
 | 
						|
\begin{verbatim}
 | 
						|
  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;
 | 
						|
 | 
						|
  c1->left.SameAs       (frame, wxLeft);
 | 
						|
  c1->top.SameAs        (frame, wxTop);
 | 
						|
  c1->right.PercentOf   (frame, wxWidth, 50);
 | 
						|
  c1->height.PercentOf  (frame, wxHeight, 50);
 | 
						|
 | 
						|
  frame->panel->SetConstraints(c1);
 | 
						|
 | 
						|
  // Set constraints for scrollWindow subwindow
 | 
						|
  wxLayoutConstraints *c2 = new wxLayoutConstraints;
 | 
						|
 | 
						|
  c2->left.SameAs       (frame->panel, wxRight);
 | 
						|
  c2->top.SameAs        (frame, wxTop);
 | 
						|
  c2->right.SameAs      (frame, wxRight);
 | 
						|
  c2->height.PercentOf  (frame, wxHeight, 50);
 | 
						|
 | 
						|
  frame->scrollWindow->SetConstraints(c2);
 | 
						|
 | 
						|
  // Set constraints for text subwindow
 | 
						|
  wxLayoutConstraints *c3 = new wxLayoutConstraints;
 | 
						|
  c3->left.SameAs       (frame, wxLeft);
 | 
						|
  c3->top.Below         (frame->panel);
 | 
						|
  c3->right.SameAs      (frame, wxRight);
 | 
						|
  c3->bottom.SameAs     (frame, wxBottom);
 | 
						|
 | 
						|
  frame->text_window->SetConstraints(c3);
 | 
						|
\end{verbatim}
 | 
						|
 | 
						|
\subsubsection{Example 2: panel item layout}
 | 
						|
 | 
						|
This example sizes a button width to 80 percent of the panel width, and centres
 | 
						|
it horizontally. A listbox and multitext item are placed below it. The listbox
 | 
						|
takes up 40 percent of the panel width, and the multitext item takes up
 | 
						|
the remainder of the width. Margins of 5 pixels are used.
 | 
						|
 | 
						|
\begin{verbatim}
 | 
						|
  // Create some panel items
 | 
						|
  wxButton *btn1 = new wxButton(frame->panel, -1, "A button") ;
 | 
						|
 | 
						|
  wxLayoutConstraints *b1 = new wxLayoutConstraints;
 | 
						|
  b1->centreX.SameAs    (frame->panel, wxCentreX);
 | 
						|
  b1->top.SameAs        (frame->panel, wxTop, 5);
 | 
						|
  b1->width.PercentOf   (frame->panel, wxWidth, 80);
 | 
						|
  b1->height.PercentOf  (frame->panel, wxHeight, 10);
 | 
						|
  btn1->SetConstraints(b1);
 | 
						|
 | 
						|
  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->left.SameAs       (frame->panel, wxLeft, 5);
 | 
						|
  b2->width.PercentOf   (frame->panel, wxWidth, 40);
 | 
						|
  b2->bottom.SameAs     (frame->panel, wxBottom, 5);
 | 
						|
  list->SetConstraints(b2);
 | 
						|
 | 
						|
  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);
 | 
						|
  b3->right.SameAs      (frame->panel, wxRight, 5);
 | 
						|
  b3->bottom.SameAs     (frame->panel, wxBottom, 5);
 | 
						|
  mtext->SetConstraints(b3);
 | 
						|
\end{verbatim}
 | 
						|
 | 
						|
 |