Symbian学习笔记(22) - 关于皮肤的小结
2008-07-15 15:12
375 查看
在Symbian中使用皮肤是一个让我这样新手颇觉得费劲的事情。折腾了一天,把几种情况都试验了一把,总结一下吧。
1.一句话的方法
最基本的一招就是在AppUi中的ConstructL()中加一句话搞定。如下:
但是,有时我们会发现部分控件(比如那个CEikEdwin)仍显示的一个难看的白底,此时,我们需要做一些额外的工作了。
修改Container的头文件,增加一个成员变量:
然后,因为CEidEdwin有一个很方便的成员方法SetSkinBackgroundControlContextL,所以接下来的代码就简单了:
这样就可以了。别忘了,在析构时delete它。
2.终极方法显示系统皮肤
再进一步,如果控件没有这么方便的成员让我们去设置它的背景,也有办法(参考http://www.newlc.com/Enable-Skin-support-in-your.html)。
很好办,先在H文件中增加一个MopSupplyObject的声明:
然后实现中,ContructL中就不用iEdWin->SetSkinBackgroundControlContextL了,而是在三个函数中分别处理:
这样也可以让控件透明显示出系统皮肤。
3.显示自定义皮肤
来说自定义皮肤的显示,关键在于那个iBgContext成员如何弄出来,前面的NewL()的第一个参数是系统定义的东西,现在我们需要自定义了。
同样,先修改一个H文件,增加一个成员:
然后实现文件中的ContructL函数中,我们要从MIF文件中取图片弄成背景:
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学习笔记(6)——关于多线程与活动对象
- Symbian学习笔记(6):关于多线程与活动对象
- flex学习笔记 皮肤(三)--关于填充的学习
- 关于学习Flex皮肤的一点小结
- 孙鑫关于DLL(Dynamic Link Library)动态链接库的视频讲座笔记和学习小结
- springmvc学习笔记(22)-springmvc开发小结
- python学习笔记(一)——关于正则表达式的学习小结
- springmvc学习笔记(22)-springmvc开发小结
- C++学习笔记22 关于多重继承 接口
- 我的java学习笔记(22)关于在框架中显式信息
- 关于C#的@字符的学习笔记(摘自百度文库)
- Symbian学习笔记(18) - 初探Web Services API 的使用(中)
- 我的学习笔记-----关于图片文件传输接收
- GCC-3.4.6源代码学习笔记(22)
- java学习笔记:关于IO转换流InputStreamReader和OutputStreamWriter
- 学习ubuntu的笔记--关于网络连接
- java学习笔记 4种内部类小结
- 【R语言学习笔记】关于提取各类模型值的意外发现
- Java学习笔记之五——关于"equals"和“==”的区别
- Xcode学习笔记中关于如何定义宏问题解决