Symbian 自定义控件

自定义控件
添加一个新的类,然后让类继承CCoeControl,
并引入头文件#include <COECNTRL.H>

 

关键:添加Draw()、SizeChanged()、OfferKeyEventL()函数

 


1.在.h中添加
class CSimple : public CCoeControl
{
public: // Constructors and destructor

   
    ~CSimple();

       
    static CSimple* NewL(const TRect& aRect,const CCoeControl* aParent);

       
    static CSimple* NewLC(const TRect& aRect,const CCoeControl* aParent);

    void Draw(const TRect& aRect) const;

    void SizeChanged();

    TKeyResponse OfferKeyEventL( const TKeyEvent& aKeyEvent, TEventCode aType );

private:
   
    CSimple();
   
    void ConstructL(const TRect& aRect,const CCoeControl* aParent );
};



2.在.cpp文件中添加
CSimple::CSimple()
{
    // No implementation required
}


CSimple::~CSimple()
{
}

CSimple* CSimple::NewLC(const TRect& aRect,const CCoeControl* aParent)
{
    CSimple* self = new (ELeave)CSimple();
    CleanupStack::PushL(self);
    self->ConstructL(aRect , aParent);
    return self;
}

CSimple* CSimple::NewL(const TRect& aRect,const CCoeControl* aParent)
{
    CSimple* self=CSimple::NewLC(aRect , aParent);
    CleanupStack::Pop(); // self;
    return self;
}

void CSimple::ConstructL(const TRect& aRect,const CCoeControl* aParent)
{
    if (aParent == NULL)
    {
        CreateWindowL();
    }
    else
    {
        SetContainerWindowL(*aParent);
    }
    SetRect(aRect);
    ActivateL();
}

void CSimple::Draw( const TRect& aRect ) const
{
    CWindowGc& gc = SystemGc();
    gc.Clear(aRect);
//     gc.SetPenStyle(CGraphicsContext::ESolidPen);
//     gc.SetPenColor(KRgbBlack);
//     gc.SetBrushStyle(CGraphicsContext::ESolidBrush);
//     gc.SetBrushColor(KRgbBlack);
//     gc.DrawEllipse(aRect);
    gc.DrawLine(TPoint(0,0) , TPoint(100,100));
}
void CSimple::SizeChanged()
{
   
}

TKeyResponse CSimple::OfferKeyEventL( const TKeyEvent& aKeyEvent, TEventCode aType )
{
    if (EEventKeyDown == aType)
    {
        if (167 == aKeyEvent.iScanCode)
        {

        }
    }
}

 

 



3.在Container中调用的时候,在.h文件中

引入头文件
class CSimple;

定义自定义控件
CSimple * iSimple;


4.在.cpp文件中
#include "Simple.h"


构造函数中初始化
iSimple = NULL;


析构函数中删除
MEM_FREE(iSimple);


ConstructL函数中创建
iSimple = CSimple::NewL(TRect(TPoint(30,30) , TSize(100,100)) , NULL);
iSimple->SetFocus(ETrue);


CountComponentControls()函数中加一


ComponentControl()函数中返回自定义控件指针


OfferKeyEventL()函数中处理事件
if (iSimple->IsFocused())
{
    return iSimple->OfferKeyEventL(aKeyEvent , aType);
}




5.事件的相应。如果一个事件不是自定义控件空间处理的,那么自定义控件就要返回TKeyResponse状态值
TKeyResponse ret;
ret  = EKeyWasConsumed;        事件已经处理
ret  = EKeyWasNotConsumed;     事件没有处理
然后在Container类的OfferKeyEventL()函数中获取状态值,做相应的处理

例如:在自定义控件中,判断当前是“中键167”就返回给Container处理
    TKeyResponse CSimple::OfferKeyEventL( const TKeyEvent& aKeyEvent, TEventCode aType )
    {
        TKeyResponse ret;
        ret  = EKeyWasConsumed;
        if (EEventKeyDown == aType)
        {
            if (167 == aKeyEvent.iScanCode)
            {
                return EKeyWasNotConsumed;
            }
            else
            {
                return EKeyWasConsumed;
            }
        }
    }

Container中做相应的处理
    TKeyResponse ret;
    ret = EKeyWasConsumed;
    if (iSimple->IsFocused())
    {
        ret = iSimple->OfferKeyEventL(aKeyEvent , aType);
    }

    if (EEventKeyDown ==  aType)
    {
        //判断事件是否处理,下面是没有处理
        if (ret==EKeyWasNotConsumed)
        {
            TBuf<32> buf;
            buf.AppendNum(aKeyEvent.iScanCode);
            iEikonEnv->InfoMsg(buf);
            return ret;
        }
        //下面是按键已经处理
        else
        {
            iEikonEnv->InfoMsg(_L("EKeyWasConsumed"));
            return ret;
        }
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值