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

    技术2022-05-18  22

    如果一个页面中的布局类似于表单。就是有很多控件需要用户填写,就要自己处理上下方向键了。 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);     }


    最新回复(0)