zoukankan      html  css  js  c++  java
  • 如何为Series60绘制一个常驻顶端的提示图标 [symbian]

    Image:Home.PNG

    Image:Menu.PNG

    Image:Switch.PNG

    适用版本

    S60 2nd Edition FP3, S60 3rd Edition

    本文将简述如何在Series60中绘制一个始终处于前端的图标提示符,实际效果如上图所示,无论是处于待机界面,菜单界面或者切换时,一个音符的小图标始终都可见。这么做可以为一些应用程序起到提示的作用,比如在一个IM软件中,可以用它来提示有未读的消息等。

    1.如何构建 以下的构建过程基于我提供的示例程序: 构建一个CIndicatorIcon类来表示这个提示图标,它是从CCoeControl继承而来。它的第二阶段构造函数ConstructL()如下所示:

     void CIndicatorIcon::ConstructL()
           {
           iMyWindowGroup = RWindowGroup(iCoeEnv->WsSession());
           User::LeaveIfError(iMyWindowGroup.Construct((TUint32)&iMyWindowGroup));
           iMyWindowGroup.SetOrdinalPosition(0, ECoeWinPriorityAlwaysAtFront);
           iMyWindowGroup.EnableReceiptOfFocus(EFalse);
           CreateWindowL(&iMyWindowGroup);
           // 默认情况下把提示图标设置为inactive
           SetIndicatorIconL(EIndicatorIconAppActive);
           ActivateL();
           }
    

    在ConstructL()中调用了SetIndicatorIconL()来设置图标,以下是该函数的具体实现:

     void CIndicatorIcon::SetIndicatorIconL(TIndicatorIcon aIndicatorIconType, TBool aRedraw)
           {
           switch(aIndicatorIconType)
                   {
                   case EIndicatorIconEmpty:
                           iIndicator = CEikonEnv::Static()->CreateBitmapL(KSysIconFile, EMbmAvkonQgn_prop_empty);
                           iIndicatorMask = CEikonEnv::Static()->CreateBitmapL(KSysIconFile, EMbmAvkonQgn_prop_empty_mask);
                           break;
                   case EIndicatorIconAppActive:
                           iIndicator = CEikonEnv::Static()->CreateBitmapL(KSysIconFile, EMbmAvkonQgn_bt_connect_on);
                           iIndicatorMask = CEikonEnv::Static()->CreateBitmapL(KSysIconFile, EMbmAvkonQgn_bt_connect_on_mask);
                           break;
                   case EIndicatorIconAppInactive:
                           iIndicator = CEikonEnv::Static()->CreateBitmapL(KSysIconFile, EMbmAvkonQgn_prop_bt_audio);
                           iIndicatorMask = CEikonEnv::Static()->CreateBitmapL(KSysIconFile, EMbmAvkonQgn_prop_bt_audio_mask);
                           break;
                   default:
                           break;
                   }
           SetRect(TRect(TPoint(KIndicatorPosX, KIndicatorPosY),iIndicator->SizeInPixels()));
          // 当aRedraw == ETrue时仅重绘
           if(aRedraw)
                   {
                   DrawNow();
                   }
           }
    

    同时必须重写CCoeControl的Draw()函数,在适当的位置绘制提示图标。

     void CIndicatorIcon::Draw(const TRect& aRect) const
           {
           CWindowGc& gc = SystemGc();
           gc.Clear();
           gc.SetBrushStyle(CGraphicsContext::ENullBrush);
           gc.BitBltMasked(TPoint(aRect.iTl.iX, aRect.iTl.iY), 
                   iIndicator, 
                   TRect(TPoint(0, 0), iIndicator->SizeInPixels()), 
                   iIndicatorMask, 
                   ETrue);
           }
    

    到此你就完成了CIndicatorIcon类的构建。

    2.如何使用 只要在你的程序的AppUi的ConstructL()中加入以下语句:

     iIndicatorIcon = CIndicatorIcon::NewL();
     // 以下该行设置需要绘制的图标
     iIndicatorIcon->SetIndicatorIconL(CIndicatorIcon::EIndicatorIconAppInactive, ETrue);
    

    完成了,是的,就是这么简单。

  • 相关阅读:
    虚拟化之kvm与xen对比
    Java实现第九届蓝桥杯小朋友崇拜圈
    Java实现第九届蓝桥杯小朋友崇拜圈
    Java实现第九届蓝桥杯小朋友崇拜圈
    Java实现第九届蓝桥杯小朋友崇拜圈
    Java实现第九届蓝桥杯小朋友崇拜圈
    Java实现第九届蓝桥杯等腰三角形
    Java实现第九届蓝桥杯等腰三角形
    Java实现第九届蓝桥杯等腰三角形
    Java实现第九届蓝桥杯等腰三角形
  • 原文地址:https://www.cnblogs.com/zziss/p/2026342.html
Copyright © 2011-2022 走看看