自定义控件
添加一个新的类,然后让类继承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;
}
}