CS001062 - 使用CAknGlobalProgressDialog显示一个全局进度对话框
From Forum Nokia Wiki
| ID | CS001062 | Creation date | July 3, 2008 |
| Platform | S60 3rd Edition, FP1 | Tested on devices | Nokia N93 |
| Category | Symbian C++ | Subcategory | Files/Data |
| Keywords (APIs, classes, methods, functions): CAknGlobalProgressDialog, StringLoader, CPeriodic,
CAknGlobalProgressDialog::NewL(), CAknGlobalProgressDialog::ShowProgressDialogL(), CAknGlobalProgressDialog::UpdateProgressDialog(), CAknGlobalProgressDialog::ProcessFinished(), StringLoader::LoadLC(), CPeriodic::NewL(), CPeriodic::Start() |
概述
这个代码片段演示如何创建一个全局的进度对话框CAknGlobalProgressDialog。通过调用NewL()方法来构造一个全局进度对框框,使用ShowProgressDialogL()来执行。必须构造一个活动对象以处理对话框的关闭。本例使用通用类CGlobalQueryHandlerAO,这个类也用在其它全局查询代码片段中。类CGlobalQueryContainer用于调出查询框,它也是观察者,实现了MGlobalQueryObserver接口。
这段代码可以用自签名。
MMP文件
需要下面的库文件:
LIBRARY cone.lib //CEikonEnv, CCoeEnv LIBRARY avkon.lib //Avkon resources LIBRARY CommonEngine.lib //StringLoader LIBRARY euser.lib //CActive, CleanupStack, CPeriodic
资源文件
.rss
#include <eikon.rh> #include <avkon.rsg> #include <avkon.rh> //... RESOURCE TBUF r_global_query_progress_text { buf = "<progress dialog text here>"; }
头文件
- 观察者接口
#ifndef GLOBALQUERYOBSERVER_H #define GLOBALQUERYOBSERVER_H class MGlobalQueryObserver { public: // 让这些方法运行短暂些,因为是从AO对象内调用它们。 virtual void ProcessOkOptionL() = 0; virtual void ProcessCancelOptionL() = 0; virtual void ProcessDoneOptionL() = 0; virtual void ProcessSelectedItemL(const TInt aItem) = 0; }; #endif // GLOBALQUERYOBSERVER_H
- AO对象处理器
#ifndef GLOBALQUERYHANDLERAO_H #define GLOBALQUERYHANDLERAO_H #include <e32base.h> //CActive #include "GlobalQueryObserver.h" class CGlobalQueryHandlerAO : public CActive { public: ~CGlobalQueryHandlerAO(); static CGlobalQueryHandlerAO* NewL(MGlobalQueryObserver& aObserver); static CGlobalQueryHandlerAO* NewLC(MGlobalQueryObserver& aObserver); public: void StartHandler(); private: CGlobalQueryHandlerAO(MGlobalQueryObserver& aObserver) : CActive (EPriorityStandard), iObserver(aObserver){}; void ConstructL(); private: // from CActive void RunL(); void DoCancel(); private: // data MGlobalQueryObserver& iObserver; }; #endif //GLOBALQUERYHANDLERAO_H
- 容器/观察者
#ifndef GLOBALQUERYCONTAINER_H #define GLOBALQUERYCONTAINER_H #include <coecntrl.h> // CCoeControl #include "GlobalQueryObserver.h" #include <aknglobalprogressdialog.h> //CAknGlobalProgressDialog const TInt KFinalExampleStep = 100; class CGlobalQueryHandlerAO; class CGlobalQueryContainer : public CCoeControl, MGlobalQueryObserver { public: //... void MakeExampleQueryL(); private: //... static TInt TimerCallback(TAny* aThis); void GlobalExampleProcessTimerEvent(); public: // from MGlobalQueryObserver void ProcessOkOptionL(); //not used void ProcessCancelOptionL(); void ProcessDoneOptionL(); void ProcessSelectedItemL(const TInt aItem); //not used //... private: CGlobalQueryHandlerAO* iQueryHandlerAO; CAknGlobalProgressDialog* iGlobalProgressDialog; CPeriodic* iTimer; TInt iCurrentExampleStep; }; #endif // GLOBALQUERYCONTAINER_H
源代码文件
- AO对象处理器
#include "GlobalQueryHandlerAO.h" #include <avkon.hrh> //EAknSoftkeyOk, EAknSoftkeyCancel, EAknSoftkeyDone CGlobalQueryHandlerAO::~CGlobalQueryHandlerAO() { Cancel(); } void CGlobalQueryHandlerAO::ConstructL() { CActiveScheduler::Add(this); } CGlobalQueryHandlerAO* CGlobalQueryHandlerAO::NewLC(MGlobalQueryObserver& aObserver) { CGlobalQueryHandlerAO* self = new (ELeave) CGlobalQueryHandlerAO(aObserver); CleanupStack::PushL(self); self->ConstructL(); return self; } CGlobalQueryHandlerAO* CGlobalQueryHandlerAO::NewL(MGlobalQueryObserver& aObserver) { CGlobalQueryHandlerAO* self = CGlobalQueryHandlerAO::NewLC(aObserver); CleanupStack::Pop(self); return self; } void CGlobalQueryHandlerAO::DoCancel(){} void CGlobalQueryHandlerAO::StartHandler() { SetActive(); } void CGlobalQueryHandlerAO::RunL() { if (iStatus == EAknSoftkeyOk) iObserver.ProcessOkOptionL(); else if(iStatus == EAknSoftkeyCancel) iObserver.ProcessCancelOptionL(); else if(iStatus == EAknSoftkeyDone) iObserver.ProcessDoneOptionL(); else iObserver.ProcessSelectedItemL(iStatus.Int()); Cancel(); }
- 容器/观察者
#include "GlobalQueryContainer.h" //CGlobalQueryContainer #include "GlobalQueryHandlerAO.h" //CGlobalQueryHandlerAO #include <GlobalQuery_0xED0C36BE.rsg> //Resources #include <StringLoader.h> // StringLoader void CGlobalQueryContainer::ConstructL(const TRect& aRect) { CreateWindowL(); SetRect(aRect); ActivateL(); MakeExampleQueryL(); } void CGlobalQueryContainer::MakeExampleQueryL() { //start the query handler and show global progress dialog iQueryHandlerAO = CGlobalQueryHandlerAO::NewL(*this); iQueryHandlerAO->StartHandler(); iGlobalProgressDialog = CAknGlobalProgressDialog::NewL(); HBufC* progressText = StringLoader::LoadLC(R_GLOBAL_QUERY_PROGRESS_TEXT); iCurrentExampleStep = 0; iGlobalProgressDialog->ShowProgressDialogL( iQueryHandlerAO->iStatus, *progressText, R_AVKON_SOFTKEYS_CANCEL); //start example process and update the progress dialog iTimer = CPeriodic::NewL(EPriorityLow); iTimer->Start(1000, 1000, TCallBack(TimerCallback, this)); CleanupStack::PopAndDestroy(); //progressText } CGlobalQueryContainer::~CGlobalQueryContainer() { //... delete iQueryHandlerAO; delete iGlobalProgressDialog; if(iTimer) { iTimer->Cancel(); delete iTimer; } } TInt CGlobalQueryContainer::TimerCallback(TAny* aThis) { static_cast< CGlobalQueryContainer* >(aThis)->GlobalExampleProcessTimerEvent(); return 0; } void CGlobalQueryContainer::GlobalExampleProcessTimerEvent() { if (!iGlobalProgressDialog) { return; } iCurrentExampleStep++; if (iCurrentExampleStep <= KFinalExampleStep) { iGlobalProgressDialog->UpdateProgressDialog(iCurrentExampleStep, KFinalExampleStep); } else { iGlobalProgressDialog->ProcessFinished(); iTimer->Cancel(); } } void CGlobalQueryContainer::ProcessOkOptionL() { //not used } void CGlobalQueryContainer::ProcessCancelOptionL() { //Cancel pressed, do something... iEikonEnv->InfoWinL(_L("Cancel"),_L("Pressed")); } void CGlobalQueryContainer::ProcessDoneOptionL() { //Progress dialog ready, do something... iEikonEnv->InfoWinL(_L("Progress"),_L("Done")); } void CGlobalQueryContainer::ProcessSelectedItemL(const TInt /*aItem*/) { //not used }
后置条件
这段样例代码演示如何创建一个全局的进度对话框、更新进度条、处理对话框关闭、以及活动对象处理器如何通知观察者类对话框已关闭。

