创建控件

创建简单控件

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需要一些重要代码来确保其组件控件的尺寸被正确的设置。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值