创建简单控件
1.创建一个派生于CCoeControl的类
2.实现构造代码(通常在ContructL()函数中)
3.重写虚函数Draw(),为控件提供绘制代码
4.重写虚函数SizeChanged(),在控件尺寸更改时重新布置它
class CSimpleControl
{
public:
static CSimpleControl* NewL(const TRect& aRect, const CCoeControl* aParent);
static CSimpleControl* NewLC(const TRect& aRect, const CCeoControl* aParent);
private:
void ContructL(const TRect& aRect, const CCoeControl* aParent);
void Draw(const TRect& aRect) const;
void SizeChanged();
private:
// Data...
};
每个控件都应该拥有一个ContructL()方法以执行其二段构造函数。对于大多数控件来说,该方法至少将执行下列步骤:
1.设置控件窗口窗口。这既可以是新窗口(这种情况下控件成为拥有窗口的控件),也可以是已经存在的窗口(这种情况下控件不拥有窗口)。
2.设置控件的工作区矩形,即此控件负责绘制的屏幕区域。
3.激活控件。这将通知UI框架已准备绘制该控件。
void CSimpleControl::ContructL(const TRect& aRect, const CCoeControl* aParent)
{
if (NULL== aParent)
{
CreateWindowL(); // 无父控件,因此作为拥有窗口者创建
}
else
{
SetContainerWindowL(*aParent); // 复合控件的一部分,因此共享父控件的窗口
}
SetRect(aRect);
ActivateL();
}
构建完成后,剩下的工作只需再实现CCoeControl的两个虚函数Draw()和SizeChanged()。
创建复合控件
复合控件的实现同简单控件相同,此外还需要完成以下工作
1.为该控件添加组件控件,通常把组件控件作为复合控件类的成员数据
2.重写虚函数CountComponentControls()和ComponentControl()以确保组件控件被绘制
复合控件的构造函数跟简单控件类似
class CCompoundControl : public CCoeControl
{
public: // constructors and destructor
static CCompoundControl* NewL(const TRect& aRect, const CCoeControl* aParent);
static CCompoundControl* NewLC(const TRect& aRect, const CCoeControl* aParent);
~CCompoundControl();
private: // constructor
void ConstructL(const TRect& aRect, const CCoeControl* aParent);
private: // from CoeControl
TInt CountComponentControls() const;
CCoeControl* ComponentControl(TInt aIndex) const;
void Draw(const TRect& aRect) const;
void SizeChanged();
private:
void CalculateRects();
private: // data
CSimpleControl* iTop;
CSimpleControl* iBottom;
TRect iTopRect;
TRect iBottomRect;
private: // member enum
enum TComponentControls
{
ETop = 0,
EBottom,
ENumberOfControls
};
};
在ContructL()中示例化组件成员
void CCompoundControl::ConstructL(const TRect& aRect, const CCoeControl* aParent)
{
if (aParent == NULL)
{
CreateWindowL();
}
else
{
SetContainerWindowL(*aParent);
}
// Size and construct the two component controls
CalculateRects();
iTop = CSimpleControl::NewL(iTopRect, this);
iBottom = CSimpleControl::NewL(iBottomRect, this);
SetRect(aRect);
ActivateL();
}
复合控件的绘制由三个函数共同负责:Draw(),CountComponentControls()和ComponentControl()。发生的次序为:
1.调用复合控件的Draw()
2.之后框架调用复合控件的CountComponentControls()获取其组件控件的个数
3.框架通过调用ComponentControl()遍历所有组件控件,获取每个控件的指针
对于复合控件来说,Draw()通常无关紧要,因为真正的绘制工作一般会被委派给组件控件。但规范的做法是,在绘制组件控件前,复合控件至少该用默认颜色填充其客户矩形。
void CCompoundControl::Draw(const TRect& aRect) const
{
CWindowGc& gc = SystemGc();
gc.Clear(aRect);
}
为使复合控件正常工作,最后需要添加SizeChanged()函数,与CSimpleControl不同,CCompoundControl需要一些重要代码来确保其组件控件的尺寸被正确的设置。