Mobil alkalmazások fejlesztése Készítette: Szabóné Nacsa Rozália ELTE PSZT 2009. szeptember
Irodalom Charaf Hassan, Csúcs Gergely, Forstner Bertalan: Symbian alapú szoftverfejlesztés Richard Harrison: Pogrammig with Extended Functionality and Advanced Features Jo Stichbury: Effective C++ Programming for Smartphones Jo Stichbury, Mark Jacoms:The Acreditet Symbian Developer Primer (Fundamentals if Symbian OS) 2
Segédanyagok www.symbian.com/books www.symbian.com/developer www.symbian.developer/public/index.html http://forum.nokia.com/main.html SDK online dokumentáció: C:\S60\devices\S60_3rd_FP2_SDK_v1.1\docs\eclipse.exe 3
Előkészületek 1. Perl 5.6.x (Set the pathvariable!) 5.8 /5.10 nem jó! http://downloads.activestate.com/activeperl/windows/5.6/activeperl- 5.6.1.638-MSWin32-x86.msi 2. SDK(s)(S60 3rd Ed. MR + újabb) http://www.forum.nokia.com/resources_and_information/tools/platforms/s 60_Platform_SDKs/ 3. Carbide.c++ 2.0 Developer Edition (vagy újabb) http://www.forum.nokia.com/main/resources/tools_and_sdks/carbide/index. html Eszközök telepítése a felsorolás sorrendjében történjen! Az eszközöket ugyanarra a meghajtóra kell telepíteni, ahol az SDK van. (javasolt: C:\)! Ne használjunk hálózati meghajtót! Fájl nevekben ne használjunk helyközt! 4
A kezdetek SIBO Psion Computers (1980) EPOC - irodai kisszámítógép (1980-1998) Symbian OS (alapítva 1998 : Nokia, Motorola, Psion, Ericsson, 2002: Sony-Ericssson, Siemens) Mérföldkő: 2000-ben megjelent 6.0-ás verzió Symbian Symbian OS S60 C++ 5
Symbian OS felépítése Felhasználói interfész szinkronizáció UI alkalmazás keretrendszer UI eszközkészlet MIDP CLDC Alkalmazás szintű szolgáltatások PIM Böngészés Üzenetkezelés Adatszinkron JVM Java Operációs rendszer szolgáltatásai Általános szolgáltatások Kommunikációs szolgáltatások Grafikai szolgáltatások PC-s kapcsolat szolgáltatásai Alapszolgáltatások Alacsonyszintű szolgáltatások Fájlszerver Kernel és hardware integráció Kernel szolgáltatások Eszközmeghajtók 6
Kliens-szerver keretrendszer fájlszerver ablakkezelő szerver kommunikácó kezelés adatbázis-kezelés határidőnapló A CServer osztályból származnak. 7
S60 és UIQ Application suites UI implementation UI framework S 60 UIQ MOAP Symbian OS HW adaptation Hardware Symbian Symbian OS S60 C++ 8
S60 áttekintése 9
Carbide.c++ 10
Carbide.c++ Szoftver frissítés 11
Carbide.c++ Szoftver frissítés 12
Új projekt létrehozása 13
Alkalmazások azonosítása 14
Carbide.++, GUI projekt 15
Projekt fordítása emulátorra 16
Futtatási mód kiválasztása 17
Alkalmazás elindítása az emulátoron Options/Open Options/Open 18
A fordítás és szerkesztés folyamata.bmp <.h>.h.rsg.hrh.rh.rls Bmp konverter.cpp.rss.bmp.mbm.rss C++ fordító Erőforrás fordító Bmp konverter Aif fordító.obj.lib.rsc.pkg.mbm.aif linker.exe;.dll Sis készítő.sis 19
Fájlkiterjesztések bld.inf.mmp.h,.cpp.pkg.sis.aif.lib.dll.exe.mbm.mbg.rss.rh.hrh.rsg.lrs Projektfájlokat felsoroló állomány Projekt leíró fájl Hagyományos C++ fejlés- és forrásfájlok A telepítéshez szükséges leírás. A makesis bemenete Symbian telepítő fájl. A makesis kimenete Applikációs leíró fájl Az összeszerkesztés során a könyvtári rutinokat tartalmazó fájl Futás közben betölthető programkönyvtár Futtathaó fájl Több képet tartalmazó fájl Az mbm fájlokban található képek programból történő használatához szüksége konstansokat tartalmazó fejlécfájl Erőforrás leíró fájl Erőforrásokban használt struktúrákat definiáló fejlécfájl Erőforrásokkal kapcsoltaos konstanso Erőforrások azonosítói A támogatott nyelv(ek)-en megadott stringek listája 20
21
Symbian C++ sajátosságok Nincs kivétel. Helyette: TRAP és User::Leave Nincs RTTI (dinamikus castolás nem megengedett) Kódolási minták a memóriaszivárgás kiszűrésére: kétfázisú konstrukció, CleanUpStack Saját elnevezési konvenciók: nem a változó típusa, hanem szerepe szerint történik az elnevezés (T,C,R,M) (( dekorált osztálynevek) memóriakezelés segítése függvénynevekkel: prefixek, postfixek ( dekorált eljárásnevek) Nincs STL, helyette saját generikus adatszerkezeteket használ String helyett deszkriptorok Többszálúság kezelése: ActiveObject, Thread Template-ek használata: ThinTemplate 22
Osztálytípusok T: egyszerű típus; nincs destruktora; csak T-ből, vagy M-ből öröklődhet; értékként átadható; stack-en tárolható C: csak a heapen foglalható; van destruktora; pontosan egy C és tetszőleges M osztályból származhat; nem adható át értékként M: interfész; csak virtuális metódusok; nincsenek tagváltozók; nem példányosítható R: erőforrás, melyet meg kell nyitni és be kell zárni 23
Osztálytípusok - példa PeekabooAppUi.h class MPeekabooGameControl public: virtual TBool HitSquareL(TInt aindex)=0; virtual TInt SquareStatus(TInt aindex)=0; ; class CPeekabooAppUi : public CAknAppUi, public MPeekabooGameControl... private: // From MPeekabooGameControl TBool HitSquareL(TInt aindex); TInt SquareStatus(TInt aindex); private: CPeekabooAppView* iappview; RArray<TInt> itilestate; TInt igamestatus; TBool ifirstturn; TBool ishow; ; TInt itilesperrow; TInt itilespercol; 24
Leave -elő függvények A leave -elő függvények olyan eljárások, amelyek végrehajtása nem garantált. (erőforrás hiány, kevés memória, nincs kapcsolat, nincs hely a diszken, ) 25
new (ELeave) operátor LOCAL_C void MainL() CMyClass* myptr = new CMyClass; if(myptr) myptr->foo(); //Can safely access data & functions delete myptr; LOCAL_C void MainL() CMyClass* myptr = new (ELeave) CMyClass; myptr->foo();... Hiba esetén abbahagyja a végrehajtást. delete myptr; 26
Leave -elő függvények - példa CPeekabooTile * CPeekabooAppView::CreateTileL() CPeekabooTile * tile = new(eleave) CPeekabooTile; CleanupStack::PushL(tile); tile->constructl(window()); CleanupStack::Pop(); // tile tile->setownerandobserver(this); return tile; Mikor leave-elhet egy függvény? Ha közvetlenül meghívja a User::Leave() függvényt Heapen foglal helyet new (ELeave) operátorral Más leave-elő függvényt hív. void CPeekabooAppView::ConstructL(const TRect& arect, MPeekabooGameControl* agamecontrol)... for (TInt i = 0; i < CountComponentControls(); i++) User::LeaveIfError(iTiles.Append(CreateTileL()));... void CPeekabooAppUi::HandleCommandL(TInt acommand)... case EPeekabooWelcome: HBufC* textresource = StringLoader::LoadLC(R_WELCOME_TEXT); CAknInformationNote* informationnote; informationnote = new (ELeave) CAknInformationNote; informationnote->executeld(*textresource); CleanupStack::PopAndDestroy(textResource); break;... 27
Hibakezelés csapdázással, leaveléssel case ECleanupCmdUse3: CX* x=new(eleave) CX; TRAPD (error, x->usel()); if(error) delete x; User::Leave(error); delete x; Több függvényhívás esetén minden egyes függvényhívást külön-külön csapdázni kell. case ECleanupCmdUse3: CX* x=new(eleave) CX; CleanupStack::PushL(x); x->usel(); x->usel(); x->usel(); CleanupStack::PopAndDestroy(x); A CleanupStack segítségével egy csokorba gyűjthetjük a leavelő függvényhívásokat. 28
Csapdázás származtatott osztályban /* a felüldefiniált Draw() függvény */ virtual void Draw(constTRect &arect) const TRAPD(error, SajatDrawL(aRect)) // SajátDrawL hívás if(error!kerrnone) // volt User::Leave() hívás? //hiba jelzése, kezelése 29
Kivételkezelés C++ Ha kivételkezelés történik A program stack visszafejtésre kerül a catch szintjéig Az objektumok destruktorai meghívódnak Symbian Nincs C++ kivétel Nincs veremvisszafejtés Destruktorokat nem hívja meg Egész számot lehet eldobni és elkapni 30
Leavelő mechanizmus A leave -elésnél a vezérlés átkerül a legközelebbi TRAP makróval megjelölt helyre. (setjump(), longjump()) A vezérlés átadásakor a verem egyszerűen csak kiürül. A veremből kiszedett objektumokra nem hajtódik végre a destruktor. Ha csak ez történne, akkor maradnának árván hagyott területek a heapen. (automatikus változók) Kell egy kiegészítő mechanizmus, amely felszabadítja az árván hagyott tárhelyet. CleanUp Stack 31
CleanupStack case ECleanupCmdUse3: CX* x=new(eleave) CX; x->usel(); delete x; Az x automatikus változó a heap-re mutat. Ha UseL() leave-el, akkor a delete nem hajtódik végre, a CX által lefoglalt terület árván marad. case ECleanupCmdUse3: CX* x=new(eleave) CX; CleanupStack::PushL(x); x->usel(); CleanupStack::PopAndDestroy(x); A CX helyfoglalása után a rá mutató pointert elhelyezzük a Cleannup Stack-en. Ha UseL() nem leave-el, akkor MI szedjük le a címet a stackről. Ha UseL() leave-el, akkor a Laeve kezelő eljárás. 32
Összetett ojektum példányosítása (!!) class CY : public CBase public: CY(); ~CY(); public: CX* ix; ; CY::CY() //???? ix=new(eleave) CX; class CX : public CBase public: void UseL(); public: TInt iint; ; void CX::UseL() TInt* pi=new(eleave) TInt; delete pi; CY::~CY() delete ix; Probléma: A CY példányosításakor a CY konstruktora leave-el! CY* y=new(eleave) CY; CleanupStack::PushL(y); y->ix->usel(); CleanupStack::PopAndDestroy(); // y 33
Kétfázisú konstrukció A konstruktort két részre bontjuk: 1. rész: Biztonságos, nem leave-elő a példányra mutató pointer biztosan felkerül a CleanupStack-re 2. rész: A veszélyesebb leave-elő rész. De ekkor már jó helyen van a pointer. A kétfázisú konstrukció biztosítja a heapen létrehozott objektumok biztonságos inicializálását akkor is, ha az inicializáló eljárás nem biztonságos. 34
Kétfázisú konstrukció megvalósítása class CZ : public CBase public: static CZ* NewL(); static CZ* NewLC(); void ConstructL(); ~CZ(); public: CX* ix; ; A két fázist (a biztonság kedvéért ) a NewL, NewLC függvényekbe becsomagolják. void CZ::ConstructL() ix=new(eleave) CX; CZ::~CZ() delete ix; CZ* CZ::NewL() CZ* self=new(eleave) CZ; CleanupStack::PushL(self); self->constructl(); CleanupStack::Pop(); return self; CZ* CZ::NewLC() CZ* self=new(eleave) CZ; CleanupStack::PushL(self); self->constructl(); return self; 35
Kétfázisú konstrukció - példa CPeekabooAppView* CPeekabooAppView::NewL(const TRect& arect, MPeekabooGameControl* agamecontrol, TInt atilesperrow, TInt atilespercol) CPeekabooAppView* self = CPeekabooAppView::NewLC(aRect, agamecontrol, atilesperrow, atilespercol); CleanupStack::Pop(self); return self; CPeekabooAppView* CPeekabooAppView::NewLC(const TRect& arect, MPeekabooGameControl* agamecontrol, TInt atilesperrow, TInt atilespercol) CPeekabooAppView* self = new (ELeave) CPeekabooAppView(aTilesPerRow, atilespercol); CleanupStack::PushL(self); self->constructl(arect,agamecontrol); return self; void CPeekabooAppView::ConstructL(const TRect& arect, MPeekabooGameControl* agamecontrol) CreateWindowL();... SetRect(aRect); ActivateL(); 36
Deszkriptorok Véd a túlcsordulás/túlindexelés ellen ( C) Önkifejező (hossz, típus) Nincs NULL terminátor (a bináris és sztring kezelés egységesítése) Egyszerű paraméterátadás 37
Deszkriptorok TDesC ilength itype Length() Ptr() TPtrC iptr BufBase TDes imaxlength MaxLength() TBufC<n> ibuf HBufC ibuf TPtr iptr TBufBase TBuf<n> ibuf 38
Pufferes deszkriptorok TBufC ilength TDesC Hello World! TBufC heap, stack, ROM TBuf ilength imaxlength Hello World! TDesC TDes TBuf _LIT(KTxtHello, Hello World! ); A méret fordítási időben ismert! TBufC<16> buffer (KTextHello);... 39
Pointeres deszkriptorok TPtrC ilength TDesC iptr TPtrC heap, stack, ROM Hello World! TPtr ilength imaxlength iptr TDesC TDes TPtrC void foo(tuint16* abuf, TInt alength) TPtrC myptr(abuf, alength);... _LIT(KTxtHello, Hello World! ); TBufC<16> buffer (KTextHello); TPtrC mybuffer(buffer);... 40
Heap bázisú deszkriptor ( dinamikus deszkriptor) HBufC ilength TDesC Heap Hello World! TBufC A méret fordítási időben nem ismert Túl nagy méret _LIT(KTxtHello, Hello World! HBufC* buffer = HBufC::newL(256); *buffer = KTxtHello;... _LIT(KTxtHello, Hello World! ); _LIT(KTxtFriends, Friends ); HBufC* buffer = HBufC::newL(256); *buffer = KTxtHello; TPtr temp buffer->des(); temp.replace(6,6, KTxtFriends);... 41
RBuf Hello World! RBuf ilength TDesC imaxlength TDes unió típus TUint16* ieptrtype HBufC16* iebufcptrtype RBuf Hello World! Heap 42
Deszkriptorok - példa void CPeekabooAppUi::HandleCommandL(TInt acommand) switch (acommand) case EEikCmdExit: case EAknSoftkeyExit: Exit(); break; case EPeekabooWelcome: HBufC* textresource = StringLoader::LoadLC(R_WELCOME_TEXT); CAknInformationNote* informationnote; informationnote = new (ELeave) CAknInformationNote; informationnote->executeld(*textresource); CleanupStack::PopAndDestroy(textResource); break;... 43
Aszinkron szolgáltatások, ActiveObject Pre-emptive ütemezés: thread Kooperatív ütemezés: Active object Real-time ütemezés: pl. hang puffer töltése Mobil alkalmazások: sok aszinkron esemény Cél: hatékony, kis kódú, kevés memóriaigényű megoldás Active objet framework: Active object + Active Scheduler Active object: 1. istatus 2. SetActive() 3. Runl() 4. DoCancel() 5. RunError() Eseményvezérelt alkalmazások készítése - felhasználói felület kezelése -szerver szolgáltatások igénylése Hosszan futó programok futtatása ActiveScheduler: prioritás OfferKeyEventL() Példa: people.inf.elte.hu/nacsa/symbian/activehello 44
ActiveObject - példa Példa: people.inf.elte.hu/nacsa/symbian/activehello 45
ActiveObject - példa class CFlashingHello : public CActive... // Request void Start(TTimeIntervalMicroSeconds32 ahalfperiod);... // from CActive void RunL(); void DoCancel(); // Utility void ShowText(TBool eshowtext); private: // Member variables RTimer itimer; TTimeIntervalMicroSeconds32 ihalfperiod; // Pointers elsewhere CActiveHelloContainer* iappview; ; void CFlashingHello::RunL() // Change visibility of app view text ShowText(!iAppView->iShowText); // Re-issue request itimer.after(istatus, ihalfperiod); SetActive(); void CFlashingHello::DoCancel() // Ensure text is showing ShowText(ETrue); // Cancel timer itimer.cancel(); void CFlashingHello::ShowText(TBool ashowtext) iappview->ishowtext=ashowtext; iappview->drawnow(); Példa: people.inf.elte.hu/nacsa/symbian/activehello 46
GUI alkalmazások felépítése
GUI alkalmazások felépítése (MVC) Application creates Document creates, manages creates manages AppView (V) renders creates, manages AppUi (C) manages Model (M) 49
Az alkalmazás indulása E32Main() NewApplication <<new>> CHelloWorldApplication AppDllUid CreateDocumentL NewL CHelloWorldDocument <<constructor>> ConstructL AppDllUid CreateAppUiL <<constructor>> CHelloWorldAppUi ConstructL BaseConstructL 50
bld.inf bld.inf PRJ_PLATFORMS WINSCW ARMV5 GCCE PRJ_MMPFILES gnumakefile icons_scalable_dc.mk Peekaboo.mmp 51
Peekaboo.mmp TARGET TARGETTYPE UID Peekaboo_0xE3C01E61.exe exe 0x100039CE 0xE3C01E61... USERINCLUDE..\inc SOURCEPATH SOURCE SOURCE SOURCE SOURCE SOURCE..\src Peekaboo.cpp PeekabooApplication.cpp PeekabooAppView.cpp PeekabooAppUi.cpp PeekabooDocument.cpp SYSTEMINCLUDE LIBRARY LIBRARY LIBRARY LIBRARY LIBRARY LIBRARY LIBRARY LIBRARY LIBRARY \epoc32\include euser.lib apparc.lib cone.lib eikcore.lib avkon.lib commonengine.lib efsrv.lib estor.lib aknnotify.lib SOURCEPATH..\data START RESOURCE Peekaboo.rss HEADER TARGET Peekaboo_0xE3C01E61 TARGETPATH resource\apps END //RESOURCE START RESOURCE Peekaboo_reg.rss TARGET Peekaboo_0xE3C01E61_reg TARGETPATH \private\10003a3f\apps END //RESOURCE... LANG SC VENDORID 0 SECUREID 0xE3C01E61 CAPABILITY ReadUserData #ifdef ENABLE_ABIV2_MODE DEBUGGABLE_UDEBONLY #endif 52
Peekaboo.mmp A.mmp fájl tartalma garfikus felületen is beállítható. 53
Peekaboo.rss NAME PEEK // 4 letter ID #include <eikon.rh> #include <avkon.rsg> #include <avkon.rh> #include <appinfo.rh> #include "Peekaboo.hrh" #include "Peekaboo.rls" RESOURCE RSS_SIGNATURE RESOURCE TBUF r_default_document_name buf="peek";... RESOURCE MENU_PANE r_menu items = MENU_ITEM command = ECommand1; txt = qtn_command1;, MENU_ITEM command = EAknSoftkeyExit; txt = qtn_exit; ; RESOURCE EIK_APP_INFO menubar = r_menubar; cba = R_AVKON_SOFTKEYS_OPTIONS_EXIT; RESOURCE MENU_BAR r_menubar titles = MENU_TITLE menu_pane = r_menu; ;... RESOURCE TBUF32 r_caption_string buf=qtn_caption_string; RESOURCE TBUF r_command1_text buf=qtn_command1_text; RESOURCE LOCALISABLE_APP_INFO r_localisable_app_info short_caption = qtn_caption_string; caption_and_icon = CAPTION_AND_ICON_INFO caption = qtn_caption_string; number_of_icons = 1; icon_file = "\\resource\\apps\\peekaboo_0xe3c01e61.mif"; ; 54
Peekaboo.pan,.rls,.hrh #ifndef PEEKABOO_PAN #define PEEKABOO_PAN Peekabo.pan #define _UID3 0xE3C01E61 Peekaboo.hrh enum TPeekabooPanics EPeekabooUi = 1 ; enum TPeekabooIds ECommand1 = 0x6001 // start value must not be 0 ; inline void Panic(TPeekabooPanics areason) _LIT(applicationName, "Peekaboo"); User::Panic(applicationName, areason); #endif // PEEKABOO_PAN Peekaboo.rls #define qtn_caption_string "Peekaboo" #define qtn_command1 "Command1" #define qtn_exit "Exit" #define qtn_command1_text "Game of Peek a Boo!" #define qtn_loc_resource_file_1 "\\resource\\apps\\peekaboo_0xe3c01e61" 55
Peekaboo.cpp #include <eikstart.h> #include "PeekabooApplication.h" LOCAL_C CApaApplication* NewApplication() return new CPeekabooApplication; GLDEF_C TInt E32Main() return EikStart::RunApplication(NewApplication); E32Main() 56
PeekabooApplication osztály #include <aknapp.h> #include "Peekaboo.hrh" PeekabooApplication.h const TUid KUidPeekabooApp = _UID3 ; class CPeekabooApplication : public CAknApplication public: TUid AppDllUid() const; protected: CApaDocument* CreateDocumentL(); ; #include "Peekaboo.hrh" #include "PeekabooDocument.h" #include "PeekabooApplication.h" PeekabooApplication.cpp CApaDocument* CPeekabooApplication::CreateDocumentL() // Create an Peekaboo document, and return a pointer to it return CPeekabooDocument::NewL(*this); TUid CPeekabooApplication::AppDllUid() const // Return the UID for the Peekaboo application return KUidPeekabooApp; 57
PeekabooDocument osztály - definíció PeekabooAppDocument.h #include <akndoc.h> class CPeekabooAppUi; class CEikApplication; class CPeekabooDocument : public CAknDocument public: static CPeekabooDocument* NewL(CEikApplication& aapp); static CPeekabooDocument* NewLC(CEikApplication& aapp); virtual ~CPeekabooDocument(); public: CEikAppUi* CreateAppUiL(); private: void ConstructL(); CPeekabooDocument(CEikApplication& aapp); ; 58
PeekabooDocument osztály - implementáció #include "PeekabooAppUi.h" #include "PeekabooDocument.h" PeekabooDocument.cpp CPeekabooDocument* CPeekabooDocument::NewL(CEikApplication& aapp) CPeekabooDocument* self = NewLC(aApp); CleanupStack::Pop(self); return self; CPeekabooDocument* CPeekabooDocument::NewLC(CEikApplication& aapp) CPeekabooDocument* self = new (ELeave) CPeekabooDocument(aApp); CleanupStack::PushL(self); self->constructl(); return self; CEikAppUi* CPeekabooDocument::CreateAppUiL() return new (ELeave) CPeekabooAppUi; 59
PeekabooAppUi osztály - definíció #include <aknappui.h> class CPeekabooAppView; class CPeekabooAppUi : public CAknAppUi public: void ConstructL(); CPeekabooAppUi(); virtual ~CPeekabooAppUi(); private: void HandleCommandL(TInt acommand); void HandleStatusPaneSizeChange(); private: CPeekabooAppView* iappview; ; PeekabooAppUi.h 60
PeekabooAppUi osztály implementáció 1. PeekabooAppUi.cpp void CPeekabooAppUi::ConstructL() BaseConstructL(CAknAppUi::EAknEnableSkin); iappview = CPeekabooAppView::NewL(ClientRect()); AddToStackL(iAppView); CPeekabooAppUi::~CPeekabooAppUi() if (iappview) ieikonenv->removefromstack(iappview); delete iappview; iappview = NULL; 61
PeekabooAppUi osztály implementáció 2. void CPeekabooAppUi::HandleCommandL(TInt acommand) switch (acommand) case EEikCmdExit: case EAknSoftkeyExit: Exit(); break; PeekabooAppUi.cpp case ECommand1: HBufC* textresource = StringLoader::LoadLC(R_COMMAND1_TEXT); CAknInformationNote* informationnote; informationnote = new (ELeave) CAknInformationNote; informationnote->executeld(*textresource); CleanupStack::PopAndDestroy(textResource); break; default: Panic(EPeekabooUi); break; void CPeekabooAppUi::HandleStatusPaneSizeChange() iappview->setrect(clientrect()); 62
PeekabooAppView osztály - definíció #include <coecntrl.h> class CPeekabooAppView : public CCoeControl public: static CPeekabooAppView* NewL(const TRect& arect); static CPeekabooAppView* NewLC(const TRect& arect); PeekabooAppView.h virtual ~CPeekabooAppView(); public: void Draw(const TRect& arect) const; virtual void SizeChanged(); virtual void HandlePointerEventL(const TPointerEvent& apointerevent); private: void ConstructL(const TRect& arect); CPeekabooAppView(); ; 63
PeekabooAppView osztály implementáció 1. CPeekabooAppView* CPeekabooAppView::NewL(const TRect& arect) CPeekabooAppView* self = CPeekabooAppView::NewLC(aRect); CleanupStack::Pop(self); return self; PeekabooAppView.cpp CPeekabooAppView* CPeekabooAppView::NewLC(const TRect& arect) CPeekabooAppView* self = new (ELeave) CPeekabooAppView; CleanupStack::PushL(self); self->constructl(arect); return self; void CPeekabooAppView::ConstructL(const TRect& arect) CreateWindowL(); SetRect(aRect); ActivateL(); 64
PeekabooAppView osztály implementáció 2. void CPeekabooAppView::Draw(const TRect& /*arect*/) const CWindowGc& gc = SystemGc(); TRect drawrect(rect()); gc.clear(drawrect); PeekabooAppView.cpp void CPeekabooAppView::HandlePointerEventL(const TPointerEvent& apointerevent) CCoeControl::HandlePointerEventL(aPointerEvent); 65
Erőforrás módosítása fordítás, futtatás Ha a projektünkben módosítjuk az.rss fájl, akkor fordítás előtt az emulátort be kell zárni. 66
Fordítás, futtatás void CPeekabooAppUi::HandleCommandL(TInt acommand)... case ECommand1: HBufC* textresource = StringLoader::LoadLC(R_COMMAND1_TEXT); CAknInformationNote* informationnote; informationnote = new (ELeave) CAknInformationNote; informationnote->executeld(*textresource); CleanupStack::PopAndDestroy(textResource);... 67
Generált fájlok törlése Window -> Preferences -> Carbide.c++ -> Build
Fájlok törlése
71
private: HBufC *ihellomessage; PeekabooAppView.h PeekabooAppView.cpp #include <gdi.h> #include <EIKENV.H> _LIT(KHelloMessage,"Hello Peekaboo!"); void CPeekabooAppView::ConstructL(const TRect& arect) CreateWindowL(); SetRect(aRect); ActivateL(); Peekaboo.mmp SYSTEMINCLUDE \epoc32\include... LIBRARY gdi.lib... ihellomessage=hbufc::newl(30); *ihellomessage=khellomessage; CPeekabooAppView::~CPeekabooAppView() delete ihellomessage; 72
void CPeekabooAppView::Draw(const TRect& /*arect*/) const /*CWindowGc& gc = SystemGc(); TRect drawrect(rect()); gc.clear(drawrect);*/ CWindowGc& gc = SystemGc(); TRect drawrect(rect()); gc.clear(drawrect); drawrect.shrink(10,10); gc.drawrect(drawrect); const CFont* fontused = CEikonEnv::Static()->TitleFont(); gc.usefont(fontused); TInt baselineoffset = (drawrect.height() + fontused->heightinpixels())/2; gc.drawtext(*ihellomessage,drawrect,baselineoffset,cgraphicscontext::ecenter,0); gc.discardfont(); A projekt letölthető a people.inf.elte.hu/nacsa/symbian/projects/peekaboo_02 címről. 73
A projekt letölthetők a people.inf.elte.hu/nacsa/symbian/projects/peekaboo_01 people.inf.elte.hu/nacsa/symbian/projects/peekaboo_02 címről. Betöltés: Carbide.C++/File/import/ /bld.inf