Symbian OS的对话框

转贴:http://hi.baidu.com/wangfsun/blog/item/1d402d3da6fdaec29f3d62e6.html

 

 

Symbian OS的对话框分为模式对话框和非模式对话框。对话框首先需要在资源文件中定义(对话框所容纳的控件也需要在资源文件中定义),然后在程序中建立对话框对象并使用资源文件中的对话框id进行初始化,最后执行对话框并显示相关内容。
对话框的种类很多,除了标准对话框外,还有窗体、通知对话框、查询对话框、列表对话框等类型。
* 窗体:与列表控件相似,但不同的是,窗体的每一个数据项都是可以编辑的。
* 通知对话框:主要用于显示用户的提示信息。
* 查询对话框:包含一个编辑框,用户可以向文本编辑器输入数据供程序查询,主要用于数据查询中。
* 列表对话框:包含一个列表控件,可以显示多项数据。查询对话框:

数据查询对话框

在程序中首先要在资源文件中定义查询对话框:
RESOURCE DIALOG r_data_query_dialog
{
flags = EGeneralQueryFlags;
buttons = R_AVKON_SOFTKEYS_OK_CANCEL;
items =
     {
      DLG_LINE
      {
       type = EAknCtQuery;
       id = EDataQueryId;
       control = AVKON_DATA_QUERY
       {
        layout = EDataLayout;
        control = EDWIN
        {
         width = 20;
         lines = 1;
         maxlength = 20;
        };
       };
      }
     };
}
在查询对话框里还定义了一个编辑器控件,在资源文件中定义为EDWIN,并指定了它的宽度,行数和最大长度的属性。
列表查询对话框
它将各种选项以列表的形式显示出来,用户可以选取其中的任何一项。

Symbian常用对话框
2006-12-25 21:41
1、文本询问对话框
资源的定义(注意分号)

RESOURCE DIALOG r_text_query
    {
    flags = EGeneralQueryFlags;
    buttons = R_AVKON_SOFTKEYS_OK_CANCEL;
    items =
        {
        DLG_LINE
            {
            type = EAknCtQuery;
            id = EGeneralQuery;
            control = AVKON_DATA_QUERY
                {
                layout = EDataLayout;
                label = "";
                control = EDWIN
                    {
                    width = 5;
                    lines = 1;
                    maxlength = 15;
                    };
                };
            }
        };
    }

调用该类的代码

   TBuf<128> text; //保存用户输入信息
   TBuf<128> prompt(_L("Enter text:")); //提示
  
   CAknTextQueryDialog *dlg = new(ELeave)CAknTextQueryDialog(text, prompt);

   dlg->SetMaxLength(20);
   if (dlg->ExecuteLD(R_TEXT_QUERY))
   {     //OK被按下
   }

2、列表询问对话框
RESOURCE AVKON_LIST_QUERY r_demo_list_query
    {
    flags = EGeneralQueryFlags;
    softkeys = R_AVKON_SOFTKEYS_OK_CANCEL;
    items =
        {
        AVKON_LIST_QUERY_DLG_LINE
            {
            control = AVKON_LIST_QUERY_CONTROL
                {
                listtype = EAknCtSinglePopupMenuListBox;
                listbox = AVKON_LIST_QUERY_LIST
                    {
                    array_id = r_demo_list_query_item;
                    };
                heading = "Select one item:";
                };
            }
        };
    }

RESOURCE ARRAY r_demo_list_query_item
    {
    items =
        {
        LBUF {txt = "First item"; },
        LBUF {txt = "Second item"; },
        LBUF {txt = "Third item"; }
        };
    }

调用的代码
TInt index( 0 );
CAknListQueryDialog* dlg = new( ELeave ) CAknListQueryDialog( &index );
if ( dlg->ExecuteLD(R_DEMO_LIST_QUERY) )
   {
   // ok pressed, index is the selected item index.
   }

程序中动态设置列表项例子
TInt index( 0 );
CAknListQueryDialog* dlg = new( ELeave ) CAknListQueryDialog( &index );
CDesCArrayFlat *aArray = new(ELeave)CDesCArrayFlat(3);
TBuf<16> aString;

aString.Format(_L("Item %d"), 1);
aArray->AppendL(aString);
aString.Format(_L("Item %d"), 2);
aArray->AppendL(aString);
aString.Format(_L("Item %d"), 3);
aArray->AppendL(aString);

dlg->PrepareLC(R_DEMO_LIST_QUERY);
dlg->SetItemTextArray(aArray);
dlg->SetOwnershipType(ELbmOwnsItemArray);

if (dlg->RunLD()){}


3、另外Symbian中建立简单常用对话框的较快方法,无须使用资源

static TBool CEikonEnv::QueryWinL(const TDesC &aFirstLine, const TDesC &aSecondLine);
显示一个带有指定文本行的询问对话框,提供Yes/No。如选Yes,返回ETrue

static void CEikonEnv::InfoWinL(const TDesC &aFirstLine, const TDesC &aSecondLine);
显示一个带有指定文本行的信息对话框

static void CEikonEnv::AlertWinL(const TDesC &aFirstLine, const TDesC &aSecondLine);
显示一个带有指定文本行的报警对话框


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 );
}

标准对话框
Symbian OS中的对话框都从CAknDialog中继承,大多数对话框是一个容器,可以容纳其他控件。下面示例如何在资源文件中定义一个带有编辑框的对话框:
RESOURCE DIALOG r_dialog_edit_dialog
{
       flags = EEikDialogFlagNoDrag | EEikDialogFlagCbaButtons | EEikDialogFlagWait;
       buttons = R_AVKON_SOFTKEYS_OK_CANCEL;
       items = {
            DLG_LINE
            {
                 id = EConfirmationNoteDlgCIdFileName;
                 type = EEikCtLabel;
                 control = LABEL { };
            },
            DLG_LINE
            {
                 id = EConfirmationNoteDlgCIdEditor;
                 type = EEikCtEdwin;
                 control = EDWIN { maxlength = 20; };    
            }
      };
}
DIALOG有以下几个属性需要设置:
1.flag属性。定义对话框自身的性质。示例中定义了三个属性--EEikDialogFlagNoDrag(不可拖动), EEikDialogFlagCbaButtons(使用软键),

EEikDialogFlagWait(等待)。这些标志在uikon.hrh中定义。
2.buttons属性。指出对话框使用的软键。在avkon.rsg中定义。
3.items属性。定义了对话框中实际包含的内容。items由一些DLG_LINE组成,每一个DLG_LINE包含了一个控件。
4.DLG_LINE属性。表示对话框的每一行,控件通常由id,type和control组成。

在资源文件中定义好对话框之后,即可以编写对话框类,Symbian OS的所有对话框类都从CAknDialog继承而来。需要包含头文件akndialog.h。

以下是CAknDialog的几个重要函数:
1.PreLayoutDynInitL(),完成对话框装载前的初始化工作。对话框中控件的初始化在此函数中进行,通过对话框的成员函数ControlOrNull()来通过id得到控件指针;如果id存在,返回CCoeControl指针,如果不存在,返回NULL。可以使用函数Control()来得到控件指针,与ControlOrNull()不同的是,如果id不存在,Control()返回一个错误。
2.OkToExitL(),点击OK键(EAknSoftkeyOk),对话框退出之前调用此函数以获取对话框中控件的数据。
3.静态函数TBool RunDlgLD(),该函数包含一个对话框的一阶构造函数ExecuteLD(),该函数用来构造、显示和销毁对话框。在程序中显示对话框,只需调用CXXXDialog::RunDlgLD()即可。
TBool CSimpleDialog::RunDlgLD()
{
CSimpleDialog* dialog=new(ELeave) CSimpleDialog();
return dialog->ExecuteLD(R_DIALOG_EDIT_DIALOG);
}
ExecuteLD()调用了CAknDialog的两个函数PrepareLC()和RunLD()。其中PrepareLC()负责将对话框指针放到清理栈,完成对话框的构建。

RunLD()负责对话框的显示。

等待通知和进度通知的用法  
MAknBackgroundProcess有四个接口函数  
void   DialogDismissedL(TInt   /*aButtonId*/);    
TBool   IsProcessDone()   const;  
void   ProcessFinished();      
void   StepL();      
一个MAknBackgroundProcess应该对应一个CActive  
应该与CAknWaitNoteWrapper配合使用,当CAknWaitNoteWrapper调用执行方法以后。就会弹出指定对话框,然后不断询问是否IsProcessDone()。如果IsProcessDone就结束对话框的等待。首先你需要定义一个对话框  
RESOURCE   DIALOG   r_waitnote_load_image_note  
{  
flags=EAknWaitNoteFlags;  
items   =  
{  
DLG_LINE  
{  
type   =   EAknCtNote;  
id   =   ENoteDlgCIdOpenImageNote;  
control   =   AVKON_NOTE  
{  
layout   =   EWaitLayout;  
singular_label   =   "load   image   ,please   wait";  
imagefile   =   "z://system/data/avkon.mbm";  
imageid   =   EMbmAvkonQgn_note_progress;  
imagemask   =   EMbmAvkonQgn_note_progress_mask;  
animation   =   R_QGN_GRAF_WAIT_BAR_ANIM;  
};  
}  
};  
}  
在你的代码中加入:  
CAknWaitNoteWrapper*   waitNoteWrapper   =   CAknWaitNoteWrapper::NewL();  
//   Required   reinterpret_cast   as   CAknWaitNoteWrapper   inherits   privately   from   CActive  
CleanupStack::PushL(reinterpret_cast<CBase*>(waitNoteWrapper));  
   
TInt   Result=0;  
Result=waitNoteWrapper->ExecuteL(R_WAITNOTE_LOAD_IMAGE_NOTE,   *this);  
if   (!Result   )   //   this   is   a   blocking   call,   remember   the   wrapper   isn't   a   dialog,   so   it  

doesn't   need   the   EEikDialogFlagWait   flag   to   make   it   blocking    
{  
// Cancel  
}  
CleanupStack::PopAndDestroy();  
}  

 

转贴:http://hi.baidu.com/wangfsun/blog/item/1d402d3da6fdaec29f3d62e6.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值