×

Discussion Board

Results 1 to 2 of 2
  1. #1
    Registered User
    Join Date
    Mar 2010
    Posts
    42

    Custom Container Control

    Пытаюсь написать себе замену тулбара (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
    	}
    Создаю объект контейнера следующим образом
    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();
    	
    	}
    где CMain (класс в котором это происходит) - CCoeControl. Т.е Создается View, создается CMain как Top-Level контрол (в новом окне т.е, см ConstructL ниже), а потом из этого класса опять в своем окне делается CButtonContainer, в котором делаются кнопки.
    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();
    	}

  2. #2
    Registered User
    Join Date
    Mar 2010
    Posts
    42

    Re: Custom Container Control

    При попытке в CreateButtons() просто создать кнопку, она тоже не рисуется, просто белый фон...
    Code:
    AknLayoutUtils::LayoutMetricsRect(AknLayoutUtils::EControlPane,rect);
    	CAknButton* iFirstButton = CAknButton::NewL();
    	iFirstButton->ConstructFromResourceL(R_BUTTON3);
    	iFirstButton->SetContainerWindowL(*this);
    	iFirstButton->SetRect(TRect ( TPoint(20,180), TSize(150,100) ) );
    	iFirstButton->SetObserver(NULL);
    	iFirstButton->MakeVisible(ETrue);
    	iFirstButton->ActivateL();
    	iFirstButton->DrawNow();

Similar Threads

  1. Custom control doesn't display in a custom dialog
    By curiouswalker in forum Symbian User Interface
    Replies: 9
    Last Post: 2010-07-14, 06:20
  2. Focus between custom tabs and Listbox in same container
    By syedshakeel2004 in forum Symbian User Interface
    Replies: 2
    Last Post: 2010-06-10, 15:02
  3. Custom child background with skin-enabled container
    By elviin in forum Symbian User Interface
    Replies: 1
    Last Post: 2009-12-22, 15:02
  4. CEikEdwin skinning missing in custom control (Container)
    By ralle@envicon.de in forum Symbian User Interface
    Replies: 1
    Last Post: 2009-07-26, 14:48
  5. How can i draw a Custom control to my container?
    By cxl_symbian in forum Symbian
    Replies: 2
    Last Post: 2009-02-14, 12:46

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •  
×