转载自:http://hi.baidu.com/richiechyi/blog/item/f4bd13a4032e1bf39152ee6d.html
Symbian 面板之状态面板(StatusBar)(ZT)
状态面板分为下列子面板:标题面板、上下文面板、导航面板、信号面板、电池面板和通用指示符面板。
要操作状态面板,首先应该通过CEikStatusPane* CAknAppUi::StatusPane()得到状态面板的指针。
CEikStatusPane提供了对状态面板进行操作的各种方法:
class CEikStatusPane : public CEikStatusPaneBase, public MCoeForegroundObserver;
Members
Defined in CEikStatusPane:
ApplyCurrentSettingsL(), HandleResourceChange(), MakeVisible(), NewL(), SetDimmed(), SetFaded(), ~CEikStatusPane()
Inherited from CBase:
operator new()
Inherited from CEikStatusPaneBase:
ContainerControlL(), ControlL(), Current(), GetShapeL(), IsDimmed(), IsFaded(), IsVisible(), PaneCapabilities(), PaneRectL(), ReduceRect(), SetFlags(), SetObserver(), SwapControlL(), SwitchLayoutL(), TPaneCapabilities, WindowGroup()
Inherited from MCoeForegroundObserver:
HandleGainingForeground(), HandleLosingForeground()
1.可见性操作
CEikStatusPane* statusPane = StatusPane();
if (statusPane->CurrentLayoutResId() != R_AVKON_STATUS_PANE_LAYOUT_EMPTY)
{
statusPane->SwitchLayoutL(R_AVKON_STATUS_PANE_LAYOUT_EMPTY);
}
else
{
statusPane->SwitchLayoutL(R_AVKON_STATUS_PANE_LAYOUT_USUAL);
}
CurrentLayoutResId()返回当前布局的资源ID,关于资源ID的定义可参照<avkon.rsg>,有以下几种, R_AVKON_STATUS_PANE_LAYOUT_IDLE,R_AVKON_STATUS_PANE_LAYOUT_USUAL, R_AVKON_STATUS_PANE_LAYOUT_POWER_OFF_RECHARGE, R_AVKON_STATUS_PANE_LAYOUT_EMPTY等。
SwitchLayoutL()把状态面板的布局更改为指定的资源ID。
注意,不应使用CEikStatusPane的IsVisible()和MakeVisible()来检查和设置面板的可见性,因为它们同时会隐藏电话拨入图标。
在对状态面板的子面板操作时,需要通过下面方法得到子面板(以更改标题面板文本为例):
TUid titlePaneUid;
titlePaneUid.iUid = EEikStatusPaneUidTitle;
CEikStatusPane* statusPane = StatusPane();
CEikStatusPaneBase::TPaneCapabilities subPane = statusPane->PaneCapabilities(titlePaneUid);
if (subPane.IsPresent() && subPane.IsAppOwned())
{
CAknTitlePane* titlePane = (CAknTitlePane*)statusPane->ControlL(titlePaneUid);
HBufC* titleText = StringLoader::LoadLC(R_HEWB_TITLE_TEXT);
titlePane->SetTextL(*titleText);
CleanupStack::PopAndDestroy(titleText);
}
要得到子面板,需要实现准备好子面板的ID,它们定义在<avkon.hrh>中,有下列几种: EEikStatusPaneUidSignal(信号面板),EEikStatusPaneUidBattery(电池面板), EEikStatusPaneUidContext(上下文面板),EEikStatusPaneUidTitle(标题面板), EEikStatusPaneUidNavi(导航面板),EEikStatusPaneUidIndic, EEikStatusPaneUidMessage,EEikStatusPaneUidClock。
TPaneCapabilities PaneCapabilities(TPaneId aPaneId)方法获取子面板的相关信息。TPaneCapabilities 是CEikStatusPaneBase的嵌套类,有IsPresent(),IsAppOwned(),IsInCurrentLayout()等方法。IsPresent()检查标题面板是否存在;IsAppOwned()检查面板是否能被应用程序更改;IsCurrentLayout()检测面板是否为当前面板布局的一部分。
一旦确定了面板存在并可修改,调用CCoeControl* CEikStatusPaneBase::ControlL(TPaneId aPaneId)得到子面板的指针,然后即可对其进行操作。关于标题面板和上下文面板的操作均较简单,可参照SDK中CAknTitlePane和 CAknContextPane。比较复杂的是导航面板,将另文介绍。