简单对话框PlayGame.cpp在搞了大约一个星期左右,终于看见想要的框了,不过还不太完善,先写出这个星期来所学到的问题吧!
1.首先要定义资源:
RESOURCE DIALOG r_simpledlg_player_name_dialog {
flags = EEikDialogFlagNoDrag | EEikDialogFlagCbaButtons | EEikDialogFlagWait;
buttons = R_AVKON_SOFTKEYS_OK_CANCEL;
items =
{
DLG_LINE
{
id = EConfirmationNoteDlgCIdPlayerName;
type = EEikCtLabel;
control = LABEL
{
};
},
DLG_LINE
{
id = EConfirmationNoteDlgCIdPlayerNameEditor;
type = EEikCtEdwin;
control = EDWIN
{
maxlength = 20 ;
};
}
};
}
2.接下来编写对话框
//ExecuteLD()-用于装载、显示和销毁对话框的函数,按惯例,该方法命名为RunDlgLD(),并令它传递ExecuteLD()返回TBool
//类CSimpleDlgPlayerNameDialog提供一个静态的RunDlgLD()方法用于构建对话框
TBool CSimpleDlgPlayerNameDialog::RunDlgLD(TDes& aPlayerName)
{
CSimpleDlgPlayerNameDialog* playerNameDialog = new (ELeave) CSimpleDlgPlayerNameDialog(aPlayerName);
return playerNameDialog->ExecuteLD(R_SIMPLEDLG_PLAYER_NAME_DIALOG);
}
3.然后是保存和验证对话框数据
TBool CSimpleDlgPlayerNameDialog::OkToExitL(TInt aButtonId)
{
if (aButtonId == EAknSoftkeyOk)
{
CEikEdwin* editor = static_cast<CEikEdwin*>(ControlOrNull (EConfirmationNoteDlgCIdPlayerNameEditor));
if (editor)
{
//使用CEikEdwin::GetText()获取用户为游戏者名字输入的文本。iPlayerName设置为编辑器中的值
editor->GetText(iPlayerName);
}
}
return ETrue;
}
4.动态地初始化标准对话框
void CSimpleDlgPlayerNameDialog::PreLayoutDynInitL()
{
//使用ControlNull()方法获取适当的句柄。然后使用适当的方法设置此控件的值
CEikLabel* label = static_cast<CEikLabel*>(ControlOrNull (EConfirmationNoteDlgCIdPlayerName));
if (label)
{
HBufC* labelText = StringLoader::LoadLC(R_BUF_LABEL_PLAYGAME_ID);
//通过调用CEikEdwin::SetTextL()并传入从应用程序资源文件读取的值设置数据。
label->SetTextL(*labelText);
CleanupStack::PopAndDestroy(labelText);
}
}
5.构建和执行对话框
void CPlayGameAppUi::HandleCommandL(TInt aCommand) {
switch (aCommand)
{
case ESimpleDlgNewGame:
{
TBuf16<16> str;
if (CSimpleDlgPlayerNameDialog::RunDlgLD(str))
{
StartNewGameL();
//printf(str);
}
break;
}
大致是这五个步骤
我又声明了一个类CSimpleDlgPlayerNameDialog,在这个类里面声明创建对话框所需要的各个函数
TBool CSimpleDlgPlayerNameDialog::RunDlgLD(TDes& aPlayerName)
TBool CSimpleDlgPlayerNameDialog::OkToExitL(TInt aButtonId)
void CSimpleDlgPlayerNameDialog::PreLayoutDynInitL()
以及它的构造函数
CSimpleDlgPlayerNameDialog::CSimpleDlgPlayerNameDialog(TDes& aPlayerName):iPlayerName(aPlayerName){}
析构函数CSimpleDlgPlayerNameDialog::~CSimpleDlgPlayerNameDialog()
{
if (labelText)
{
delete labelText;
labelText = NULL;
}
if (label)
{
delete label;
label = NULL;
}
if (editor)
{
delete editor;
editor = NULL;
}
}
注意:
(1)在写构造函数的时候几乎折腾了一天,因为不清楚构造函数应该怎么写,实际上构造函数就是把它的成员变量初始化的过程,假如不初始化,那就会提示错误!
再有就是构造函数在头文件中声明的时候一定要和函数参数类型保持一致TDes & iPlayerName;
(2)在析构函数中一定要注意把新建的对象释放掉
(3)错误提示:
没有合适的构造函数,这个错误一般有两个原因,一个是没有声明和定义构造函数,另外一个原因是有了构造函数,在调用的时候函数参数不匹配,
比如下面这个构造函数没有参数,那么调用时候也不需要参数,可写成new (ELeaveL) CPlayGameAppUi,但是下面的构造函数有参数,那么调用它的时候也需要有参数,比如形式[2],就应该写成new (ELeaveL) CPlayGameAppUi(aPlayerName)
[1]
CPlayGameAppUi::CPlayGameAppUi()
{
}
[2]
CPlayGameAppUi::CPlayGameAppUi(TDes& aPlayerName):iPlayerName(aPlayerName)
{
}
(4)要再写一个playname.hrh文件,这个文件里面是定义各个ID,
比如
EConfirmationNoteDlgCIdPlayerName、EConfirmationNoteDlgCIdPlayerNameEditor等以enum的形式一一列举出来
(5)在.rss文件中RESOURCE RSS_SIGNATURE 、RESOURCE TBUF、RESOURCE EIK_APP_INFO这三个之间什么都不能加,要连续的写
(6)若在对话框中加入字符串就要写一个.loc文件和.01、02、03文件,通过
RESOURCE TBUF r_buf_label_playgame_id { buf = playgame_str_label_playgame_id; }
和HBufC* labelText = StringLoader::LoadLC(R_BUF_LABEL_PLAYGAME_ID);把字符串添加到对话框中
(7)注意CountComponentControls()地返回值,一定要匹配
如果iLabel和iEdwinName都为空,那么函数return 0;
如果iLabel不为空,iEdwinName都为空,那么函数return 1;
如果iLabel为空,iEdwinName不为空,那么函数return 1;
如果iLabel和iEdwinName都不为空,那么函数return 2;
TInt CPlayGameContainer::CountComponentControls() const {
return 1; // return nbr of controls inside this container
}
// Returns the child control at the given index, NULL if none.
CCoeControl* CPlayGameContainer::ComponentControl(TInt aIndex) const {
switch ( aIndex )
{
case 0:
return iLabel;
case 1:
return iEdwinName;
default:
return NULL;
}
})
(8)要注意描述符的写法。
(9)学会用断点来调程序

被折叠的 条评论
为什么被折叠?



