×
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 04:23.
101 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.

×