Implementing a custom CAknQueryDialog dialog
| Line 74: | Line 74: | ||
<code cpp> | <code cpp> | ||
#include "csplashscreendialog.h" | #include "csplashscreendialog.h" | ||
| − | |||
const TInt KShowTime(2000000); | const TInt KShowTime(2000000); | ||
Revision as of 10:54, 15 October 2008
Article Metadata
Tested with
Devices(s): Nokia 5800 XpressMusic
Compatibility
Platform(s): S60 3rd Edition, S60 5th Edition
Article
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"
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

