实现状态面板的显示与隐藏

实现状态面板的显示与隐藏

下午练习了一下状态面板的显示与隐藏,参考的代码是把 container 做为一个控件,放到 view 中,然后 在 AknViewAppUi 中创建 view ,基中在资源文件中定义  view 的 menu_bar,通过写这个代码又复习了一下 view 的写法

  1. 引用 aknviewappui.h
  2. 写一个类从 CAknViewAppUi 继承
  3. 重写 TUid Id() const 方法
  4. 重写  void DoActivateL (const TVwsViewId &aPrevViewId, TUid aCustomMessageId, const TDesC8 &aCustomMessage) 
  5. 重写 void DoDeactivate () 方法
  6. 写 NewL 与 NewLC 及 ConstructL 方法,实现二阶构造
  7. void HandleCommandL (TInt aCommand)  这个方法本身不做处理,而是让 aknViewAppUi 去处理
  8. 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;
            }
iAppContainer->SetRect(ClientRect()); 目地是重新设定大小,并通过 DrawNow 去重绘,否则会留下上次的面板,看起来没有隐藏掉


可以实现状态面板的显示与隐藏

关于 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

原文地址:https://www.cnblogs.com/zziss/p/1663068.html