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

来源:互联网 发布:四方精创java培训生 编辑:程序博客网 时间:2024/06/06 14:32

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

                  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;
                                   };
                               }
                           };
                       }
                  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( &paraFormat, 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 );
                  }

原创粉丝点击