一般情况下,标题面板显示应用程序的名字,但可以更改为自定义的标题,也可以改成一副图像,如果选择的标题过长以致超过了行宽,则此标题分为两行显示,如果两行也无法容纳,则会截断次标题,也可以把标题设成空字符串,此时将不显示标题。
TitlePane实例显示了如何更改标题面板的文本和怎样在标题面板中显示图像,以及如何在资源文件中静态定义标题面板。
1.更改标题面板的文本
void CTitlePaneAppUi::HandleCommandL(TInt aCommand)
{
switch (aCommand)
{
case EEikCmdExit:
case EAknSoftkeyExit:
Exit();
break;
//更改标题面板的文本
case ETitlePaneCmdTitleText:
{
//定义标题面板ID
TUid titlePaneUid;
titlePaneUid.iUid = EEikStatusPaneUidTitle;
//获取状态面板指针
CEikStatusPane* statusPane = this->StatusPane();
/**
* 通过状态面板的PaneCapabilities方法并为它传递一个标题面板ID,
* 然后该方法返回一个TPaneCapabilities对象。
* TPaneCapabilities是CEikStatusPane的一个内部类或嵌套类,
* 它能描述子面板(如标题面板、上下文面板、导航面板、信号面板等)
* 的一些状态(如该子面板是否存在于状态面板中)和能力(如子面板是否能被应用程序更改)。
*
CEikStatusPane::TPaneCapabilities subPane =
statusPane->PaneCapabilities(titlePaneUid);
/**
* IsPresent()判断标题面板是否存在
* IsAppOwned()检查标题面板是否能被引用程序更改
*
if(subPane.IsPresent() && subPane.IsAppOwned())
{
//状态面板虽然返回了CAknTitlePane的指针,但并未传递所属权,所以不需要使用清除栈
CAknTitlePane* titlePane = (CAknTitlePane*)statusPane->ControlL(titlePaneUid);
//从资源文件中加载标题文本
HBufC* titleText = StringLoader::LoadLC(R_TITLEPANE_TITLE_TEXT);
/**
* 可以使用SetText()设置标题文本,
* 但SetText()方法会取得其参数(titleText指针)的所属权,所以不需要删除titleText指针。
* 也可以使用SetTextL()设置标题文本,
* 但SetTextL()方法会复制其参数,不会取得该参数的所属权,所以需要自行删除titleText指针。
*
* 注意:使用SetTextL()方法时,传入的参数应该为*titleText而不是titleText->Des()
* 因为SetTextL()方法的参数为const TDesC&类型,是不可被修改的。
*
titlePane->SetTextL(*titleText);
CleanupStack::PopAndDestroy(titleText);
}
break;
}
default:
Panic(ETitlePaneUi);
break;
}
}
2.重置标题面板的默认值
void CTitlePaneAppUi::HandleCommandL(TInt aCommand)
{
switch (aCommand)
{
case EEikCmdExit:
case EAknSoftkeyExit:
Exit();
break;
//重置标题面板的默认值
case ETitlePaneCmdDefaultTitle:
{
TUid titlePaneUid;
titlePaneUid.iUid = EEikStatusPaneUidTitle;
//获取状态面板
CEikStatusPane* statusPane = this->StatusPane();
CEikStatusPane::TPaneCapabilities subPane =
statusPane->PaneCapabilities(titlePaneUid);
if(subPane.IsPresent() && subPane.IsAppOwned())
{
CAknTitlePane* titlePane = (CAknTitlePane*)statusPane->ControlL(titlePaneUid);
//重置标题面板的默认值
titlePane->SetTextToDefaultL();
}
break;
}
default:
Panic(ETitlePaneUi);
break;
}
}
3.在标题面板中显示图像
void CTitlePaneAppUi::HandleCommandL(TInt aCommand)
{
switch (aCommand)
{
case EEikCmdExit:
case EAknSoftkeyExit:
Exit();
break;
//在标题面板中显示图像
case ETitlePaneCmdTitleImage:
{
_LIT(KTitleBitMapFile, "\\system\\apps\\titlepane\\TitlePane.mbm");
TUid titlePaneUid;
titlePaneUid.iUid = EEikStatusPaneUidTitle;
CEikStatusPane* statusPane = this->StatusPane();
CEikStatusPane::TPaneCapabilities subPane =
statusPane->PaneCapabilities(titlePaneUid);
//如果可以访问标题面板
if(subPane.IsPresent() && subPane.IsAppOwned())
{
CAknTitlePane* titlePane =
(CAknTitlePane*)statusPane->ControlL(titlePaneUid);
CFbsBitmap* bitmap = iEikonEnv->CreateBitmapL(KTitleBitMapFile, EMbmTitlepaneTitle);
//设置标题面板的图像
titlePane->SetPicture(bitmap);
}
break;
}
default:
Panic(ETitlePaneUi);
break;
}
}
4. 在资源文件中更改标题面板的文本和图像
RESOURCE EIK_APP_INFO
{
status_pane = r_titlepane_status_pane;
menubar = r_titlepane_menubar;
cba = R_AVKON_SOFTKEYS_OPTIONS_EXIT;
}
//定义包含文本的标题面板
RESOURCE TITLE_PANE r_titlepane_title_pane
{
//标题文本
txt = qtn_titlepane_title_text;
}
//定义包含图像的标题面板
RESOURCE TITLE_PANE r_titlepane_title_pane
{
//标题图像
bmpid = EMbmTitlepaneTitle;
// bmpmaskid = EMbmTitlepaneMaskTitle
bmpfile = "\\system\\apps\\titlepane\\TitlePane.mbm";
}
//定义状态面板
RESOURCE STATUS_PANE_APP_MODEL r_titlepane_status_pane
{
panes =
{
SPANE_PANE
{
id = EEikStatusPaneUidTitle; //avkon.hrh 810
type = EAknCtTitlePane; //avkon.hrh 415
resource = r_titlepane_title_pane;
}
};
}