×
Namespaces

Variants
Actions

如何定制文本框的背景

From Nokia Developer Wiki
Jump to: navigation, search

Contents

概述

本文介绍了如何使用定制绘图器为文本框添加定制背景,使用本文介绍的方法可以在文本框的背景上任意绘制。

关键字

CEikEdwin CEikRichTextEditor CreateCustomDrawL CLafEdwinCustomDrawBase DrawBackground SystemColor

方案

背景色

以下文章包含对该主题的讨论:

How to use custom background color for edwin in 3rd

How to use custom background color for edwin in 2nd

皮肤背景

控件(例如自定义容器或其中的文本框)可以重用皮肤背景作为自己的背景。以下文章很好地解释了该主题,因此这里不再赘述。


Using Skins in S60

Drawing skins in container

TSS000683 - Using the same background as built-in applications


仅列出两个示例程序,它们使用主窗体的皮肤背景作为文本框的背景(因此看上去文本框就像是拥有透明背景)。

完整的示例程序: S602ndFP2(TransparentEdwin).zip

完整的示例程序: S603rd(TransparentEdwin).zip


定制背景

为了给文本框应用定制背景,必须首先自CEikEdwin派生一个定制文本框,然后重载它的CreateCustomDrawL()方法返回一个定制绘图器。

class CMyEdwin : public CEikEdwin
{
protected:
CLafEdwinCustomDrawBase* CreateCustomDrawL();
};
 
CLafEdwinCustomDrawBase* CMyEdwin::CreateCustomDrawL()
{
return CMyCustomDraw::NewL(iEikonEnv->LafEnv(), *this);
}

定制绘图器派生自己CLafEdwinCustomDrawBase,通过重载它的DrawBackground()方法就可以在文本框的背景上任意绘制。这里我们贴了一张图作为文本框的背景。

class CMyCustomDraw : public CLafEdwinCustomDrawBase
{
...
public:
void DrawBackground(const TParam& aParam,const TRgb& aBackground,TRect& aDrawn) const;
...
};
 
void CMyCustomDraw::DrawBackground(const TParam& aParam,const TRgb& aBackground,TRect& aDrawn) const
{
CLafEdwinCustomDrawBase::DrawBackground(aParam, aBackground, aDrawn);
if((iBitmap!=NULL)&&(iBitmap->Handle()!=0))
{
TRect rect = TRect(TPoint(0,0), iBitmap->SizeInPixels());
aParam.iGc.SetClippingRect(aParam.iDrawRect);
aParam.iGc.DrawBitmap(rect, iBitmap);
}
}

以下是示例程序和它们在仿真器上的屏幕截图。

完整的示例程序: S602nd(EdwinBackground).zip

完整的示例程序: S603rd(EdwinBackground).zip

该方案对CEikRichTextEditor也适用,参见以下示例程序:

完整的示例程序: S602nd(RichTextEdwinBackground).zip

完整的示例程序: S603rd(RichTextEdwinBackground).zip

进一步的讨论:如果你想改变文本框的大小和位置,同时想为它绘制正确的定制背景,那么需要根据文本框的位置计算一个偏移量,然后对DrawBackground()做少量修改。

class CMyCustomDraw : public CLafEdwinCustomDrawBase
{
...
public:
void DrawBackground(const TParam& aParam,const TRgb& aBackground,TRect& aDrawn) const;
...
public:
CCoeControl* iParent; // iParent是文本框的父控件,在创建custom draw类时由外部传入
};
 
 
void CMyCustomDraw::DrawBackground(const TParam& aParam,const TRgb& aBackground,TRect& aDrawn) const
{
CLafEdwinCustomDrawBase::DrawBackground(aParam, aBackground, aDrawn);
if((iBitmap!=NULL)&&(iBitmap->Handle()!=0))
{
TPoint point = TPoint(0, iParent.Position().iY-iParent.PositionRelativeToScreen().iY); // 计算文本框的偏移量
TRect rect = TRect(point, iBitmap->SizeInPixels());
aParam.iGc.SetClippingRect(aParam.iDrawRect);
aParam.iGc.DrawBitmap(rect, iBitmap);
}
}
This page was last modified on 30 May 2013, at 07:37.
81 page views in the last 30 days.
×