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