在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版中调试通过。 包含附件:下载源码
************************************************************************************************** 移软Symbian培训中心原创,转载请注明出处。 |