Пример работы с Generic Button API - S60 Touch UI
Article Metadata
Статья базируется на материалах англоязычной части Wiki, все они перечислены в разделе ссылки.
Обзор
Generic Button API это новый компонент пользовательского интерфейса S60 5-го издания, представляющий собой кнопку произвольных размеров с поддержкой функционала сенсорного интерфейса. В данной статье мы рассмотрим пример работы с этим API.
Generic Button API
- Используется для реализации поддержки функционала сенсорного интерфейса для кнопок
- Кнопки могут быть использованы в составе с другими компонентами пользовательского интерфейса, например, панелью управления (Toolbar)
- Это "плавающий" компонент.
- Кнопка может иметь несколько состояний.
- Для наблюдения за событиями от кнопок используйте интерфейс класса MCoeControlObserver
Определяем ресурсы для создания кнопок
...
#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
Демонстрационное приложение
Связанные ссылки
- Примеры работы с S60 Touch UI
- Пример работы с Toolbar API - S60 Touch UI
- Пример работы с LongTapDetector API - S60 Touch UI
- Пример работы с Stylus Pop-up Menu API - S60 Touch UI
- Пример работы с Tactile Feedback Client API - S60 Touch UI
- Пример работы с ChoiceList API - S60 Touch UI
- Пример работы с Adaptive Search - S60 Touch UI
- Пример работы с Hierarchical Lists API (SingleStyleTreeList) - S60 Touch UI
- Пример работы с Hierarchical Lists API (SingleColumnStyleTreeList) - S60 Touch UI
При подготовке статьи использованы следующие материалы:
Источники дополнительной информации
- S60 5th edition SDK help
- S60 5th Edition C++ Developer's Library v1.0


(no comments yet)