实现状态面板的显示与隐藏
下午练习了一下状态面板的显示与隐藏,参考的代码是把 container 做为一个控件,放到 view 中,然后 在 AknViewAppUi 中创建 view ,基中在资源文件中定义 view 的 menu_bar,通过写这个代码又复习了一下 view 的写法
- 引用 aknviewappui.h
- 写一个类从 CAknViewAppUi 继承
- 重写 TUid Id() const 方法
- 重写 void DoActivateL (const TVwsViewId &aPrevViewId, TUid aCustomMessageId, const TDesC8 &aCustomMessage)
- 重写 void DoDeactivate () 方法
- 写 NewL 与 NewLC 及 ConstructL 方法,实现二阶构造
- void HandleCommandL (TInt aCommand) 这个方法本身不做处理,而是让 aknViewAppUi 去处理
- void HandleStatusPaneSizeChange () 这个是在状态面板改变时要处理的方法
其中绕了一个很大的圈,代码都写在了资源文件中及 把新建的工程转成 view 模式了,等到写面板时发现代码只有几句,如下
CEikStatusPane* pan = StatusPane();
这样可以得到一个面板,然后通过
if (pan->CurrentLayoutResId() != R_AVKON_STATUS_PANE_LAYOUT_EMPTY)
{ pan->SwitchLayoutL(R_AVKON_STATUS_PANE_LAYOUT_EMPTY); } else { pan->SwitchLayoutL(R_AVKON_STATUS_PANE_LAYOUT_IDLE); } 即可实现状态面板的显示与隐藏 |
上面的代码写在 AknViewAppUi 中的 HandleCommandL 中,找一个菜单,把代码加到那个菜单中就行
如果直接通过向导生成一个传统模式的工程,可以在 AppUi 中写如下代码
case EStatusLxCmdAppTest: { //iEikonEnv->InfoMsg(_L("test")); CEikStatusPane* pan = StatusPane(); if (pan->CurrentLayoutResId() != R_AVKON_STATUS_PANE_LAYOUT_EMPTY) { pan->SwitchLayoutL(R_AVKON_STATUS_PANE_LAYOUT_EMPTY); iAppContainer->SetRect(ClientRect()); iAppContainer->DrawNow(); } else { pan->SwitchLayoutL(R_AVKON_STATUS_PANE_LAYOUT_IDLE); iAppContainer->SetRect(ClientRect()); iAppContainer->DrawNow(); } break; } |
可以实现状态面板的显示与隐藏
关于 R_AVKON_STATUS_PANE_LAYOUT_EMPTY 的 layout 的说明
一共有 4 种 layout R_AVKON_STATUS_PANE_LAYOUT_IDLE 实现一个带时钟的状态面板 R_AVKON_STATUS_PANE_LAYOUT_USUAL (default) 默认的 R_AVKON_STATUS_PANE_LAYOUT_POWER_OFF_RECHARGE 默认的,就是系统启动后的(我测试是那种),看英文是电源关闭在充电中 R_AVKON_STATUS_PANE_LAYOUT_EMPTY 实现关闭面板 |
上面几种通过 SwitchLayoutL 去设定
安平2009@原创
qi_jianzhou@126.com