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可装插件

相关内容

热门资讯

如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
施耐德电气数据中心整体解决方案... 近日,全球能效管理专家施耐德电气正式启动大型体验活动“能效中国行——2012卡车巡展”,作为该活动的...
20个非常棒的扁平设计免费资源 Apple设备的平面图标PSD免费平板UI 平板UI套件24平图标Freen平板UI套件PSD径向平...
德国电信门户网站可实时显示全球... 德国电信周三推出一个门户网站,直观地实时提供其安装在全球各地的传感器网络检测到的网络攻击状况。该网站...
为啥国人偏爱 Mybatis,... 关于 SQL 和 ORM 的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行...
《非诚勿扰》红人闫凤娇被曝厕所... 【51CTO.com 综合消息360安全专家提醒说,“闫凤娇”、“非诚勿扰”已经被黑客盯上成为了“木...
2012年第四季度互联网状况报... [[71653]]  北京时间4月25日消息,据国外媒体报道,全球知名的云平台公司Akamai Te...