当页面类似于表单,有很多需要输入的内容,就需要做上下滚动的效果

来源:互联网 发布:做淘宝客怎样更快赚钱 编辑:程序博客网 时间:2024/05/01 19:12

如果一个页面中的布局类似于表单。就是有很多控件需要用户填写,就要自己处理上下方向键了。



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);
    }

原创粉丝点击