Symbian学习笔记(20)——关于皮肤的小结
创始人
2024-03-25 10:50:28
0
在Symbian中使用皮肤是一个让我这样新手颇觉得费劲的事情。把几种情况都试验了一把,总结一下吧。

  最基本的一招就是在AppUi中的ConstructL()中加一句话搞定。如下:

view plaincopy to clipboardprint?
  1. void CTestMIMAppUi::ConstructL() {
     BaseConstructL(CAknAppUi::EAknEnableSkin);
    //add your code here...
    }
      

  用上面这句话基本上能让大部分控件的透明化,显示出系统的皮肤。

  但是,有时我们会发现部分控件(比如那个CEikEdwin)仍显示的一个难看的白底,此时,我们需要做一些额外的工作了。

  修改Container的头文件,增加一个成员变量:

view plaincopy to clipboardprint?
  1. CAknsBasicBackgroundControlContext* iBgContext;  

  然后在对应的ConstructL函数中初始它:

 

view plaincopy to clipboardprint?
  1. iBgContext = CAknsBasicBackgroundControlContext::NewL(KAknsIIDQsnBgAreaMainIdle,aRect,ETrue);  

  这儿的KAknsIIDQsBgAreaMainIdle你可以选择其它的,不碍事的。

  然后,因为CEidEdwin有一个很方便的成员方法SetSkinBackgroundControlContextL,所以接下来的代码就简单了:

 

view plaincopy to clipboardprint?
  1. iEdWin=new(ELeave)CEikEdwin;
     CleanupStack::PushL(iEdWin);
     iEdWin->SetContainerWindowL(*this); 
     iEdWin->ConstructL();
     iEdWin->SetSkinBackgroundControlContextL(iBgContext);
     iEdWin->SetExtentToWholeScreen();
     iEdWin->SetFocus(ETrue);
     iEdWin->ActivateL();
     CleanupStack::Pop(iEdWin);  

  这样就可以了。别忘了,在析构时delete它。

  2.终极方法显示系统皮肤

  再进一步,如果控件没有这么方便的成员让我们去设置它的背景,也有办法(参考http://www.newlc.com/Enable-Skin-support-in-your.html)。

  很好办,先在H文件中增加一个MopSupplyObject的声明:

 

view plaincopy to clipboardprint?
  1. TTypeUid::Ptr MopSupplyObject(TTypeUid aId);  

  然后实现中,ContructL中就不用iEdWin->SetSkinBackgroundControlContextL了,而是在三个函数中分别处理:

 

view plaincopy to clipboardprint?
  1. void CTestMIMEdtContainer::Draw(const TRect& aRect) const {
     CWindowGc& gc = SystemGc();

     MAknsSkinInstance* skin = AknsUtils::SkinInstance();
     MAknsControlContext* cc = AknsDrawUtils::ControlContext( this );
     AknsDrawUtils::Background( skin, cc, this, gc, aRect );
    }

    void CTestMIMEdtContainer::SizeChanged() {
     if(iBgContext)
      {
        iBgContext->SetRect(Rect());
                     if ( &Window() )
                     {
                             iBgContext->SetParentPos( PositionRelativeToScreen() );
                     }
      } 
     DrawNow();
    }
    TTypeUid::Ptr CTestMIMEdtContainer::MopSupplyObject(TTypeUid aId)
    {
     if (iBgContext )
      {
        return MAknsControlContext::SupplyMopObject( aId, iBgContext );
      }
      return CCoeControl::MopSupplyObject(aId);
    }  


 

  这样也可以让控件透明显示出系统皮肤。

  3.显示自定义皮肤

  来说自定义皮肤的显示,关键在于那个iBgContext成员如何弄出来,前面的NewL()的第一个参数是系统定义的东西,现在我们需要自定义了。

  同样,先修改一个H文件,增加一个成员:

view plaincopy to clipboardprint?
  1. TAknsItemID aSkinItem;  

 

  然后实现文件中的ContructL函数中,我们要从MIF文件中取图片弄成背景:

 

view plaincopy to clipboardprint?
  1. TFileName iMFileName;
     iMFileName.Copy(KMifFileName);
     CompleteWithAppPath(iMFileName);
     
     aSkinItem.iMinor = 0xE2139689;
     aSkinItem.iMajor = 1 ;

     CAknsItemDef* mainBgItemDef = AknsUtils::CreateBitmapItemDefL(aSkinItem, iMFileName, EMbmTestmimGrid);
     AknsUtils::SkinInstance()->SetLocalItemDefL( mainBgItemDef ); 
     iBgContext = CAknsBasicBackgroundControlContext::NewL(aSkinItem,aRect,ETrue );

  这儿的KMifFileName是定义的资源MIF文件(与其它例子中加载资源图像的方法类似)。

【编辑推荐】

  1. Symbian每6个月发布一款新开源操作系统
  2. 微软建WindowsMarketplace 完善智能机平台
  3. 大力模仿Android 传微软WM6.5可装插件

相关内容

热门资讯

PHP新手之PHP入门 PHP是一种易于学习和使用的服务器端脚本语言。只需要很少的编程知识你就能使用PHP建立一个真正交互的...
网络中立的未来 网络中立性是什... 《牛津词典》中对“网络中立”的解释是“电信运营商应秉持的一种原则,即不考虑来源地提供所有内容和应用的...
各种千兆交换机的数据接口类型详... 千兆交换机有很多值得学习的地方,这里我们主要介绍各种千兆交换机的数据接口类型,作为局域网的主要连接设...
全面诠释网络负载均衡 负载均衡的出现大大缓解了服务器的压力,更是有效的利用了资源,提高了效率。那么我们现在来说一下网络负载...
什么是大数据安全 什么是大数据... 在《为什么需要大数据安全分析》一文中,我们已经阐述了一个重要观点,即:安全要素信息呈现出大数据的特征...
如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
P2P的自白|我不生产内容,我... 现在一提起P2P,人们就会联想到正在被有关部门“围剿”的互联网理财服务。×租宝事件使得劳...
Intel将Moblin社区控... 本周二,非营利机构Linux基金会宣布,他们将担负起Moblin社区的管理工作,而这之前,Mobli...
施耐德电气数据中心整体解决方案... 近日,全球能效管理专家施耐德电气正式启动大型体验活动“能效中国行——2012卡车巡展”,作为该活动的...