1.一句话的方法html
最基本的一招就是在AppUi中的ConstructL()中加一句话搞定。以下:函数
C++代码
- void CTestMIMAppUi::ConstructL() {
- BaseConstructL(CAknAppUi::EAknEnableSkin);
-
- }
用上面这句话基本上能让大部分控件的透明化,显示出系统的皮肤。学习
可是,有时咱们会发现部分控件(好比那个CEikEdwin)仍显示的一个难看的白底,此时,咱们须要作一些额外的工做了。this
修改Container的头文件,增长一个成员变量:google
C++代码
- CAknsBasicBackgroundControlContext* iBgContext;
而后在对应的ConstructL函数中初始它:spa
C++代码
- iBgContext = CAknsBasicBackgroundControlContext::NewL(KAknsIIDQsnBgAreaMainIdle,aRect,ETrue);
这儿的KAknsIIDQsBgAreaMainIdle你能够选择其它的,不碍事的。
而后,由于CEidEdwin有一个很方便的成员方法SetSkinBackgroundControlContextL,因此接下来的代码就简单了:code
C++代码
- 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它。htm
2.终极方法显示系统皮肤图片
再进一步,若是控件没有这么方便的成员让咱们去设置它的背景,也有办法(参考http://www.newlc.com/Enable-Skin-support-in-your.html)。资源
很好办,先在H文件中增长一个MopSupplyObject的声明:
C++代码
- TTypeUid::Ptr MopSupplyObject(TTypeUid aId);
而后实现中,ContructL中就不用iEdWin->SetSkinBackgroundControlContextL了,而是在三个函数中分别处理:
C++代码
- 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文件,增长一个成员:
C++代码
- TAknsItemID aSkinItem;
而后实现文件中的ContructL函数中,咱们要从MIF文件中取图片弄成背景:
C++代码
- 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文件(与其它例子中加载资源图像的方法相似)。