Join Now
Quality Rating:
  • Currently 0.0 / 5
(0.0 / 5 - 0 votes cast)
This page was last modified 21:07, 13 October 2008.

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
    }

后置条件

这段样例代码演示如何创建一个全局的进度对话框、更新进度条、处理对话框关闭、以及活动对象处理器如何通知观察者类对话框已关闭。

参见

 
Powered by MediaWiki
     
     RDF Facets:
     
     
     qfnZtypeQUqfnTypeZCommunityContentQ
     qfnZtypeQUqfnTypeZWebpageQ
     qfnZtypeQUqfnTypeZWikiContentQ
     qmarsZlanguageQUxhttpE3aE2fE2fswE2enokiaE2ecomE2flanguageE2d1E2fenX