Inserting text or an icon on the navi pane of a Symbian app
Article Metadata
Compatibility
Article
Overview
Inserting text or an icon on the navi pane of an application
Description
Symbian applications can set custom icons or texts to be displayed on the navi pane while their application is in foreground.
Solution
First, a reference to the status pane is retrieved. Next, the reference of the navi pane is obtained from the status pane. The application then has to create a text-based Navi decorator object using the CAknNavigationDecorator class. Finally, the decorator object needs to be pushed onto the navi pane so that it becomes visible.
CAknNavigationControlContainer* iNaviPane = 0;
CAknNavigationDecorator* iNaviDecorator = 0;
//Get the reference of the status pane
CEikStatusPane *statusPane = iEikonEnv->AppUiFactory()->StatusPane();
if ( statusPane )
{
//Get the reference of the navi pane
iNaviPane=static_cast<CAknNavigationControlContainer*>(statusPane->ControlL(
TUid::Uid(EEikStatusPaneUidNavi)) );
//Create a Navi decorator object
iNaviDecorator= iNaviPane->CreateEditorIndicatorContainerL();
//Get the reference of the indicator container inside the NaviDecorator
CAknIndicatorContainer* indiContainer =
static_cast<CAknIndicatorContainer*>(iNaviDecorator->DecoratedControl());
if ( indiContainer && CEikStatusPaneBase::Current() )
{
TBuf<32> msgSize;
msgSize.Append(_L("Test")); // Text to be displayed
indiContainer->SetIndicatorValueL(
TUid::Uid( EAknNaviPaneEditorIndicatorMessageLength ), msgSize );
indiContainer->SetIndicatorState(
TUid::Uid( EAknNaviPaneEditorIndicatorMessageLength ),
EAknIndicatorStateOn);
}
//Push the object onto the navi pane.
iNaviPane->PushL( *iNaviDecorator );
}
Similarly, the code snippet to display an icon on the navi pane is as follows:
CFbsBitmap* bitmap = NULL;
CFbsBitmap* mask = NULL;
CEikStatusPane* statusPane = iEikonEnv->AppUiFactory()->StatusPane();
CAknNavigationControlContainer* naviPane = (CAknNavigationControlContainer*)statusPane->ControlL(
TUid::Uid(EEikStatusPaneUidNavi));
// Create an icon
AknIconUtils::CreateIconLC (bitmap, mask, KIconFile,
EMbmCarsvgCircle, EMbmCarsvgCircle_mask); //KIconFile is the .mif file
TSize size(30,30);
AknIconUtils::SetSize(bitmap, size); // Sets the size of the extracted image
//Create a Navi Decorator encapsulation for the image.
CAknNavigationDecorator* naviDecorator =
naviPane->CreateNavigationImageL(bitmap, mask);
//Push the image onto the navi pane.
naviPane->PushL(*naviDecorator);
Required include files and libraries:
#include <aknnavi.h> // for CAknNavigationControlContainer
#include <eikspane.h> // for CEikStatusPane
#include <aknnavide.h> // for CAknNavigationDecorator
#include <akniconutils.h> // for AknIconUtils
#include <aknindicatorcontainer.h> // for CAknIndicatorContainer
LIBRARY aknicon.lib
LIBRARY fbscli.lib
LIBRARY avkon.lib
Note: The icons or text stay on the navi pane as long as the application is in foreground but they do not affect the idle screen of the device.


Microsoft2 - 30x30?
Why TSize size(30,30);?
Are all s60 navi pane that size?microsoft2 23:41, 20 July 2011 (EEST)
Hamishwillee - Not sure this is still valid
This was written in 2006 for S60 3rd Edition. I have a feeling that yes, the icons were 30 by 30 but I'm not sure that would be true for current versions. Suggest you raise in the discussion boards.hamishwillee 05:04, 23 July 2012 (EEST)