×
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.
100 page views in the last 30 days.

Was this page helpful?

Your feedback about this content is important. Let us know what you think.

 

Thank you!

We appreciate your feedback.

×