日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

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

發(fā)布時間:2023/12/20 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Symbian学习笔记(22) - 关于皮肤的小结 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

在Symbian中使用皮膚是一個讓我這樣新手頗覺得費勁的事情。折騰了一天,把幾種情況都試驗了一把,總結一下吧。

1.一句話的方法

最基本的一招就是在AppUi中的ConstructL()中加一句話搞定。如下:

void CTestMIMAppUi::ConstructL() {
BaseConstructL(CAknAppUi::EAknEnableSkin);
//add your code here...
}

用上面這句話基本上能讓大部分控件的透明化,顯示出系統(tǒng)的皮膚。

但是,有時我們會發(fā)現(xiàn)部分控件(比如那個CEikEdwin)仍顯示的一個難看的白底,此時,我們需要做一些額外的工作了。

修改Container的頭文件,增加一個成員變量:

CAknsBasicBackgroundControlContext* iBgContext; 然后在對應的ConstructL函數(shù)中初始它:

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.終極方法顯示系統(tǒng)皮膚

再進一步,如果控件沒有這么方便的成員讓我們去設置它的背景,也有辦法(參考http://www.newlc.com/Enable-Skin-support-in-your.html)。

很好辦,先在H文件中增加一個MopSupplyObject的聲明:

TTypeUid::Ptr MopSupplyObject(TTypeUid aId);

然后實現(xiàn)中,ContructL中就不用iEdWin->SetSkinBackgroundControlContextL了,而是在三個函數(shù)中分別處理:

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);
}

這樣也可以讓控件透明顯示出系統(tǒng)皮膚。

3.顯示自定義皮膚

來說自定義皮膚的顯示,關鍵在于那個iBgContext成員如何弄出來,前面的NewL()的第一個參數(shù)是系統(tǒng)定義的東西,現(xiàn)在我們需要自定義了。

同樣,先修改一個H文件,增加一個成員:

TAknsItemID aSkinItem;

然后實現(xiàn)文件中的ContructL函數(shù)中,我們要從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) - 关于皮肤的小结的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內容還不錯,歡迎將生活随笔推薦給好友。