Symbian学习笔记(22) - 关于皮肤的小结
在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文件(與其它例子中加載資源圖像的方法類似)。
?
總結
以上是生活随笔為你收集整理的Symbian学习笔记(22) - 关于皮肤的小结的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C# 20行代码解析KRC歌词内容
- 下一篇: 网站都变成灰色,一行代码就搞定了!