Namespaces

Variants
Actions

Please note that as of October 24, 2014, the Nokia Developer Wiki will no longer be accepting user contributions, including new entries, edits and comments, as we begin transitioning to our new home, in the Windows Phone Development Wiki. We plan to move over the majority of the existing entries over the next few weeks. Thanks for all your past and future contributions.

Пример работы с Generic Button API - S60 Touch UI

From Wiki
Jump to: navigation, search
Article Metadata
Compatibility
Platform(s):
S60 5th Edition
Article
Created: A.A.M. (29 Sep 2009)
Last edited: hamishwillee (09 Dec 2011)

Статья базируется на материалах англоязычной части Wiki, все они перечислены в разделе ссылки.

Contents

Обзор

Generic Button API это новый компонент пользовательского интерфейса S60 5-го издания, представляющий собой кнопку произвольных размеров с поддержкой функционала сенсорного интерфейса. В данной статье мы рассмотрим пример работы с этим API.

Generic Button API

  • Используется для реализации поддержки функционала сенсорного интерфейса для кнопок
  • Кнопки могут быть использованы в составе с другими компонентами пользовательского интерфейса, например, панелью управления (Toolbar)
  • Это "плавающий" компонент.
  • Кнопка может иметь несколько состояний.
  • Для наблюдения за событиями от кнопок используйте интерфейс класса MCoeControlObserver

Initial statePressed state

Определяем ресурсы для создания кнопок

...
#include <avkon.mbg>
//Ресурсы, описывающие кнопки
RESOURCE AVKON_BUTTON r_first_button
{
flags = KAknButtonTextInsideFrame;
states =
{
AVKON_BUTTON_STATE
{
helptxt = "First";
bmpfile = AVKON_BITMAP_FILE;
bmpid = EMbmAvkonQgn_note_query;
bmpmask = EMbmAvkonQgn_note_query_mask;
},
AVKON_BUTTON_STATE
{
flags = KAknButtonStateHasLatchedFrame;
bmpfile = AVKON_BITMAP_FILE;
bmpid = EMbmAvkonQgn_note_query;
bmpmask = EMbmAvkonQgn_note_query_mask;
}
};
}
RESOURCE AVKON_BUTTON r_second_button
{
flags = KAknButtonTextInsideFrame;
states =
{
AVKON_BUTTON_STATE
{
txt = "NoIcon";
helptxt = "Second";
},
AVKON_BUTTON_STATE
{
flags = KAknButtonStateHasLatchedFrame;
txt = "Pressed!";
helptxt = "Second";
}
};
}

Реализация Generic Button API

  • Унаследуем класс от MCoeControlObserver и реализуем его виртуальную функцию HandleControlEventL для получения и обработки событий от кнопок.
  • Объявляем объект CAknButton членом класса и используем его для того, чтобы назначить наблюдателя (observer), который будет обрабатывать события от кнопок.

UsingButtonsAPIAppView.h

...
#include <aknbutton.h>
class CUsingButtonsAPIAppView : public CCoeControl, public MCoeControlObserver
{
....
....
//From MCoeControlObserver
virtual void HandleControlEventL(CCoeControl* aControl,TCoeEvent aEventType);
 
TInt CountComponentControls() const;
CCoeControl* ComponentControl(TInt aIndex) const;
void CreateButtonUsingResourceL();
void CreateButtonRuntimeL();
private:
CAknButton* iFirstButton;
CAknButton* iSecondButton;
};

UsingButtonsAPIAppView.cpp

  • Вызываем функцию создания кнопок в ConstructL()
// -----------------------------------------------------------------------------
// CUsingButtonsAPIAppView::ConstructL()
// Symbian 2nd phase constructor can leave.
// -----------------------------------------------------------------------------
//
void CUsingButtonsAPIAppView::ConstructL(const TRect& aRect)
{
// Создаем окно
CreateWindowL();
 
// Устанавливаем размеры окна
SetRect(aRect);
 
CreateButtonUsingResourceL();
// CreateButtonRuntimeL();
 
// Активизируем окно
ActivateL();
}


  • Создаем кнопки, определяем их размеры
  • Устанавливаем класс CUsingButtonsAPIAppView в качестве наблюдателя и обработчика событий от кнопок, реализуем функцию HandleControlEventL()
void CUsingButtonsAPIAppView::CreateButtonUsingResourceL()
{
iFirstButton = CAknButton::NewL();
iFirstButton->ConstructFromResourceL(R_FIRST_BUTTON);
iFirstButton->SetContainerWindowL(*this);
iFirstButton->SetRect(TRect ( TPoint(20,180), TSize(150,100) ) );
iFirstButton->SetObserver(this);
iFirstButton->MakeVisible(ETrue);
iFirstButton->ActivateL();
 
iSecondButton = CAknButton::NewL();
iSecondButton->ConstructFromResourceL(R_SECOND_BUTTON);
iSecondButton->SetContainerWindowL(*this);
iSecondButton->SetRect(TRect ( TPoint(160,180), TSize(150,100) ) );
iSecondButton->SetObserver(this);
iSecondButton->MakeVisible(ETrue);
iSecondButton->ActivateL();
}
  • Реализуем функцию HandleControlEventL для обработки событий от кнопок
void CUsingButtonsAPIAppView::HandleControlEventL( CCoeControl* aControl,
TCoeEvent aEventType )
{
switch ( aEventType )
{
case EEventStateChanged:
{
if(aControl == iFirstButton)
{
if(iSecondButton->State()->Flags()==KAknButtonStateHasLatchedFrame)
{
iSecondButton->SetCurrentState(KAknButtonTextInsideFrame,ETrue);
}
}
else if(aControl ==iSecondButton)
{
if(iFirstButton->State()->Flags()==KAknButtonStateHasLatchedFrame)
{
iFirstButton->SetCurrentState(KAknButtonTextInsideFrame,ETrue);
}
}
}
break;
default:
break;
}
}
  • Возвращаем число компонентов, содержащихся в контейнере, у нас их два - iFirstButton и iSecondButton
TInt CUsingButtonsAPIAppView::CountComponentControls() const
{
return 2; // возвращаем число компонентов в контейнере
}
 
CCoeControl* CUsingButtonsAPIAppView::ComponentControl(TInt aIndex) const
{
switch ( aIndex )
{
case 0:
return iFirstButton;
case 1:
return iSecondButton;
default:
return NULL;
}
}
  • Не забудьте удалить кнопки iFirstButton и iSecondButton в деструкторе класса.
// -----------------------------------------------------------------------------
// CUsingButtonsAPIAppView::~CUsingButtonsAPIAppView()
// Destructor.
// -----------------------------------------------------------------------------
//
CUsingButtonsAPIAppView::~CUsingButtonsAPIAppView()
{
delete iFirstButton;
delete iSecondButton;
....
....
}

Создание кнопок во время выполнения программы, без использования ресурсов

void CUsingButtonsAPIAppView::CreateButtonRuntimeL()
{
 
_LIT(KFirstButtonText,"First");
_LIT(KFirstButtonHelpText,"Help First Button");
iFirstButton = CAknButton::NewL(NULL,NULL,NULL,NULL,KFirstButtonText,KFirstButtonHelpText,0,0);
iFirstButton->SetContainerWindowL(*this);
iFirstButton->SetRect(TRect ( TPoint(20,180), TSize(150,100) ) );
iFirstButton->SetObserver(this);
iFirstButton->MakeVisible(ETrue);
iFirstButton->ActivateL();
 
_LIT(KSecondButtonText,"Second");
_LIT(KSecondButtonHelpText,"Help Second Button");
iSecondButton = CAknButton::NewL(NULL,NULL,NULL,NULL,KSecondButtonText,KSecondButtonHelpText,0,0);
iSecondButton->SetContainerWindowL(*this);
iSecondButton->SetRect(TRect ( TPoint(160,180), TSize(150,100) ) );
iSecondButton->SetObserver(this);
iSecondButton->MakeVisible(ETrue);
iSecondButton->ActivateL();
}

Полезные функции

CAknButton

  • AddStateL()
  • SetCurrentState()
  • StateIndex()

CAknButtonState

  • SetDimmed()
  • CreateButtonIconL()
  • SetTextL()
  • SetHelpTextL()
  • SetFlags()
  • SetIcon()
  • Text()
  • HelpText()
  • Flags()

MCoeControlObserver

  • HandleControlEventL()

Ключевые моменты

Заголовочные файлы

  • #include <CAknButton.h>

Классы

  • CAknButton
  • CAknButtonState
  • MCoeControlObserver

Библиотеки

  • eikcoctl.lib

Демонстрационное приложение

Связанные ссылки



При подготовке статьи использованы следующие материалы:

Источники дополнительной информации

This page was last modified on 9 December 2011, at 03:19.
178 page views in the last 30 days.

Was this page helpful?

Your feedback about this content is important. Let us know what you think.

 

Thank you!

We appreciate your feedback.

×