您的位置:首页 > 产品设计 > UI/UE

Symbian 中各种提示、输入对话框的使用

2009-07-14 16:06 525 查看
1、非阻塞提示框


symbian定义了几个提示类,分别是:

confirm类:CAknConfirmationNote

info类: CAknInformationNote

warning类:CAknWarningNote

error类:CAknErrorNote

头文件:aknnotewrappers.h

lib: avkon.lib   eikcdlg.lib   eikctl.lib

Code:

TBuf<32> buf;

buf.Copy(_L("info note"));

CAknInformationNote* iInfoNote = new (ELeave) CAknInformationNote;

iInfoNote->ExecuteLD(buf);

2、阻塞提示框


void CEikonEnv::AlertWin(const TDesC& aMsg);

void CEikonEnv::AlertWin(const TDesC& aMsg1,const TDesC& aMsg2);

static void CEikonEnv::InfoWinL(const TDesC& aFirstLine,const TDesC& aSecondLine);
AlertWin为CEikonEnv类的非静态成员函数,InfoWinL为CEikonEnv类的静态成员函数。

AlertWin只能在ui、view和container中使用,使用方法如下:
Code:

iEikonEnv->AlertWin(_L("text"));
InfoWinL可以在任意类中使用,使用方法如下:

Code:

CEikonEnv::Static()->InfoWinL(_L("note:"), _L("text"));
为方便使用,常定义宏来使用这类提示框,如:
Code:

#define DEBUG_DIALOG(x) iEikonEnv->AlertWin(##x);

#define DEBUG_DIALOG1(x) CEikonEnv::Static()->InfoWinL(_L("note:"), ##x);

#define DEBUG_DIALOG2(x,y) CEikonEnv::Static()->InfoWinL(##x, ##y);

可以这么使用:

TBuf<32> buf;

buf.Copy(_L("test"));

DEBUG_DIALOG(buf);

DEBUG_DIALOG1(buf);

DEBUG_DIALOG2(buf,_L("text"));
此类提示框阻塞线程,只有用户按键退出提示框后,后面的程序才能接着运行。

3、进度条对话框


进度条对话框类为:

CAknProgressDialog

头文件:aknprogressdialog.h

lib:avkon.lib   eikcdlg.lib   eikctl.lib

Code:


//初始化进度条

CAknProgressDialog* iProgressDialog;

CEikProgressInfo* iProgressInfo;

iProgressDialog = new ( ELeave ) CAknProgressDialog( reinterpret_cast

                                                        <CEikDialog**>

                                                        ( &iProgressDialog ) );

iProgressDialog->SetCallback( this );

iProgressDialog->PrepareLC( R_RESOURCE_PROGRESS_NOTE );   //从资源文件构造对话框,资源见下面的定义

iProgressInfo = iProgressDialog->GetProgressInfoL();

iProgressInfo->SetFinalValue( aMaxValue );   //设置进度条的最大值(结束值)

iProgressDialog->RunLD();

  

//更新进度条

iProgressInfo->IncrementAndDraw( aStep );  

//结束进度条

iProgressDialog->ProcessFinishedL();

delete iProgressDialog;

RESOURCE DIALOG R_RESOURCE_PROGRESS_NOTE   //进度条对话框资源

     {

     flags = EAknProgressNoteFlags;

     buttons = R_AVKON_SOFTKEYS_CANCEL;

     items =

         {

         DLG_LINE

             {

             type = EAknCtNote;

             id = EMagicBoxCtrlIdProgressNote;

             control = AVKON_NOTE

                 {

                 layout = EProgressLayout;

                 singular_label = "对话框中显示的文字";

                 plural_label = "download";

                 imagefile = AVKON_BMPFILE_NAME;    //第二版中 图标文件为 #define AVKON_BMPFILE_NAME "z://system//data//avkon.mbm"

                 imageid = EMbmAvkonQgn_note_sml;   //这两项可更改显示不同图标

                 imagemask = EMbmAvkonQgn_note_sml_mask;

                 };

             }

         };

     }


意:In Series 60 3rd edition, avkon.mbm was replaced by avkon2.mbm and
moved to a different location (and the SDK forgot to mention this and
still provides erroneous location).

Old entry:

               imagefile = "z://system/data/avkon.mbm";

New entry:

               imagefile = "z://resource/apps/avkon2.mbm";

4、等待对话框


等待对话框要用到的类:CAknGlobalNote

头文件:aknglobalnote.h

lib:aknnotify.lib eiksrv.lib

Code:


//显示等待对话框

   CAknGlobalNote* globalNote = CAknGlobalNote::NewL();

   CleanupStack::PushL( globalNote );

   TInt iWaitNoteId = globalNote->ShowNoteL( EAknGlobalWaitNote, _L("对话框中显示的文字") );

   CleanupStack::PopAndDestroy();

  

   //结束等待对话框

   CAknGlobalNote * note = CAknGlobalNote::NewL();

   CleanupStack::PushL( note );

   note->CancelNoteL( iWaitNoteId );

   CleanupStack::PopAndDestroy();

注意:

CAknGlobalNote类除了显示等待对话框外还可显示多种类型的全局对话框,具体类型可通过ShowNoteL的第一个参数指定,可能的类型如下:

Code:


enum TAknGlobalNoteType

{

EAknGlobalInformationNote = 1,

EAknGlobalWarningNote,

EAknGlobalConfirmationNote,

EAknGlobalErrorNote,

EAknGlobalChargingNote,

EAknGlobalWaitNote,

EAknGlobalPermanentNote,

EAknGlobalNotChargingNote,

EAknGlobalBatteryFullNote,

EAknGlobalBatteryLowNote,

EAknGlobalRechargeBatteryNote,

EAknCancelGlobalNote,

EAknGlobalTextNote

};

5、询问对话框


询问对话框用到的类:CAknQueryDialog

头文件:AknQueryDialog.h

lib:avkon.lib

Code:


CAknQueryDialog* dlg;

dlg = CAknQueryDialog::NewL( CAknQueryDialog::ENoTone );

dlg->PrepareLC( R_RESOURCE_QUERY_DIALOG ); //从资源文件构造对话框,资源见下面的定义

TInt ret = dlg->RunLD();   //若用户选择“是”,返回非0,选择“否”,则返回0

RESOURCE DIALOG R_RESOURCE_QUERY_DIALOG   //询问对话框资源

     {

     flags = EGeneralQueryFlags;

     buttons = R_AVKON_SOFTKEYS_YES_NO;   //CBA显示“是”和“否”两个按钮

     items =

         {

         DLG_LINE

             {

             type = EAknCtQuery;

             id = EGeneralQuery;

             control = AVKON_CONFIRMATION_QUERY    //表示这是confirm询问对话框,用户选择“是”或“否”

                 {

                 layout = EConfirmationQueryLayout;

                 label = "对话框中显示的文字";

                 };

             }

         };

     }

此类对话框可以有声音提示,由NewL的const TTone& aTone参数指定,可能的值如下:

Code:


enum TTone {

     /// No tone is played

     ENoTone = 0,        

     /// A confirmation tone is played

     EConfirmationTone = EAvkonSIDConfirmationTone,

     /// A warning tone is played

     EWarningTone = EAvkonSIDWarningTone,      

     /// An error tone is played  

     EErrorTone = EAvkonSIDErrorTone         

     };

通过定义不同的询问对话框资源,可实现不同的询问对话框,如让用户输入文字的询问对话框资源定义如下:

Code:


RESOURCE DIALOG R_RESOURCE_DATA_QUERY

   {

   flags = EGeneralQueryFlags;

   buttons = R_AVKON_SOFTKEYS_OK_CANCEL;   //CBA按钮显示“确定”和“取消”

   items =

       {

       DLG_LINE

           {

           type = EAknCtQuery;

           id = EGeneralQuery;

           control = AVKON_DATA_QUERY   //表示这是data询问对话框,需要用户输入内容

               {

               layout = EDataLayout;

               label = "提示内容";

               control = EDWIN

                   {

                   flags = EEikEdwinNoHorizScrolling | EEikEdwinResizable;

                   width = 30;

                   lines = 2;

                   maxlength = 159;

                   };

               };

           }

       };

   }    

Code:


TBuf<128> msg;

CAknTextQueryDialog* dlg = new (ELeave) CAknTextQueryDialog(msg,CAknQueryDialog::ENoTone);

   TInt ret = dlg->ExecuteLD(R_RESOURCE_DATA_QUERY);

用户输入内容后按“确定”,内容就存储到msg中,函数返回非0;按“取消”,函数返回0。

这里用到的类是CAknQueryDialog的子类CAknTextQueryDialog。

CAknQueryDialog的子类有:

Code:


CAknFloatingPointQueryDialog   //This class should be used when user is reguest to enter a flotaing point number

   CAknFixedPointQueryDialog      //...

   CAknDurationQueryDialog        //This class should be used when user is reguest to enter duration

   CAknIpAddressQueryDialog       //This class should be used when user is reguest to enter IP address,@since 2.1

   CAknMultiLineDataQueryDialog   //Query Dialog with data input on more than one line (2 lines at the moment)

                  Create using NewL methods and passing parameters as appropriate.

                  Attention: When deriving from this class, you must call SetDataL during

                  second phase construction.

   CAknMultiLineIpQueryDialog     //...

   CAknNumberQueryDialog          //This class should be used when user is reguest to enter number

  
CAknTextQueryDialog            //This class should be used when user is
reguest to enter plain text, secret text, phonenumber or PIN-code

CAknTimeQueryDialog            //This class should be used when user is reguest to enter time or date

使用不同的类,资源文件会有所不同。

另外,在资源中定义EDWIN时,可指定输入发,如:

Code:


control = EDWIN

   {

     flags = EEikEdwinNoHorizScrolling | EEikEdwinResizable;

     width = 11;

     lines = 1;

     maxlength = 11;

   avkon_flags = EAknEditorFlagFixedCase |

         EAknEditorFlagNoT9 | EAknEditorFlagSupressShiftMenu;   //EAknEditorFlagSupressShiftMenu屏蔽切换输入法键

   allowed_input_modes = EAknEditorNumericInputMode;

   default_input_mode = EAknEditorNumericInputMode;

   numeric_keymap = EAknEditorPlainNumberModeKeymap;

   };

以上写法表示默认输入法为数字,并且屏蔽了输入法切换键,即不能通过输入法切换键来切换输入法。



6、编辑框


编辑框使用的类:CEikGlobalTextEditor

头文件:eikgted.h

Code:


CEikGlobalTextEditor* iGKeyEd;

TBuf<128> iKeyText;

TResourceReader reader;

iCoeEnv->CreateResourceReaderLC( reader, R_RESOURCE_EDITOR );   //从资源文件构造编辑框,资源见下面的定义

iGKeyEd = new ( ELeave ) CEikGlobalTextEditor;

iGKeyEd->SetContainerWindowL( *this );

iGKeyEd->ConstructFromResourceL( reader );

CleanupStack::PopAndDestroy();   // Resource reader

//设置编辑框的初始文本和位置,编辑框大小在资源中定义

TBuf<32> buf;

buf.Copy(_L("demo"));

iGKeyEd->SetTextL(&buf);

iGKeyEd->SetExtent( TPoint(5,2), iGKeyEd->MinimumSize() );

iGKeyEd->SetFocus(ETrue);

// iGKeyEd->SetReadOnly(ETrue);   //设置编辑框为只读

//使文字居中

CParaFormat      paraFormat; 

TParaFormatMask paraFormatMask;

paraFormatMask.SetAttrib( EAttAlignment );     // set mask

paraFormat.iHorizontalAlignment = CParaFormat::ECenterAlign;

iGKeyEd->ApplyParaFormatL( ¶Format, paraFormatMask );

  

iGKeyEd->GetText(iKeyText); //获取编辑框中的内容,保存到iKeyText中

RESOURCE GTXTED R_RESOURCE_EDITOR   //编辑框资源  

   {

     flags = EAknEditorFlagDefault;

     width = 53;

     height = 16;

     numlines = 1;

     textlimit= 1;

     fontcontrolflags = EGulFontControlAll;

     fontnameflags = EGulNoSymbolFonts;

//这里也可设置输入法

//    avkon_flags = EAknEditorFlagFixedCase |

                                  
EAknEditorFlagNoT9 | EAknEditorFlagSupressShiftMenu;  
//EAknEditorFlagSupressShiftMenu屏蔽切换输入法键

//     allowed_input_modes = EAknEditorNumericInputMode;

//     default_input_mode = EAknEditorNumericInputMode;

//     numeric_keymap = EAknEditorPlainNumberModeKeymap;  

   }

注意,要使编辑框正常显示,记得更改container的CountComponentControls
和ComponentControl函数,正确处理控件数目和编辑框指针。另外,要使编辑框能正常接收按键事件,要显示调用编辑框的
OfferKeyEventL函数,如下:
Code:


TKeyResponse CMobileGuardSetKeyContainer::OfferKeyEventL( const TKeyEvent& aKeyEvent, TEventCode aType )

{

     return iGKeyEd->OfferKeyEventL( aKeyEvent, aType );

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息