Symbian学习笔记(20)——关于皮肤的小结

系统
在Symbian中使用皮肤是一个让我这样新手颇觉得费劲的事情。把几种情况都试验了一把,总结一下吧。
在Symbian中使用皮肤是一个让我这样新手颇觉得费劲的事情。把几种情况都试验了一把,总结一下吧。

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

  1. void CTestMIMAppUi::ConstructL() {<BR> BaseConstructL(CAknAppUi::EAknEnableSkin);<BR>//add your code here...<BR>}<BR>  

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

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

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

  1. CAknsBasicBackgroundControlContext* iBgContext;  

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

 

  1. iBgContext = CAknsBasicBackgroundControlContext::NewL(KAknsIIDQsnBgAreaMainIdle,aRect,ETrue);  

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

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

 

  1. iEdWin=new(ELeave)CEikEdwin;<BR> CleanupStack::PushL(iEdWin);<BR> iEdWin->SetContainerWindowL(*this); <BR> iEdWin->ConstructL();<BR> iEdWin->SetSkinBackgroundControlContextL(iBgContext);<BR> iEdWin->SetExtentToWholeScreen();<BR> iEdWin->SetFocus(ETrue);<BR> iEdWin->ActivateL();<BR> CleanupStack::Pop(iEdWin);  

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

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

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

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

 

  1. TTypeUid::Ptr MopSupplyObject(TTypeUid aId);  

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

 

  1. void CTestMIMEdtContainer::Draw(const TRect& aRect) const {<BR> CWindowGc& gc = SystemGc();<BR><BR> MAknsSkinInstance* skin = AknsUtils::SkinInstance();<BR> MAknsControlContext* cc = AknsDrawUtils::ControlContext( this );<BR> AknsDrawUtils::Background( skin, cc, this, gc, aRect );<BR>}<BR><BR>void CTestMIMEdtContainer::SizeChanged() {<BR> if(iBgContext)<BR>  {<BR>    iBgContext->SetRect(Rect());<BR>                 if ( &Window() )<BR>                 {<BR>                         iBgContext->SetParentPos( PositionRelativeToScreen() );<BR>                 }<BR>  } <BR> DrawNow();<BR>}<BR>TTypeUid::Ptr CTestMIMEdtContainer::MopSupplyObject(TTypeUid aId)<BR>{<BR> if (iBgContext )<BR>  {<BR>    return MAknsControlContext::SupplyMopObject( aId, iBgContext );<BR>  }<BR>  return CCoeControl::MopSupplyObject(aId);<BR>}  


 

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

  3.显示自定义皮肤

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

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

  1. TAknsItemID aSkinItem;  

 

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

 

  1. TFileName iMFileName;<BR> iMFileName.Copy(KMifFileName);<BR> CompleteWithAppPath(iMFileName);<BR> <BR> aSkinItem.iMinor = 0xE2139689;<BR> aSkinItem.iMajor = 1 ;<BR><BR> CAknsItemDef* mainBgItemDef = AknsUtils::CreateBitmapItemDefL(aSkinItem, iMFileName, EMbmTestmimGrid);<BR> AknsUtils::SkinInstance()->SetLocalItemDefL( mainBgItemDef ); <BR> iBgContext = CAknsBasicBackgroundControlContext::NewL(aSkinItem,aRect,ETrue );

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

【编辑推荐】

  1. Symbian每6个月发布一款新开源操作系统
  2. 微软建WindowsMarketplace 完善智能机平台
  3. 大力模仿Android 传微软WM6.5可装插件
责任编辑:庞桂玉 来源: it168
相关推荐

2009-04-12 08:57:50

Symbian诺基亚移动OS

2009-04-12 09:03:50

Symbian诺基亚移动OS

2009-04-12 08:59:05

Symbian诺基亚移动OS

2009-04-12 09:00:08

Symbian诺基亚移动OS

2009-04-12 09:02:32

Symbian诺基亚移动OS

2009-04-12 09:06:00

Symbian诺基亚移动OS

2009-04-12 09:01:05

Symbian诺基亚移动OS

2009-04-12 08:50:08

Symbian诺基亚移动OS

2009-04-12 08:36:09

Symbian诺基亚移动OS

2009-04-12 08:55:18

Symbian诺基亚移动OS

2009-04-12 08:51:50

Symbian诺基亚移动OS

2009-04-12 08:48:47

Symbian诺基亚移动OS

2009-04-12 08:45:32

Symbian诺基亚移动OS

2009-04-12 08:46:43

Symbian诺基亚移动OS

2009-12-15 14:01:10

路由选择协议

2009-12-29 16:02:15

光纤接入网

2009-12-11 11:07:33

静态路由策略

2011-09-01 14:14:00

jQuery Mobi

2011-08-29 10:01:27

QTWebkit插件

2011-08-23 17:33:08

LuaMetatable
点赞
收藏

51CTO技术栈公众号