Статья базируется на материалах англоязычной части Wiki, все они перечислены в разделе ссылки.
Contents |
Меню, выпадающее при нажатии стилуса (Stylus Pop-up Menu) - это новый компонент в концепции реализации сенсорного пользовательского интерфейса платформы S60 5-го издания. В данной статье мы рассмотрим пример работы с этим API.
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;
}
};
}
.....
#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;
.....
.....
};
// -----------------------------------------------------------------------------
// 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);
.....
}
// -----------------------------------------------------------------------------
// CStylusPopupAppView::HandlePointerEventL()
// Вызывается фреймворком при получении событий от указателя (стилуса)
// -----------------------------------------------------------------------------
//
void CStylusPopupAppView::HandlePointerEventL(
const TPointerEvent& aPointerEvent)
{
// Передаем событие от указателя в обработчик объекта iLongTapDetector
iLongTapDetector->PointerEventL(aPointerEvent);
// Передаем событие базовому классу
CCoeControl::HandlePointerEventL(aPointerEvent);
}
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);
}
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;
}
}
// -----------------------------------------------------------------------------
// CStylusPopupAppView::~CStylusPopupAppView()
// Destructor.
// -----------------------------------------------------------------------------
//
CStylusPopupAppView::~CStylusPopupAppView()
{
.....
.....
if(iLongTapDetector)
{
delete iLongTapDetector;
iLongTapDetector = NULL;
}
if(iStylusPopupMenu)
{
delete iStylusPopupMenu;
iStylusPopupMenu = NULL;
}
.....
}
При подготовке статьи использованы следующие материалы:
No related wiki articles found