Compound controls are controls that contain other controls. To create a compound control, you must do the following:
construct the control in the parent control (that owns the window in which the child control appears). An example of an implementation is as follows:
void CMyViewContainer::ConstructL(const TRect& aRect) { CreateWindowL(); iLabel = new (ELeave) CEikLabel; iLabel->SetContainerWindowL( *this ); iLabel->SetTextL( _L("MyView 1\n\nSelect local view\nswitching from menu") ); SetRect(aRect); ActivateL(); }
, where
iLabel = new (ELeave) CEikLabel;
creates
a CEikLabel class that supports the display of
text in the parent window.
CCoeControl::SetContainerWindowL()
assigns
the non-window-owning control to the window-owning control.
CEikLabel::SetTextL() sets a text for the label.
The other methods are the standard methods for creating a window for the window-owning control.
add a method to the owning control that returns the number of controls in the compound control. An example of an implementation is as follows:
TInt CMyViewAppContainer::CountComponentControls() const { return KNumberOfControls; // return nbr of controls inside this compound control }
, where
CMyViewAppContainer::CountComponentControls()
overrides CCoeControl::CountComponentControls()
to return the number of controls in the compound control.
KNumberOfControls
is a TInt
constant for the number of controls in the application. Other approaches
could be used.
Add a method to the owning control that returns each of the controls by a zero-based index. An example of an implementation is as follows:
CCoeControl* CContainerContainer::ComponentControl( TInt aIndex) const { switch ( aIndex ) { case 0: return iLabel; // return a pointer to the //iLabel default: return NULL; } }
, where
CCoeControl* CContainerContainer::ComponentControl(TInt
aIndex)
gets an indexed component of a compound control.
There are 2 ways to implement a compound control:
override the function.
use the CCoeControlArray
functionality
(see the CCoeControl::InitComponentArrayL()
method).
Note: Within a compound control, each component control is identified
by an index, where the index depends on the order the controls were
added: the first is given an index of 0
, the
next an index of 1
, and so on.
All child controls should be accessible by CCoeControl::ComponentControl()
at any time, regardless of whether they are visible or not. The
visibility of a control should be adjusted using the CCoeControl::MakeVisible()
method.
CCoeControl* CContainerContainer::ComponentControl(TInt
aIndex)
and CCoeControl::CountComponentControls()
work in conjunction with each other. The Symbian platform can query
the control as to how many components it has and then request a pointer
to each of the component's controls. Controls can be added or removed
at run time using these two methods. The framework uses this information
to draw the container.
The compound control usually owns the child controls and therefore it is responsible of their construction and destruction. The compound control should also set the positions and sizes of its child controls; it must ensure that all child controls are inside the compound control rectangle and visible child rectangles do not overlap each other.