使用自定义皮肤

 

在S60 3rd程序上使用自定义皮肤的方式基本同S60 2nd上的使用方式是相同,但是,有时后还是很难调试出来,因此,决定做个小例子,给大家演示怎么使用自定义皮肤。

只用自定义皮肤的过程基本如下:
1.在AppUI类中,定义下面两个成员变量,这两个变量必须定义,不然,你的皮肤可能绘不出来哦,很多朋友绘不出来自定义皮肤,有可能就是把某个变量定义成局部变量了
   TAknsItemID m_SkinItemID;
    TFileName desSkinImagesFile;

2.在AppUI类的ConstuctL()函数中创建自定义皮肤,如下
 CEikAppUi* appUi = CEikonEnv::Static()->EikAppUi();
    CEikApplication* app = appUi->Application();
   
    desSkinImagesFile = (app->BitmapStoreName());
    desSkinImagesFile.SetLength(desSkinImagesFile.LocateReverse('//') + 1);
    desSkinImagesFile.Append(_L("SelfSkin.mif"));
   
    // Create background image - use our App UID to make it unique
    m_SkinItemID.iMajor = 0xECE7E35C;  //该处使用程序的ID就可以了

    m_SkinItemID.iMinor = 1;
    CAknsItemDef* pDef = AknsUtils::CreateMaskedBitmapItemDefL(m_SkinItemID,
      desSkinImagesFile,
      EMbmSelfskinClientbackground ,
      EMbmSelfskinClientbackground_mask);
   
    AknsUtils::SkinInstance()->SetLocalItemDefL(pDef);

3.在view或container中使用皮肤,在使用皮肤的类中定义下面的成员变量
   CAknsBasicBackgroundControlContext* m_pBackgroundContext;
 实现下面的方法
TTypeUid::Ptr CSkinExample3rdAppView::MopSupplyObject(TTypeUid aId)
 {
     if(aId.iUid == MAknsControlContext::ETypeId && m_pBackgroundContext)
     {
         return MAknsControlContext::SupplyMopObject(aId, m_pBackgroundContext);
     }
     return CCoeControl::MopSupplyObject( aId );
 }

  在构造函数中,创建m_pBackgroundContext
CSkinExample3rdAppUi* appUi = (CSkinExample3rdAppUi*)CEikonEnv::Static()->EikAppUi();
 m_pBackgroundContext = CAknsBasicBackgroundControlContext::NewL(appUi->m_SkinItemID, Rect(), EFalse);

4.在Draw()方法中绘制自定义的皮肤,如下
void CSkinExample3rdAppView::Draw( const TRect& aRect ) const
 {
 // Get the standard graphics context
 CWindowGc& gc = SystemGc();
 
 AknsDrawUtils::Background(AknsUtils::SkinInstance(),
         AknsDrawUtils::ControlContext(this),
         this,
         gc,
         aRect,
         KAknsDrawParamDefault);

 //以下做你自己的绘制工作
 
 }

基本的使用皮肤的过程就是这样的,如果大家看了还是不够明白,那就通过例子代码学习一下吧,希望能够为在第三版上使用自定义的遇到问题的网友提供参考,该例子中在s60 3rd mr版中调试通过。

=================================================================================================


如果控件的container实现了MopSupplyObject()并且返回了创建CAknsBasicBackgroundControlContext对象,那么就可以在自定义控件中通过下面的代码获取并使用:
Code:

void CYourControl:ConstructL()
{
//Get parent's skin context
MAknsControlContext *context = NULL;

MopGetObject( context );

if( context )
{
iBackground = static_cast<CAknsBasicBackgroundControlContext*>( context );
}
..................
}

void CYourControl::Draw(const TRect& aRect) const
{
CWindowGc& gc = SystemGc();

gc.Clear(aRect);

TRect rect = Rect();

if( iBackground )
{
MAknsSkinInstance* skin = AknsUtils::SkinInstance();
AknsDrawUtils::Background( skin, iBackground, this, gc, rect );
}
........................
}

如果控件的container没有实现并提供背景上下文对象,那就需要控件自己创建 CAknsBasicBackgroundControlContext。但在实践中我碰到了自定义控件自己创建 CAknsBasicBackgroundControlContext,但是背景的大小和位置总是不正确,造成同一container添加多个控件后,背景显示混乱的问题,最后还是通过前面的代码解决的。

系统控件对于皮肤的支持有下面的几种:
Compulsorily skin-providing controls:总是提供皮肤参数,不需要开发者额外操作,比如程序上方的control pane和status pane.

Optionally skin-providing controls:是否提供皮肤参数需要显示设置,比如list和grid需要显示调用ItemDrawer()->SetSkinEnabledL()来激活对皮肤的支持。

Skin-observing controls:本身并不提供皮肤参数,但是可以通MObjectProvider链猎取并使用皮肤,这时需要container获应用提供皮肤参数。

Non-skin-aware controls:既不提供也不使用皮肤参数。

===================================================

 

通过皮肤取Bitmap
MAknsSkinInstance* skin = AknsUtils::SkinInstance();

CAknsItemData* skinItem = skin->GetCachedItemData( someUID, EAknsITBitmap );   

if( skinItem != NULL )
{
CFbsBitmap* bitmap = static_cast<CAknsBitmapItemData*>(skinItem)->Bitmap();
}
CFbsBitmap* offScreenBitmap = new (ELeave) CFbsBitmap();
User::LeaveIfError( offScreenBitmap->Create( aSize, aDisplayMode ) );
CFbsBitGc* bitGc = 0;
CFbsBitmapDevice* bitmapDevice = CFbsBitmapDevice::NewL( offScreenBitmap );
User::LeaveIfError( bitmapDevice->CreateContext( bitGc ) );
// Draw the content on the off-screen bitmap
AknsDrawUtils::DrawBackground( AknsUtils::SkinInstance(),iSkinContext,this,*bitGc, TPoint(0,0), rect,KAknsDrawParamDefault );
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值