Нужно сделать CAknButton с поддержкой Drag&Drop, я решил отнаследоваться от CAknButton и переопределить HandlePointerEventL, но при создании кнопки ловится KERN EXEC 3
Ресурс:
Хидер:Code:RESOURCE AVKON_BUTTON r_move_button { flags = 0; states = { AVKON_BUTTON_STATE { txt = "My text"; helptxt = "Help text"; } }; }
.cpp:Code:#ifndef MOVERBUTTON_H #define MOVERBUTTON_H // INCLUDES #include <e32std.h> #include <e32base.h> #include <aknbutton.h> // CLASS DECLARATION class CMoverButton : public CAknButton { public: ~CMoverButton(); static CMoverButton* NewL(TCallBack,RWindowGroup*); static CMoverButton* NewLC(TCallBack,RWindowGroup*); private: CMoverButton(); void ConstructL(TCallBack,RWindowGroup*); void HandlePointerEventL(const TPointerEvent& aPointerEvent); TCallBack iCallBack; TPoint iMovePoint; }; #endif // MOVERBUTTON_H
Использую так:Code:#include "MoverButton.h" #include <aknbutton.h> #include <Tap2PlayAppUi.h> #include <Tap2Play.rsg> CMoverButton::CMoverButton(): CAknButton(0) //CAknButton(TInt aFlags) { } CMoverButton::~CMoverButton() { } CMoverButton* CMoverButton::NewLC(TCallBack aCall,RWindowGroup* aWg) { CMoverButton* self = new (ELeave) CMoverButton(); CleanupStack::PushL(self); self->ConstructL(aCall,aWg); return self; } CMoverButton* CMoverButton::NewL(TCallBack aCall,RWindowGroup* aWg) { CMoverButton* self = CMoverButton::NewLC(aCall,aWg); CleanupStack::Pop(); // self; return self; } void CMoverButton::ConstructL(TCallBack aCall,RWindowGroup* aWg) { iCallBack=aCall; ConstructFromResourceL(R_MOVE_BUTTON); // тут KERN EXEC 3, как я думаю потому что кнопка уже инициализирована в конструкторе CreateWindowL(aWg); SetPointerCapture(ETrue); EnableDragEvents(); } void CMoverButton::HandlePointerEventL(const TPointerEvent& aPointerEvent) { if (aPointerEvent.iType == TPointerEvent::EButton1Down) { iMovePoint = aPointerEvent.iPosition; } else if (aPointerEvent.iType == TPointerEvent::EDrag) { ((CTap2PlayAppUi*)CEikonEnv::Static()->AppUi())->MoveButtons(aPointerEvent.iPosition); //знаю что страшно, потом переделаю на M-класс iMovePoint = aPointerEvent.iPosition; DrawNow(); } CAknButton::HandlePointerEventL(aPointerEvent); // или лучше вызвать реализацию метода в CCoeControl? но тогда события от нажатия кнопки ловиться не будут }
Посмотреть какой из указателей NULL к сожалению не могу, т.к запускается это все в эмуляторе 9.4, а он падает сразу, при возникновении паники, не выдавая стек вызовов и значения переменных (в отличие от эмулятора 9.1)Code:iMoveButton=CMoverButton::NewL(TCallBack(Drag,this),iWinGroup); // iMoveButton объявлен как CAknButton iMoveButton->SetRect(rect_move); // до сюда уже не доходит, падает при создании класса. iMoveButton->ActivateL();

Reply With Quote


