Symbian学习笔记(22) - 关于皮肤的小结

Symbian学习笔记(22) - 关于皮肤的小结

 
 

1.一句话的方法html

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

C++代码
  1. void CTestMIMAppUi::ConstructL() {  
  2. BaseConstructL(CAknAppUi::EAknEnableSkin);  
  3. //add your code here...  
  4. }  

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

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

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

 

C++代码
  1. CAknsBasicBackgroundControlContext* iBgContext;  

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

 

C++代码
  1. iBgContext = CAknsBasicBackgroundControlContext::NewL(KAknsIIDQsnBgAreaMainIdle,aRect,ETrue);  

这儿的KAknsIIDQsBgAreaMainIdle你能够选择其它的,不碍事的。
而后,由于CEidEdwin有一个很方便的成员方法SetSkinBackgroundControlContextL,因此接下来的代码就简单了:code

 

C++代码
  1. iEdWin=new(ELeave)CEikEdwin;  
  2. CleanupStack::PushL(iEdWin);  
  3. iEdWin->SetContainerWindowL(*this);  
  4. iEdWin->ConstructL();  
  5. iEdWin->SetSkinBackgroundControlContextL(iBgContext);  
  6. iEdWin->SetExtentToWholeScreen();  
  7. iEdWin->SetFocus(ETrue);  
  8. iEdWin->ActivateL();  
  9. CleanupStack::Pop(iEdWin);  

这样就能够了。别忘了,在析构时delete它。htm

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

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

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

 

C++代码
  1. TTypeUid::Ptr MopSupplyObject(TTypeUid aId);  

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

 

C++代码
  1. void CTestMIMEdtContainer::Draw(const TRect& aRect) const {  
  2.  CWindowGc& gc = SystemGc();  
  3.   
  4.  MAknsSkinInstance* skin = AknsUtils::SkinInstance();  
  5.  MAknsControlContext* cc = AknsDrawUtils::ControlContext( this );  
  6.  AknsDrawUtils::Background( skin, cc, this, gc, aRect );  
  7. }  
  8.   
  9. void CTestMIMEdtContainer::SizeChanged() {  
  10.  if(iBgContext)  
  11.   {  
  12.     iBgContext->SetRect(Rect());  
  13.                  if ( &Window() )  
  14.                  {  
  15.                          iBgContext->SetParentPos( PositionRelativeToScreen() );  
  16.                  }  
  17.   }   
  18.  DrawNow();  
  19. }  
  20. TTypeUid::Ptr CTestMIMEdtContainer::MopSupplyObject(TTypeUid aId)  
  21. {  
  22.  if (iBgContext )  
  23.   {  
  24.     return MAknsControlContext::SupplyMopObject( aId, iBgContext );  
  25.   }  
  26.   return CCoeControl::MopSupplyObject(aId);  
  27. }    

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

3.显示自定义皮肤

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

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

 

C++代码
  1. TAknsItemID aSkinItem;  

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

 

C++代码
  1. TFileName iMFileName;  
  2.  iMFileName.Copy(KMifFileName);  
  3.  CompleteWithAppPath(iMFileName);  
  4.   
  5.  aSkinItem.iMinor = 0xE2139689;  
  6.  aSkinItem.iMajor = 1 ;  
  7.   
  8.  CAknsItemDef* mainBgItemDef = AknsUtils::CreateBitmapItemDefL(aSkinItem, iMFileName, EMbmTestmimGrid);  
  9.  AknsUtils::SkinInstance()->SetLocalItemDefL( mainBgItemDef );   
  10.  iBgContext = CAknsBasicBackgroundControlContext::NewL(aSkinItem,aRect,ETrue );    

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