The call on the first phase constructor method of the view occurs in UI controller. The view serves as the top-level window under the UI controller.
The following are the methods that you need to derive for the
view derived from CCoeControl
:
Default constructor, which cannot contain code that leaves. A common implementation is:
CMyAppView* CMyAppView::NewL( const TRect& aRect ) { CMyAppView* self = CMyAppView::NewLC( aRect ); CleanupStack::Pop( self ); return self; } CMyAppView* CMyAppView::NewLC( const TRect& aRect ) { CMyAppView* self = new ( ELeave ) CMyAppView; CleanupStack::PushL( self ); self->ConstructL( aRect ); return self; } CMyAppView::CMyAppView() { // No implementation required }
The declarations for CMyAppView::NewL()
and CMyAppView::NewLC()
in the class header
file needs to be public to support the construction method required.
In this approach, CMyAppView::NewL()
is
called from the UI controller. It creates a view object by calling CMyAppView::NewLC()
to create the object (and leave if
it cannot), pushes a pointer to the clean-up stack in case the second
phase construction method leaves, and then calls the second phase
construction method of the object. When it returns to CMyAppView::NewL()
, the pointer pushed to the cleanup stack is removed. For more information,
see Symbian C++ API specifications.
Symbian second phase constructor with code that might leave. A common implementation is:
void CMyAppView::ConstructL( const TRect& aRect ) { // Create a window for this application view CreateWindowL(); //add construction for other controls if required // Set the windows size SetRect( aRect ); // Activate the window, which makes it ready to be drawn ActivateL(); }
CMyAppView
is a private class providing
the second phase construction that accepts the rectangle the view
is drawn to.
CCoeControl::CreateWindowL()
creates a window
for the control. Note that this window is a child of the UI controller.
This method makes the control a window-owning control. While, the use of window-owning controls is discouraged to prevent
the taxing of run-time resources, this is the top-level window for
the UI controller.
While this is a simple control that does not contain other controls,
other controls could be added to the control between CCoeControl::CreateWindowL()
and CCoeControl::SetRect(aRect)
. For more information,
see Compound controls in the view architecture.
CCoeControl::SetRect(aRect)
sets the window
size according to the requirements of the mobile device. The top-level
control rectangle is set to the area that the framework provides for
the application. Calling CCoeControl::SetRect(aRect)
calls the CCoeControl::SizeChanged()
method,
where the control should set the position and size for any child controls
and thus adjust the control layout to the UI.
CCoeControl::ActivateL()
sets the control
as ready to be drawn.
If required for your application, you may need to implement
other methods for your control. For top-level windows, you would need
to implement CCoeControl::SizeChanged()
to respond
to changes to the size and position of the contents of this control.
This is called by the Symbian platform when a change occurs. A typical
implementation for a compound control is:
void CMyAppView::SizeChanged() { // Control resize code iControl->SetExtent( const TPoint &aPosition, const TSize &aSize); }