Chinaunix首页 | 论坛 | 博客
  • 博客访问: 22171
  • 博文数量: 28
  • 博客积分: 670
  • 博客等级: 上士
  • 技术积分: 285
  • 用 户 组: 普通用户
  • 注册时间: 2010-05-09 11:27
文章分类

全部博文(28)

文章存档

2011年(28)

我的朋友
最近访客

分类: 嵌入式

2011-01-29 12:36:36

引用自:http://blog.csdn.net/sharetop/archive/2008/07/15/2654055.aspx

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.终极方法显示系统皮肤

再进一步,如果控件没有这么方便的成员让我们去设置它的背景,也有办法(参考)。

很好办,先在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文件(与其它例子中加载资源图像的方法类似)。

阅读(426) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~