快捷搜索:  as

symbian对话框总结:标准对话框

Series60供给了一个周全的对话框类和基类聚拢,可以应用这些类创建自定义对话框,以及开拓窗体(form)、看护(note)、查询(query)和列表对话框(list dialog)等。

所有对话框共有某些基础属性。首先,对话框都是拥有窗口的控件,所有对话框类终极都派生于CCoeControl。然后,由一个对话框框架治理对话框的行径,包括结构、绘制以及用户与对话框在组件控件的交互。范例环境下,对付大年夜多半随意率性繁杂程度的对话框,都邑在一个资本文件中完备定义,并在动态实例化之后由对话框框架从资本文件装载此定义完成对话框的创建。对话框所有元素的结构和定位都是平日是自动的,当然也可以干预它。

Series60的对话框默认是模态和非等待的。模态/非模态无需多述;非等待对话框容许利用法度榜样在后台继承处置惩罚,而等待对话框会阻拦利用法度榜样在该对话框关闭前履行任何进一步的处置惩罚。

CAknDialog是大年夜部分Series60对话框的基类。关于对话框的应用,大年夜体分为以下步骤:1.定义资本。2.编写对话框类。3.保存和验证对话框数据。4.动态地初始化标准对话框。5.构建和履行对话框。

下面分手论述之:

1.定义资本

应用DIALOG定义资本,资本指定了对话框的结构,在资本中定义对话框应该包孕的行数、应用的控件、对话框是否为模态以及应用的软键等。下面以一个简单的例子示范:

RESOURCE DIALOG r_simpledlg_dialog

{

flags=EEikDialogFlagNoDrag |

EEikDialogFlagNoTitleBar |

EEikDialogFlagFillAppClientRect |

EEikDialogFlagCbaButtons |

EEikDialogFlagModeless;

buttons=R_AVKON_SOFTKEYS_OPTIONS_BACK;

items=

{

DLG_LINE

{

id=ESimpleDlgCIdGameName;

type=EEikCtLabel;

control= LABEL

{

txt = GAME_NAME_TEXT;

};

}

};

}

flags阐清楚明了对话框的属性,此中的属性值可参考<uikon.hrh>

#define EEikDialogFlagWait

#define EEikDialogFlagNotifyEsc

#define EEikDialogFlagButtonsBelow

#define EEikDialogFlagButtonsRight

#define EEikDialogFlagNoUserExit

#define EEikDialogFlagModeless

#define EEikDialogFlagNoTitleBar

#define EEikDialogFlagAllKeysToButtons

#define EEikDialogFlagFillScreen

#define EEikDialogFlagNoDrag

#define EEikDialogFlagDensePacking

#define EEikDialogFlagNoBackup

#define EEikDialogFlagFillAppClientRect

#define EEikDialogFlagCbaButtons

#define EEikDialogFlagNoBorder

#define EEikDialogFlagNoShadow

此中,把标准对话框定义为等待对话框是一种优越的习气。应该只在合理的时刻(例如在主利用法度榜样窗口中)才把标准对话框定义为非等待。

buttons指定了应用的软件,此中的取值可参考

#define R_AVKON_SOFTKEYS_EMPTY

#define R_AVKON_SOFTKEYS_EMPTY_WITH_IDS

#define R_AVKON_SOFTKEYS_OK_EMPTY

#define R_AVKON_SOFTKEYS_SELECT_CANCEL

#define R_AVKON_SOFTKEYS_OK_CANCEL

#define R_AVKON_SOFTKEYS_OK_DETAILS

#define R_AVKON_SOFTKEYS_CALL_CANCEL

#define R_AVKON_SOFTKEYS_OPTIONS_BACK

#define R_AVKON_SOFTKEYS_OPTIONS_DONE

#define R_AVKON_SOFTKEYS_OPTIONS_CANCEL

#define R_AVKON_SOFTKEYS_OPTIONS_EXIT

#define R_AVKON_SOFTKEYS_OK_BACK

#define R_AVKON_SOFTKEYS_CANCEL

#define R_AVKON_SOFTKEYS_BACK

#define R_AVKON_SOFTKEYS_CLOSE

#define R_AVKON_SOFTKEYS_DONE_BACK

#define R_AVKON_SOFTKEYS_DONE_CANCEL

#define R_AVKON_SOFTKEYS_SELECT_BACK

#define R_AVKON_SOFTKEYS_MARK_BACK

#define R_AVKON_SOFTKEYS_UNMARK_BACK

#define R_AVKON_SOFTKEYS_YES_NO

#define R_AVKON_SOFTKEYS_UNLOCK_EMPTY

#define R_AVKON_SOFTKEYS_SAVE_BACK

#define R_AVKON_SOFTKEYS_SHOW_CANCEL

#define R_AVKON_SOFTKEYS_SHOW_EXIT

#define R_AVKON_SOFTKEYS_ANSWER_EXIT

#define R_AVKON_SOFTKEYS_EXIT

#define R_AVKON_SOFTKEYS_READ_EXIT

#define R_AVKON_SOFTKEYS_LISTEN_EXIT

#define R_AVKON_SOFTKEYS_SEARCH_BACK

#define R_AVKON_SOFTKEYS_AGAIN_QUIT

#define R_AVKON_SOFTKEYS_QUIT

#define R_AVKON_SOFTKEYS_INSERT_BACK

关于RunDlgLD()的实现:

TBool CSimpleDlgPlayerNameDialog::RunDlgLD (TDes& aPlayerName)

{

CSimpleDlgPlayerNameDialog* playerNameDialog = new (ELeave) CSimpleDlgPlayerNameDialog(aPlayerName);

return playerNameDialog->ExecuteLD(R_SIMPLEDLG_PLAYER_NAME_DIALOG);

}

由于对话框是模态和等待的,以是不必要使它成为成员数据,此对话框在ExecuteLD()的着末会删除自己。

那么为什么在new之后没有将其压入清除栈呢?由于ExecuteLD()拥有改对话框的所有权,该措施包装了对其他两个措施的调用:PrepareLC()和RunLD()。PrepareLC()会把对话框的指针放入清除栈,然后完成对话框的创建。RunLD()会显示该对话框,然后把它从清除栈中弹出。但假如在调用ExecuteLD()之前必要调用随意率性可能导致非常退出的代码,则应该将其放入清除栈,并在调用 ExecuteLD()前把它弹出。

但,假如对话框为非等待的,则会直接从ExecuteLD()返回而不被删除。

3. 保存和验证对话框数据

为了使对话框能够更新利用法度榜样的数据,必要为它供给对这些数据的引用。对数据的验证和更新平日发生在OkToExitL()措施中进行,除“取消”外,按下随意率性软键时,框架都邑调用此函数(经由过程设定对话框的flags,使之包括EEikDialogFlagNotifyEsc,可以强制要求框架在“取消”被按下时也调用OkToExitL())。假如容许对话框退出,则OkToExitL()必须返回ETrue,假如不容许退出,则返回EFalse。下面示例之:

TBool CSimpleDlgPlayerNameDialog::OkToExitL(TInt aButtonId)

{

if (aButtonId == EAknSoftkeyOk)

{

CEikEdwin* editor = static_cast<CEikEdwin*>(ControlOrNull(ESimpleDlgCIdPlayerNameEditor));

if (editor)

{

editor->GetText(iPlayerName);

}

}

return ETrue;

}

经由过程调用CEikDialog::ControlOrNull()并传入对话框行的ID,可以获取特定控件的句柄,假如ID有效,则返回一个 CCoeControl的指针,后则返回NULL。假如ID无效必要退出,可应用CEikDialog::Control(),假如ID无效,该措施会掉足。

4. 动态地初始化标准对话框

动态地设置对话框中的项是在PreLayoutDynInitL()措施中履行。对话框框架会在对话框履行前调用该措施。

void CSimpleDlgPlayerNameDialog::PreLayoutDynInitL()

{

CEikLabel* label = static_cast<CEikLabel*>(ControlOrNull(ESimpleDlgCIdPlayerName));

if (label)

{

HBufC* labelText = StringLoader::LoadLC(R_ENTER_NAME_TEXT);

label->SetTextL(*labelText);

CleanupStack::PopAndDestroy(labelText);

}

}

假如必要,可以经由过程重写别的一个措施PostLayoutDynInitL(),变动对话框中控件的结构和大年夜小,或是在显示对话框之前启动一个准时器。

5. 构建和履行对话框

RunDlgLD()措施封装了对话框的构建和履行。

switch (aCommand)

{

case ESimpleDlgCmdNewGame:

{

if (CSimpleDlgPlayerNameDialog::RunDlgLD (iPlayerName))

{

StartNewGameL();

}

break;

}

// ...

}

经由过程反省ExecuteLD()或RunDlgLD()的返回值,可以得知对话框是若何被关闭的。返回EFalse阐明关闭对话框时按下的是“取消”、“退却撤退”或“否”,其他环境下返回ETrue。

您可能还会对下面的文章感兴趣: