Пытаюсь написать себе замену тулбара (CAknToolbar), с произвольным количеством кнопок (по сути - контейнер с кнопками CAknButton), но что то мне не удается, контейнер рисуется (заливаю синим для тестирования), а кнопок нет... Делал сначала хранив кнопки в RPointerArray, потом нашел пример, и переделал как в нем на CCoeControlArray, ни так ни так не работает с одинаковыми симптомами - синий прямоугольник есть, кнопок нет.
Создаю объект контейнера следующим образомCode:#include "ButtonContainer.h" CButtonContainer::CButtonContainer():CCoeControl(), MCoeControlObserver() { // No implementation required } CButtonContainer::~CButtonContainer() { } CButtonContainer* CButtonContainer::NewLC(RArray<TInt> aResourcesArray) { CButtonContainer* self = new (ELeave) CButtonContainer(); CleanupStack::PushL(self); self->ConstructL(aResourcesArray); return self; } CButtonContainer* CButtonContainer::NewL(RArray<TInt> aResourcesArray) { CButtonContainer* self = CButtonContainer::NewLC(aResourcesArray); CleanupStack::Pop(); // self; return self; } void CButtonContainer::ConstructL(RArray<TInt> aResourcesArray) { CreateWindowL(); InitComponentArrayL(); TInt i; for (i=0;i<aResourcesArray.Count();i++) { CAknButton* button=CAknButton::NewL(); button->SetContainerWindowL(*this); button->ConstructFromResourceL(aResourcesArray[i]); button->SetObserver(this); button->MakeVisible(ETrue); Components().AppendLC(button,i); CleanupStack::Pop(button); } MakeVisible(ETrue); } void CButtonContainer::ShrinkRects(TRect aRect,TInt aDir) { // нарезка на прямоугольники для кнопок SetRect(aRect); CCoeControlArray::TCursor cursor = Components().Begin(); CCoeControl* ctrl = NULL; TInt i=0; TRect r; while ((ctrl = cursor.Control<CCoeControl>()) != NULL) { if (aDir==EDirectionHorizontal) { TInt w=aRect.Size().iWidth/Components().Count(); TInt h=aRect.Size().iHeight; r=TRect(i*w,aRect.iTl.iY,(i+1)*w,aRect.iBr.iY); } else if (aDir==EDirectionVertical) { TInt w=aRect.Size().iWidth; TInt h=aRect.Size().iHeight/Components().Count(); r=TRect(aRect.iTl.iX,h*i,aRect.iBr.iX,h*(i+1)); } ctrl->SetRect(r); cursor.Next(); i++; } } void CButtonContainer::Draw(const TRect& aRect) const { CWindowGc& gc=SystemGc(); //for test gc.SetBrushColor(KRgbBlue); gc.Clear(Rect()); // если убрать отрисовку синим - видно внизу-лежащее окно /* //если раскомментировать (хотя в примерах не вызывается DrawNow для каждого контрола), то на DrawNow() вылезет WSERV 69 //draw buttons CCoeControlArray::TCursor cursor = Components().Begin(); CCoeControl* ctrl = NULL; while ((ctrl = cursor.Control<CCoeControl>()) != NULL) { ctrl->DrawNow(); // если раскомментировать тут WSERV 69 cursor.Next(); } */ } void CButtonContainer::HandleControlEventL(CCoeControl* aControl,enum TCoeEvent aEventType) { // handle button's events }
где CMain (класс в котором это происходит) - CCoeControl. Т.е Создается View, создается CMain как Top-Level контрол (в новом окне т.е, см ConstructL ниже), а потом из этого класса опять в своем окне делается CButtonContainer, в котором делаются кнопки.Code:void CMain::CreateButtons() { RArray<TInt> array; array.Append(R_BUTTON1); array.Append(R_BUTTON2); iButtonContainer=CButtonContainer::NewL(array); TRect rect; AknLayoutUtils::LayoutMetricsRect(AknLayoutUtils::EControlPane,rect); iButtonContainer->ShrinkRects(rect,EDirectionHorizontal); iButtonContainer->ActivateL(); iButtonContainer->DrawNow(); }Code:void CMain::ConstructL( const TRect& aRect, const CCoeControl* aParent, MEikCommandObserver* aCommandObserver ) { if ( aParent == NULL ) { CreateWindowL(); //идет здесь } else { SetContainerWindowL( *aParent ); } iFocusControl = NULL; iCommandObserver = aCommandObserver; InitializeControlsL(); SetExtentToWholeScreen();///SetRect( aRect ); ActivateL(); CreateButtons(); }

Reply With Quote

