×
Namespaces

Variants
Actions
Revision as of 10:54, 15 October 2008 by tepaa (Talk | contribs)

Implementing a custom CAknQueryDialog dialog

From Nokia Developer Wiki
Jump to: navigation, search


Article Metadata
Tested with
Devices(s): Nokia 5800 XpressMusic
CompatibilityArticle
Keywords: CAknQueryDialog
Created: (15 Oct 2008)
Last edited: tepaa (15 Oct 2008)



Overview

This snippet shows how to implement custom dialog. In this case dialog acts like application splash screen. Dialog closes itself after 2 sec and application running continues.

This snippet can be self-signed.


MMP file (optional)

The following capabilities and libraries are required:

CAPABILITY  None       
 
LIBRARY avkon.lib
LIBRARY eikcoctl.lib
LIBRARY euser.lib


Header file

#include <aknquerydialog.h>
#include <e32std.h>
#include <e32base.h>
#include <eikbtgpc.h>
 
class CSplashScreenDialog : public CAknQueryDialog
{
public: // Construction
CSplashScreenDialog();
virtual ~CSplashScreenDialog();
void PreLayoutDynInitL();
void PostLayoutDynInitL();
TBool OkToExitL(TInt aButtonId);
 
private: // From base classes
void SizeChanged();
TInt CountComponentControls() const;
CCoeControl* ComponentControl(TInt aIndex) const;
void Draw( const TRect& /*aRect*/ ) const;
void SetSizeAndPosition(const TSize &aSize);
 
private: // Internal methods
void CalculatePositionAndSize();
static TInt HideDialog(TAny* aAny);
 
private: // Data
CPeriodic* iPeriodic;
};


Source file

#include "csplashscreendialog.h"
#include "MobilePaintAppUi.h"
 
const TInt KShowTime(2000000);
 
CSplashScreenDialog::CSplashScreenDialog()
{
// Closes this dialog after KShowTime 2s
TRAPD(err,
iPeriodic = CPeriodic::NewL(CActive::EPriorityIdle);
);
if (!err)
{
iPeriodic->Start(KShowTime, KShowTime, TCallBack(HideDialog, this));
}
}
 
CSplashScreenDialog::~CSplashScreenDialog()
{
if (iPeriodic)
{
iPeriodic->Cancel();
}
delete iPeriodic;
}
 
void CSplashScreenDialog::PreLayoutDynInitL()
{
CAknQueryDialog::PreLayoutDynInitL();
SetEditableL(EFalse);
}
 
void CSplashScreenDialog::PostLayoutDynInitL()
{
// No CBA buttons
CEikButtonGroupContainer* cba = CEikButtonGroupContainer::Current();
cba->MakeVisible(EFalse);
 
// Calculate position of the dialog
CalculatePositionAndSize();
}
 
TBool CSplashScreenDialog::OkToExitL(TInt /*aButtonId*/)
{
return ETrue;
}
 
TInt CSplashScreenDialog::CountComponentControls() const
{
// No child components in this example
return(0);
}
 
CCoeControl* CSplashScreenDialog::ComponentControl(TInt /*aIndex*/) const
{
// No child components in this example
return NULL;
}
 
void CSplashScreenDialog::CalculatePositionAndSize()
{
// Set full screen
SetExtentToWholeScreen();
}
 
void CSplashScreenDialog::SetSizeAndPosition(const TSize &aSize)
{
CAknQueryDialog::SetSizeAndPosition( aSize );
CalculatePositionAndSize();
}
 
void CSplashScreenDialog::SizeChanged()
{
// Update screen
DrawNow();
}
 
void CSplashScreenDialog::Draw( const TRect& /*aRect*/ ) const
{
// Get the standard graphics context
CWindowGc& gc = SystemGc();
gc.SetPenStyle( CGraphicsContext::ENullPen );
gc.SetBrushColor( KRgbBlack);
gc.SetBrushStyle( CGraphicsContext::ESolidBrush );
 
// Clear screen
gc.Clear(Rect());
gc.SetBrushStyle( CGraphicsContext::ENullBrush );
 
// Draw round rect
gc.SetPenStyle( CGraphicsContext::ESolidPen );
gc.SetPenColor(KRgbWhite);
gc.DrawRect(Rect());
 
// TODO: Implement what you need
}
 
TInt CSplashScreenDialog::HideDialog(TAny* aAny)
{
CSplashScreenDialog* self = static_cast<CSplashScreenDialog*>( aAny );
 
// Cancel CPeriodic timer
self->iPeriodic->Cancel();
 
// Closes itself
TRAP_IGNORE(
self->TryExitL(1);
);
return KErrNone;
}


Custom dialog resurce

RESOURCE DIALOG r_custom_dialog
{
flags = EGeneralQueryFlags;
buttons = R_AVKON_SOFTKEYS_CLOSE;
}


Running the custom dialog

iSplashScreenDialog = new (ELeave) CSplashScreenDialog();
iSplashScreenDialog->ExecuteLD(R_CUSTOM_DIALOG);
// Execution continues here after dialog has hided itself
iSplashScreenDialog = NULL;


Postconditions

Custom dialog is shown 2 sec period

96 page views in the last 30 days.
×