×
Namespaces

Variants
Actions

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

From Nokia Developer 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 06:19.
127 page views in the last 30 days.