×
Namespaces

Variants
Actions

Пример работы с Stylus Pop-up Menu API - S60 Touch UI

From Nokia Developer Wiki
Jump to: navigation, search
Article Metadata

Пример кода
Исходный файл: Media:StylusPopup.zip

Совместимость
Платформа(ы):
S60 5th Edition

Статья
Автор: A.A.M. (28 Jan 2009)
Последнее редактирование: hamishwillee (23 Nov 2011)


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

Contents

Обзор

Меню, выпадающее при нажатии стилуса (Stylus Pop-up Menu) - это новый компонент в концепции реализации сенсорного пользовательского интерфейса платформы S60 5-го издания. В данной статье мы рассмотрим пример работы с этим API.


Stylus Pop-up Menu API

  • Это "плавающий" компонент.
  • В основном используется в связке с событием, возникающим при продолжительном нажатии указателя (стилуса) на экран.
  • Отрисовка компонента происходит возле точки нажатия указателя на экран.
  • При выборе одного из пунктов меню, обработка проиcходит в функции ProcessCommandL.

StylusPopupMenu.png

Preface of the example

  • Рассмотрим пример использования выпадающего меню в связке с LongTapDetector API.
  • Унаследуем класс от MAknLongTapDetectorCallBack и реализуем его виртуальную функцию HandleLongTapEventL() для получения событий о продолжительных нажатиях указателя
  • Унаследуем класс от MEikMenuObserver и реализуем его виртуальную функцию ProcessCommandL для обработки команд выпадающего меню

Создание выпадающее меню из ресурсов

RESOURCE STYLUS_POPUP_MENU r_stylus_popup_menu
{
items =
{
STYLUS_POPUP_MENU_ITEM
{
txt = "Add menu item";
command = ECommand1; // В данном примере мы используем тот же набор команд, что и в AppUi::HandleCommandL
},
STYLUS_POPUP_MENU_ITEM
{
txt = "Remove menu item";
command = ECommand2; // В данном примере мы используем тот же набор команд, что и в AppUi::HandleCommandL
},
STYLUS_POPUP_MENU_ITEM
{
txt = "Exit Application";
command = EAknSoftkeyExit;
}
};
}

Реализация выпадающего меню

StylusPopupAppView.h

.....
#include <aknlongtapdetector.h>
#include <aknstyluspopupmenu.h>
#include <EIKMOBS.H>
 
// CLASS DECLARATION
class CStylusPopupAppView : public CCoeControl, public MAknLongTapDetectorCallBack, public MEikMenuObserver
{
....
....
// From MAknLongTapDetectorCallBack
virtual void HandleLongTapEventL( const TPoint& aPenEventLocation, const TPoint& aPenEventScreenLocation );
 
//From MEikMenuObserver
void ProcessCommandL(TInt aCommandId);
void SetEmphasis(CCoeControl* /*aMenuControl*/,TBool /*aEmphasis*/)
{
}
 
// Пример реализации вспомогательных функций
void AddMenuItemRuntime(TInt aId);
void RemoveMenuItemRuntime(TInt aId);
....
....
private:
CAknLongTapDetector* iLongTapDetector;
CAknStylusPopUpMenu* iStylusPopupMenu;
 
TInt iCount;
.....
.....
};

StylusPopupAppView.cpp

// -----------------------------------------------------------------------------
// CStylusPopupAppView::ConstructL()
// Symbian 2nd phase constructor can leave.
// -----------------------------------------------------------------------------
//
void CStylusPopupAppView::ConstructL(const TRect& aRect)
{
// Create a window for this application view
CreateWindowL();
 
iLongTapDetector = CAknLongTapDetector::NewL(this);
.....
}


  • Пример обработки событий в HandlePointerEventL:
// -----------------------------------------------------------------------------
// CStylusPopupAppView::HandlePointerEventL()
// Вызывается фреймворком при получении событий от указателя (стилуса)
// -----------------------------------------------------------------------------
//
void CStylusPopupAppView::HandlePointerEventL(
const TPointerEvent& aPointerEvent)
{
// Передаем событие от указателя в обработчик объекта iLongTapDetector
iLongTapDetector->PointerEventL(aPointerEvent);
 
// Передаем событие базовому классу
CCoeControl::HandlePointerEventL(aPointerEvent);
}
  • События о продолжительном нажатии могут быть обработаны в реализации функции HandleLongTapEventL().
  • В данном примере мы создаем/показываем выпадающее меню в случае, когда получено событие о том, что зафиксировано продолжительное нажатие.
  • Оба аргумента функции HandleLongTapEventL несут информацию о координатах следующих двух точек:
    • aPenEventLocation координаты точки нажатия относительно родительского объекта.
    • aPenEventScreenLocation координаты точки нажатия относительно экрана.
void CStylusPopupAppView::HandleLongTapEventL( const TPoint& aPenEventLocation,
const TPoint& aPenEventScreenLocation )
{
if(!iStylusPopupMenu)
{
iStylusPopupMenu = CAknStylusPopUpMenu::NewL( this , aPenEventLocation);
TResourceReader reader;
iCoeEnv->CreateResourceReaderLC(reader,R_STYLUS_POPUP_MENU);
iStylusPopupMenu->ConstructFromResourceL(reader);
CleanupStack::PopAndDestroy();
}
iStylusPopupMenu->ShowMenu();
iStylusPopupMenu->SetPosition(aPenEventLocation);
}
  • Вспомогательные функции в нашем приложении предназначены для добавления и удаления пунктов в выпадающем меню.
  • функция AddMenuItemRuntime() служит для добавления пункта в выпадающее меню во время выполнения программы.
  • функция RemoveMenuItemRuntime() служит для удаления пункта из выпадающего меню во время выполнения программы.
  • функция ProcessCommandL() вызывается при выборе одного из пунктов выпадающего меню. В данном примере мы используем тот же набор команд, что и в AppUi::HandleCommandL, но с иной реализацией.

StylusPopupMenuAddRemoveItem.png

void CStylusPopupAppView::AddMenuItemRuntime(TInt aId)
{
_LIT(KMenuItem,"Item %d");
TBuf<20> buf;
buf.Format(KMenuItem(), aId);
iStylusPopupMenu->AddMenuItemL(buf,aId);
iStylusPopupMenu->ShowMenu();
}
void CStylusPopupAppView::RemoveMenuItemRuntime(TInt aId)
{
iStylusPopupMenu->RemoveMenuItem(aId);
iStylusPopupMenu->ShowMenu();
}
void CStylusPopupAppView::ProcessCommandL(TInt aCommand)
{
switch(aCommand)
{
case ECommand1:
{
AddMenuItemRuntime(iCount++);
}
break;
case ECommand2:
{
if(iCount>0)
RemoveMenuItemRuntime(--iCount);
}
break;
case EAknSoftkeyExit:
User::Exit(0);
break;
default:
CAknInformationNote* info = new (ELeave) CAknInformationNote;
info->ExecuteLD(_L("Runtime added command pressed!"));
break;
}
}
  • Не забудьте удалить объект iLongTapDetector в деструкторе класса.
  • Не забудьте удалить объект iStylusPopupMenu в деструкторе класса.
// -----------------------------------------------------------------------------
// CStylusPopupAppView::~CStylusPopupAppView()
// Destructor.
// -----------------------------------------------------------------------------
//
CStylusPopupAppView::~CStylusPopupAppView()
{
.....
.....
if(iLongTapDetector)
{
delete iLongTapDetector;
iLongTapDetector = NULL;
}
if(iStylusPopupMenu)
{
delete iStylusPopupMenu;
iStylusPopupMenu = NULL;
}
.....
}

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

CAknStylusPopUpMenu

  • ShowMenu()
  • AddMenuItemL()
  • RemoveMenuItem()
  • SetPosition()

MAknLongTapDetectorCallBack

  • HandleLongTapEventL()

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

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

  • #include <AknToolbarObserver.h>
  • #include <AknToolbar.h>
  • #include <Aknstyluspopupmenu.h>

Классы

  • CAknStylusPopUpMenu
  • CAknToolbar
  • MAknToolbarObserver

Библиотеки

  • eikcoctl.lib

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

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



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

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

This page was last modified on 23 November 2011, at 07:23.
120 page views in the last 30 days.