如果一个页面中的布局类似于表单。就是有很多控件需要用户填写,就要自己处理上下方向键了。
1.在.h文件中添加新的数据结构,用于存放控件的标题:
class CTextItem
{
public:
TPoint iPt;
TBuf<32> iValue;
};
2.
private:
RPointerArray<CTextItem> iTextItem; //显示的提示信息
RPointerArray<CCoeControl> iControl; //所有的控件
CCoeControl * iCurControl; //当前控件
TRect iRect; //屏幕的区域
TInt iHeight; //屏幕的高度
TInt iStartY; //开始的位置
public:
//初始化控件
void InitControl(const TRect& aRect);
//初始化所有的文本信息
void InitText();
//当按上下键的时候,判断是否需要重新计算高度
//如果上下移动,上下控件没有显示在屏幕中,就重新计算坐标。如果重新计算坐标后,该控件可以显示在屏幕中,就把光标设置到该上下控件中
//如果上下移动,上下控件显示在屏幕中,就直接把光标设置到屏幕中
void JudgeRect(const TUint aDirection);
//当移动上下键的时候,重新计算位置
void ReCalcRect();
3.在.cpp中定义
//
const TInt KADeviation = 40; //偏差
const TInt KAHigh = 20; //每次浮动的高度
//
4.在构造函数中初始化
iStartY = 40;
5.在ConstructL()中
void CWorldContainer::ConstructL(const TRect& aRect)
{
CreateWindowL();
iRect = aRect; //客户区域
iHeight = aRect.Size().iHeight;
//初始化控件
InitControl(aRect);
InitText();
ReCalcRect();
SetRect(aRect);
ActivateL();
}
6.析构函数中
CWorldContainer::~CWorldContainer()
{
iTextItem.ResetAndDestroy();
iControl.ResetAndDestroy();
}
7.
TInt CWorldContainer::CountComponentControls() const
{
return iControl.Count();
}
8.
CCoeControl* CWorldContainer::ComponentControl(TInt aIndex) const
{
if (aIndex > -1 && aIndex < iControl.Count())
{
return iControl[aIndex];
}
else
{
return NULL;
}
}
9.
void CWorldContainer::Draw(const TRect& aRect) const
{
CWindowGc& gc = SystemGc();
gc.Clear();
gc.SetBrushStyle(CGraphicsContext::ESolidBrush);
gc.SetBrushColor(KRgbGray);
gc.DrawRect(Rect());
const CFont* myFont = NULL;
myFont = LatinBold16();
gc.UseFont(myFont);
for (TInt i = 0; i < iTextItem.Count(); i++)
{
//显示"账号"
gc.DrawText(iTextItem[i]->iValue, iTextItem[i]->iPt);
}
gc.DiscardFont();
}
10.
TKeyResponse CWorldContainer::OfferKeyEventL(const TKeyEvent& aKeyEvent,
TEventCode aType)
{
TKeyResponse ret(EKeyWasConsumed);
if (aType != EEventKey)
ret = EKeyWasNotConsumed;
//当是上下方向键的时候,就直接处理。
if (EKeyUpArrow == aKeyEvent.iCode || EKeyDownArrow == aKeyEvent.iCode)
{
JudgeRect(aKeyEvent.iCode);
DrawDeferred();
return ret;
}
if (iCurControl->IsFocused())
{
iCurControl->OfferKeyEventL(aKeyEvent, aType);
}
DrawDeferred();
return ret;
}
11.
void CWorldContainer::InitControl(const TRect& aRect)
{
CEikEdwin * iEdwin0 = new (ELeave) CEikEdwin;
iEdwin0->SetContainerWindowL(*this);
iEdwin0->ConstructL(EEikEdwinWidthInPixels,10, 10, 1);
iEdwin0->SetFocus(ETrue);
iCurControl = iEdwin0;
iControl.Append(iEdwin0);
CEikEdwin * iEdwin1 = new (ELeave) CEikEdwin;
iEdwin1->SetContainerWindowL(*this);
iEdwin1->ConstructL(EEikEdwinWidthInPixels,10, 10, 1);
iEdwin1->SetFocus(EFalse);
iControl.Append(iEdwin1);
CEikEdwin * iEdwin2 = new (ELeave) CEikEdwin;
iEdwin2->SetContainerWindowL(*this);
iEdwin2->ConstructL(EEikEdwinWidthInPixels,10, 10, 1);
iEdwin2->SetFocus(EFalse);
iControl.Append(iEdwin2);
}
12.
void CWorldContainer::InitText()
{
//------
CTextItem * pT0 = new (ELeave) CTextItem;
pT0->iValue.Append(_L("Text 0"));
iTextItem.Append(pT0);
//------
CTextItem * pT1 = new (ELeave) CTextItem;
pT1->iValue.Append(_L("Text 1"));
iTextItem.Append(pT1);
//------
CTextItem * pT2 = new (ELeave) CTextItem;
pT2->iValue.Append(_L("Text 2"));
iTextItem.Append(pT2);
}
13.
void CWorldContainer::JudgeRect(const TUint aDirection)
{
//获取当前的ID
TInt nCurControlID = 0;
for (TInt i = 0; i < iControl.Count(); i++)
{
if (iControl[i]->IsFocused())
{
nCurControlID = i;
break;
}
}
TInt nHeight = 0;
//向上
if (EKeyUpArrow == aDirection)
{
//如果是第一个,返回
if (nCurControlID == 0)
{
//如果没有显示标题。
if (iTextItem[0]->iPt.iY < KADeviation)
{
iStartY += KAHigh;
ReCalcRect();
}
return;
}
nCurControlID--;
nHeight = iControl[nCurControlID]->Rect().iTl.iY;
if (nHeight < 0)
{
iStartY += KAHigh;
ReCalcRect();
//如果大于0,就设置光标
if (nHeight > 0)
{
iCurControl->SetFocus(EFalse);
iCurControl = iControl[nCurControlID];
iCurControl->SetFocus(ETrue);
}
}
else
{
iCurControl->SetFocus(EFalse);
iCurControl = iControl[nCurControlID];
iCurControl->SetFocus(ETrue);
}
}
//向下
else if (EKeyDownArrow == aDirection)
{
//如果是最后一个,返回
if (nCurControlID == iControl.Count() - 1)
return;
nCurControlID++;
nHeight = iControl[nCurControlID]->Rect().iBr.iY;
if (nHeight > iHeight)
{
iStartY -= KAHigh;
ReCalcRect();
//如果大于0,就设置光标
if (nHeight < iHeight - KADeviation)
{
iCurControl->SetFocus(EFalse);
iCurControl = iControl[nCurControlID];
iCurControl->SetFocus(ETrue);
}
}
else
{
iCurControl->SetFocus(EFalse);
iCurControl = iControl[nCurControlID];
iCurControl->SetFocus(ETrue);
}
}
}
14.
void CWorldContainer::ReCalcRect()
{
//计算显示位置
TInt nHeight = 0;
TInt nHeight1 = 3;
TInt nStartY = iStartY;
TInt nWidth = 0;
if (iRect.Size().iWidth == 240)
{
nHeight = 30;
nWidth = 140;
}
else if (iRect.Size().iWidth == 320)
{
nHeight = 30;
nWidth = 140;
}
else if (iRect.Size().iWidth == 360)
{
nHeight = 45;
nWidth = 235;
}
else
{
nHeight = 30;
nWidth = 140;
}
TInt nStartX = (iRect.Size().iWidth - nWidth) / 2;
TSize size;
size.iHeight = nHeight;
size.iWidth = nWidth;
TRect rect;
//------
iTextItem[0]->iPt.SetXY(nStartX, nStartY);
nStartY += nHeight1;
rect.SetRect(TPoint(nStartX, nStartY), size);
iControl[0]->SetRect(rect);
//------
nStartY += nHeight * 2;
iTextItem[1]->iPt.SetXY(nStartX, nStartY);
nStartY += nHeight1;
rect.SetRect(TPoint(nStartX, nStartY), size);
iControl[1]->SetRect(rect);
//------
nStartY += nHeight * 2;
iTextItem[2]->iPt.SetXY(nStartX, nStartY);
nStartY += nHeight1;
rect.SetRect(TPoint(nStartX, nStartY), size);
iControl[2]->SetRect(rect);
}
当页面类似于表单,有很多需要输入的内容,就需要做上下滚动的效果
最新推荐文章于 2020-12-23 13:31:34 发布