Constructing a Symbian container control
m (Lpvalente -) |
|||
| (28 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== | ==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 99: | Line 104: | ||
void CMyContainerControl::UpdateControls() | void CMyContainerControl::UpdateControls() | ||
{ | { | ||
| − | |||
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, do not set it's position | ||
| + | if (!ctrl->IsVisible()) | ||
| + | { | ||
| + | cursor.Next(); | ||
| + | continue; | ||
| + | } | ||
| + | |||
// Set position | // Set position | ||
ctrl->SetPosition(position); | ctrl->SetPosition(position); | ||
| Line 114: | 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; | position.iY += size.iHeight; | ||
| + | |||
| + | // Does control fit to view? | ||
| + | if (position.iY >= Rect().iBr.iY) | ||
| + | { | ||
| + | ctrl->MakeVisible(EFalse); | ||
| + | } | ||
| + | else | ||
| + | { | ||
| + | ctrl->MakeVisible(ETrue); | ||
| + | } | ||
| + | |||
| + | cursor.Next(); | ||
} | } | ||
} | } | ||
| Line 141: | Line 163: | ||
} | } | ||
| − | // Update | + | // Update control's position |
| + | UpdateControls(); | ||
| + | } | ||
| + | </code> | ||
| + | |||
| + | ==SizeChanged== | ||
| + | When {{Icode|CMyContainerControl}}'s size changes (when, for example, SetRect() is called), components' positions have to be calculated again. | ||
| + | |||
| + | <code cpp> | ||
| + | void CMyContainerControl::SizeChanged() | ||
| + | { | ||
| + | // Sets new position of the components | ||
UpdateControls(); | UpdateControls(); | ||
} | } | ||
| Line 147: | 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 179: | Line 213: | ||
==Postconditions== | ==Postconditions== | ||
| + | {{Icode|CMyContainerControl}} container has some {{Icode|CMyControl}}custom | ||
| + | controls in a list. | ||
==See also== | ==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 | ||
Latest 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

