关于S60皮肤的小结

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

1.一句话的方法

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

void CTestMIMAppUi::ConstructL() { BaseConstructL(CAknAppUi::EAknEnableSkin);//add your code here...}用上面这句话基本上能让大部分控件的透明化,显示出系统的皮肤。

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

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


 CAknsBasicBackgroundControlContext* iBgContext;然后在对应的ConstructL函数中初始它:

iBgContext = CAknsBasicBackgroundControlContext::NewL(KAknsIIDQsnBgAreaMainIdle,aRect,ETrue);这儿的KAknsIIDQsBgAreaMainIdle你可以选择其它的,不碍事的。
然后,因为CEidEdwin有一个很方便的成员方法SetSkinBackgroundControlContextL,所以接下来的代码就简单了:

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的声明:

TTypeUid::Ptr MopSupplyObject(TTypeUid aId);然后实现中,ContructL中就不用iEdWin->SetSkinBackgroundControlContextL了,而是在三个函数中分别处理:


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文件,增加一个成员:

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

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文件(与其它例子中加载资源图像的方法类似)。

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/sharetop/archive/2008/07/15/2654055.aspx

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值