Constructing a Symbian container control
m (Lpvalente -) |
|||
| (19 intermediate revisions by 7 users not shown) | |||
| Line 1: | Line 1: | ||
| − | + | [[Category:Symbian C++]][[Category:UI]][[Category:Symbian]][[Category:Code Examples]][[Category:Code Snippet]][[Category:S60 3rd Edition FP1]] | |
| − | + | {{ArticleMetaData <!-- v1.2 --> | |
| + | |sourcecode= [[Media:CustomControl.zip]] | ||
| + | |installfile= <!-- Link to installation file (e.g. [[Media:The Installation File.sis]]) --> | ||
| + | |devices= Nokia N95 | ||
| + | |sdk= <!-- SDK(s) built and tested against (e.g. [http://linktosdkdownload/ Nokia Qt SDK 1.1]) --> | ||
| + | |platform= S60 3rd Edition, FP1 | ||
| + | |devicecompatability= <!-- Compatible devices (e.g.: All* (must have GPS) ) --> | ||
| + | |dependencies= <!-- Any other/external dependencies e.g.: Google Maps Api v1.0 --> | ||
| + | |signing= <!-- Empty or one of Self-Signed, DevCert, Manufacturer --> | ||
| + | |capabilities= <!-- Capabilities required by the article/code example (e.g. Location, NetworkServices. --> | ||
| + | |keywords= CCoeControl, TResourceReader, CCoeControlArray | ||
| + | |language= <!-- Language category code for non-English topics - e.g. Lang-Chinese --> | ||
| + | |translated-by= <!-- [[User:XXXX]] --> | ||
| + | |translated-from-title= <!-- Title only --> | ||
| + | |translated-from-id= <!-- Id of translated revision --> | ||
| + | |review-by= <!-- After re-review: [[User:username]] --> | ||
| + | |review-timestamp= <!-- After re-review: YYYYMMDD --> | ||
| + | |update-by= <!-- After significant update: [[User:username]]--> | ||
| + | |update-timestamp= <!-- After significant update: YYYYMMDD --> | ||
| + | |creationdate= 20080307 | ||
| + | |author= [[User:Tepaa]] | ||
| + | <!-- The following are not in current metadata --> | ||
| + | |subcategory= UI | ||
| + | |id= CS000861 | ||
| + | }} | ||
| − | + | ==Overview== | |
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| + | {{Abstract|This code snippet shows how to create a container control that owns custom controls. The example shows how to focus the first component with a rectangle and how to change focus.}} | ||
| − | + | The example extends the existing code snippet [[How to create a custom control in Symbian C++]]. | |
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | Container controls | + | Container controls store their controls into {{Icode|CCoeControlArray}}. |
==Header== | ==Header== | ||
| Line 102: | Line 106: | ||
TPoint position; | TPoint position; | ||
| − | // Goes | + | // Goes through all components of this container control |
CCoeControlArray::TCursor cursor = Components().Begin(); | CCoeControlArray::TCursor cursor = Components().Begin(); | ||
CCoeControl* ctrl = NULL; | CCoeControl* ctrl = NULL; | ||
while ((ctrl = cursor.Control<CCoeControl>()) != NULL) | while ((ctrl = cursor.Control<CCoeControl>()) != NULL) | ||
{ | { | ||
| − | // If control is not visible | + | // If control is not visible, do not set it's position |
if (!ctrl->IsVisible()) | if (!ctrl->IsVisible()) | ||
{ | { | ||
| Line 113: | Line 117: | ||
continue; | continue; | ||
} | } | ||
| − | + | ||
// Set position | // Set position | ||
ctrl->SetPosition(position); | ctrl->SetPosition(position); | ||
| Line 121: | Line 125: | ||
size.SetSize(Rect().Width(),size.iHeight); | size.SetSize(Rect().Width(),size.iHeight); | ||
ctrl->SetSize(size); | ctrl->SetSize(size); | ||
| − | + | ||
| − | // | + | // Calculate position |
| + | position.iY += size.iHeight; | ||
| + | |||
| + | // Does control fit to view? | ||
if (position.iY >= Rect().iBr.iY) | if (position.iY >= Rect().iBr.iY) | ||
{ | { | ||
| Line 131: | Line 138: | ||
ctrl->MakeVisible(ETrue); | ctrl->MakeVisible(ETrue); | ||
} | } | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
cursor.Next(); | cursor.Next(); | ||
} | } | ||
| Line 159: | Line 163: | ||
} | } | ||
| − | // Update | + | // Update control's position |
UpdateControls(); | UpdateControls(); | ||
} | } | ||
| Line 165: | Line 169: | ||
==SizeChanged== | ==SizeChanged== | ||
| − | When | + | When {{Icode|CMyContainerControl}}'s size changes (when, for example, SetRect() is called), components' positions have to be calculated again. |
| − | to | + | |
<code cpp> | <code cpp> | ||
void CMyContainerControl::SizeChanged() | void CMyContainerControl::SizeChanged() | ||
| Line 176: | Line 180: | ||
==Focusing component== | ==Focusing component== | ||
| − | + | ||
| − | * CMyControl::Draw() must call | + | Make the following changes to the {{Icode|CMyControl}} component. |
| − | * CMyControl::DrawFocusFrame() is new method where focus rectangle is | + | * {{Icode|CMyControl::Draw()}} must call {{Icode|DrawFocusFrame()}} for drawing the focus rectangle |
| + | * {{Icode|CMyControl::DrawFocusFrame()}} is a new method where focus rectangle is drawn | ||
<code cpp> | <code cpp> | ||
void CMyControl::Draw(const TRect& aRect) const | void CMyControl::Draw(const TRect& aRect) const | ||
| Line 208: | Line 213: | ||
==Postconditions== | ==Postconditions== | ||
| − | + | {{Icode|CMyContainerControl}} container has some {{Icode|CMyControl}}custom | |
controls in a list. | controls in a list. | ||
==See also== | ==See also== | ||
Custom Control Series: | Custom Control Series: | ||
| − | * [[ | + | * [[How to create a custom control in Symbian C++]] Defining a custom control |
| − | * [[ | + | * [[Constructing a Symbian custom control from a resource]] Creating a control from a resource |
| − | * [[ | + | * [[Changing the focus of a Symbian custom control]] Handling key events and changing active custom control focus |
| − | + | * [[Archived:Using scrollbars in Symbian container control]] Adding scroll bar to custom control | |
| − | * [[ | + | * [[Using a Symbian custom control in a dialog]] Adding a custom control into CAknDialog |
| − | * [[ | + | * [[File:CustomControl.zip]] Example code patch |
| − | + | ||
| − | + | ||
Revision as of 00:09, 4 August 2012
Article Metadata
Code Example
Source file: Media:CustomControl.zip
Tested with
Devices(s): Nokia N95
Compatibility
Platform(s): S60 3rd Edition, FP1
Article
Keywords: CCoeControl, TResourceReader, CCoeControlArray
Created: tepaa
(07 Mar 2008)
Last edited: lpvalente
(04 Aug 2012)
Contents |
Overview
This code snippet shows how to create a container control that owns custom controls. The example shows how to focus the first component with a rectangle and how to change focus.
The example extends the existing code snippet How to create a custom control in Symbian C++.
Container controls store their controls into CCoeControlArray.
Header
class CMyContainerControl : public CCoeControl
{
public:
static CMyContainerControl* NewL(const TRect& aRect);
static CMyContainerControl* NewLC(const TRect& aRect);
virtual ~CMyContainerControl();
private: // from CCoeControl
void Draw(const TRect& aRect) const;
void SizeChanged();
public: // own methods
// NOTE: Transfer ownership to CMyContainerControl
void AddControlL(CCoeControl* aControl,TInt aControlId);
void UpdateControls();
private: // own methods
CMyContainerControl();
void ConstructL(const TRect& aRect);
};
Source
CMyContainerControl* CMyContainerControl::NewL(const TRect& aRect)
{
CMyContainerControl* self = CMyContainerControl::NewLC(aRect);
CleanupStack::Pop(self);
return self;
}
CMyContainerControl* CMyContainerControl::NewLC(const TRect& aRect)
{
CMyContainerControl* self = new(ELeave) CMyContainerControl();
CleanupStack::PushL(self);
self->ConstructL(aRect);
return self;
}
CMyContainerControl::CMyContainerControl()
{
}
CMyContainerControl::~CMyContainerControl()
{
}
void CMyContainerControl::ConstructL(const TRect& aRect)
{
// No parent owner, so create an own window
CreateWindowL();
// Initialize component array
InitComponentArrayL();
SetRect(aRect);
ActivateL();
}
void CMyContainerControl::SizeChanged()
{
UpdateControls();
}
void CMyContainerControl::UpdateControls()
{
TPoint position;
// Goes through all components of this container control
CCoeControlArray::TCursor cursor = Components().Begin();
CCoeControl* ctrl = NULL;
while ((ctrl = cursor.Control<CCoeControl>()) != NULL)
{
// If control is not visible, do not set it's position
if (!ctrl->IsVisible())
{
cursor.Next();
continue;
}
// Set position
ctrl->SetPosition(position);
// Set size
TSize size = ctrl->MinimumSize();
size.SetSize(Rect().Width(),size.iHeight);
ctrl->SetSize(size);
// Calculate position
position.iY += size.iHeight;
// Does control fit to view?
if (position.iY >= Rect().iBr.iY)
{
ctrl->MakeVisible(EFalse);
}
else
{
ctrl->MakeVisible(ETrue);
}
cursor.Next();
}
}
void CMyContainerControl::Draw(const TRect& /*aRect*/) const
{
CWindowGc& gc = SystemGc();
gc.SetBrushColor(KRgbBlack);
gc.Clear(Rect());
}
void CMyContainerControl::AddControlL(CCoeControl* aControl,TInt aControlId)
{
// NOTE: Transfer ownership of CCoeControl to CMyContainerControl
// Add control into container control
Components().AppendLC(aControl,aControlId);
CleanupStack::Pop(aControl);
// Focus first component
if (Components().Count()==1)
{
aControl->SetFocus(ETrue);
}
// Update control's position
UpdateControls();
}
SizeChanged
When CMyContainerControl's size changes (when, for example, SetRect() is called), components' positions have to be calculated again.
void CMyContainerControl::SizeChanged()
{
// Sets new position of the components
UpdateControls();
}
Focusing component
Make the following changes to the CMyControl component.
- CMyControl::Draw() must call DrawFocusFrame() for drawing the focus rectangle
- CMyControl::DrawFocusFrame() is a new method where focus rectangle is drawn
void CMyControl::Draw(const TRect& aRect) const
{
CWindowGc& gc = SystemGc();
gc.SetBrushColor(KRgbBlue);
gc.Clear(Rect());
DrawFocusFrame(aRect);
}
void CMyControl::DrawFocusFrame(const TRect& aRect) const
{
// Nothing to draw if not focused
if ( IsFocused() == EFalse )
return;
// Prep for draw
CWindowGc& gc = SystemGc();
gc.SetPenStyle( CGraphicsContext::ESolidPen );
gc.SetPenSize( TSize(KFocusFrameWidth,KFocusFrameWidth) );
gc.SetBrushStyle( CGraphicsContext::ENullBrush );
gc.SetPenColor( KRgbDarkGray );
// Draw the rounded rectangle
gc.DrawRoundRect( aRect, TSize( KFrameRoundRadius, KFrameRoundRadius ) );
}
Postconditions
CMyContainerControl container has some CMyControlcustom controls in a list.
See also
Custom Control Series:
- How to create a custom control in Symbian C++ Defining a custom control
- Constructing a Symbian custom control from a resource Creating a control from a resource
- Changing the focus of a Symbian custom control Handling key events and changing active custom control focus
- Archived:Using scrollbars in Symbian container control Adding scroll bar to custom control
- Using a Symbian custom control in a dialog Adding a custom control into CAknDialog
- File:CustomControl.zip Example code patch

