在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操作系统知识,帮助你快速入门并深入理解其工作原理。 一、Symbian系统概述 Symbian操作系统最初由英国的EPOC公司开发,后被诺基亚收购并成为其主要的操作系统平台。...
【Symbian学习笔记概述】 Symbian操作系统是一款曾经广泛应用于智能手机的操作系统,尤其在诺基亚手机上占据主导地位。对于想要学习Symbian开发的初学者来说,理解其开发环境的搭建至关重要。本系列笔记共28讲,...
这些"Symbian学习笔记"涵盖了关于该平台的广泛知识,包括系统架构、编程语言、开发环境以及应用构建等方面。 1. **Symbian系统架构**:Symbian采用微内核设计,由四个主要部分组成:实时操作系统内核(OS Kernel)...
塞班论坛是一个专门为塞班(Symbian)操作系统用户提供交流平台的社区,其中涉及了大量的技术讨论和资源分享。本文将详细介绍“塞班证书签名程序”的相关知识点,以及如何使用DOSPY签名工具v2.2.9.0627.exe来给SIS或...
学习 CleanupStack #### 5.1 CleanupStack 的概念 CleanupStack 是 Symbian 系统中一种特殊的数据结构,主要用于异常处理和资源清理。当程序发生异常时,CleanupStack 会自动回溯并清理之前分配的资源,避免内存...
总结来说,通过这个“塞班贝拉游戏——贪吃蛇源码”项目,我们可以学习到如何利用Java编程技术进行游戏开发,理解游戏的基本逻辑和控制机制,同时也可以了解到塞班系统上的应用开发特点。对于想要进一步探索移动游戏...
看到一款死亡笔记天天动听皮肤,很好看,和大家分享一下。
**Symbian操作系统详解** Symbian是一款历史悠久的智能手机操作系统,尤其在2000年至2010年间,它是全球领先的移动设备...通过深入学习和实践,开发者可以从Symbian中学到很多关于移动平台优化和资源管理的宝贵经验。
《基于塞班平台的Small-Water游戏设计与实现》是一个典型的毕业设计项目,它涉及到的是在塞班(Symbian)操作系统上开发游戏的过程。塞班系统曾是智能手机市场的主流平台,尤其在功能手机时代,它拥有广泛的用户基础...
由于本人目前允许上传的资源太小,所以无法上传整个的技术学习笔记(JAVA 五年的工作经验和学习笔记),待以后有机会会分享给大家。 技术体系包括: J2SE/J2ME/J2EE/JAVA代码优化/Flex(BlazeDS、PureMVC等技术)...
**Symbian操作系统开发基础** Symbian操作系统(Symbian OS)是早期智能手机平台的先驱,尤其在诺基亚手机中广泛使用。本文档将深入探讨Symbian C++编程的基础,帮助开发者理解如何在Symbian平台上构建应用程序。 ...
【塞班S60-V3 嘟嘟录音】是一款专为塞班S60第三版(Symbian S60 v3)平台设计的录音软件。该软件提供了高效、便捷的录音功能,适用于诺基亚等品牌在该系统平台上运行的手机。以下是关于这个录音应用的详细知识点: ...
《Symbian OS类型与声明详解》 Symbian OS是一款专为移动设备设计的操作系统,其开发过程中涉及了大量的类型定义和声明。本篇将深入探讨Symbian OS中的核心类型系统,帮助开发者理解其独特之处,以便更好地进行平台...
Symbian OS 是一款专为移动设备设计的操作系统,它起源于英国的Psion公司,后来发展成为一家由诺基亚、爱立信、摩托罗拉等多家电信巨头共同投资的公司。Symbian OS以其高效能、多任务处理能力和适应不同硬件平台的...