Mobil alkalmazások fejlesztése. Készítette: Szabóné Nacsa Rozália ELTE PSZT szeptember

Hasonló dokumentumok
Mobil alkalmazások fejlesztése

Mobil alkalmazások fejlesztése. ELTE PSZT március

Mobil alkalmazások fejlesztése. Készítette: Szabóné Nacsa Rozália

Tartalomjegyzék. Előszó... 10

Szakdolgozat OROSZ TIVADAR. Műszaki informatikai szak, gazdasági informatikai szakirány, nappali tagozat

Számítástechnika II. BMEKOKAA Előadás. Dr. Bécsi Tamás

3. Osztályok II. Programozás II

1. Bevezetés A C++ nem objektumorientált újdonságai 3

Bevezetés, a C++ osztályok. Pere László

Programozás II gyakorlat. 6. Polimorfizmus

Osztály és objektum fogalma

Programozás C++ -ban

Az alábbi példában a Foo f(5); konstruktor hívása után mennyi lesz f.b értéke? struct Foo { int a, b; Foo(int c):a(c*2),b(c*3) {} };

Programozás C++ -ban 2007/4

Google C++ style guide

Statikus adattagok. Statikus adattag inicializálása. Speciális adattagok és tagfüggvények. Általános Informatikai Tanszék

Pénzügyi algoritmusok

ISA szimulátor objektum-orientált modell (C++)

Szoftver labor III. Tematika. Gyakorlatok. Dr. Csébfalvi Balázs

Pelda öröklődésre: import java.io.*; import java.text.*; import java.util.*; import extra.*;

Mobil Informatikai Rendszerek

Eseményvezérelt alkalmazások

Visual C++ osztály készítése, adattagok, és metódusok, láthatóság, konstruktor, destruktor. Objektum létrehozása, használata, öröklés.

Konkurens TCP Szerver

Objektumok inicializálása

Pénzügyi algoritmusok

A Java és a C++ összehasonlítása

Programozási nyelvek JAVA EA+GY 1. gyakolat

Web-technológia PHP-vel

1. Alapok. Programozás II

Elemi alkalmazások fejlesztése III.

Bevezetés a programozásba Előadás: A const

1) Hány byte-on tárol a C++ egy karaktert (char)? implementáció-függő ( viszont lásd 79. megjegyzés ) 1 8 4

Programozás II gyakorlat. 7. Példák a polimorfizmus alkalmazásaira

Programozás II. 4. Dr. Iványi Péter

Objektum elvű alkalmazások fejlesztése Kifejezés lengyel formára hozása és kiértékelése

C programozási nyelv

Operációs rendszerek. Az NT folyamatok kezelése

C#, OOP. Osztályok tervezése C#-ban

Cekla. Készítette Doxygen Tue Sep :13:44

Osztályok. 4. gyakorlat

- 1 - Konstansok használata. Döntsük el, van-e fordítási idejű hiba az alábbi programrészletekben! a) const char * str="zh"; str[0]++;

Széchenyi István Egyetem. Programozás III. Varjasi Norbert

WCF, Entity Framework, ASP.NET, WPF 1. WCF service-t (adatbázissal Entity Framework) 2. ASP.NET kliens 3. WPF kliens

Concurrency in Swing

Bevezetés a programozásba Előadás: Objektumszintű és osztályszintű elemek, hibakezelés

Elemi alkalmazások fejlesztése III.

Szoftvertechnológia alapjai Java előadások

Bevezetés a programozásba Előadás: Fordítási egység

Programozás II. 3. gyakorlat Objektum Orientáltság C++-ban

C++ programozási nyelv Konstruktorok-destruktorok

Java V. Osztályszint. lyszintű ű tagok. Példányváltozó. Osztályváltozó. Általános Informatikai Tanszék Utolsó módosítás:

Szoftvergyártás: gyártásvezérlés kód-figyeléssel

Java programozási nyelv 4. rész Osztályok II.

C vagy C++? Programozási Nyelvek és Fordítóprogramok Tanszék. Pataki Norbert. Programozási Nyelvek I.

Mobil operációs rendszerek. Hidasi Balázs Szendrei Gábor

1. Template (sablon) 1.1. Függvénysablon Függvénysablon példányosítás Osztálysablon

Java és web programozás

Bevezetés a programozásba II. 8. Előadás: Osztályok, objektumok, osztályszintű metódusok

C++ programok fordítása

Dr. Schuster György október 14.

Operációs rendszerek. Az Executive és a kernel Policy és mechanizmusok szeparálása Executive: policy - objektum kezelés Kernel: mechanizmusok:

Osztályok. construct () destruct() $b=new Book(); $b=null; unset ($b); book.php: <?php class Book { private $isbn; public $title;

A PROGAMOZÁS ALAPJAI 1. Függvény mint függvény paramétere. Függvény mint függvény paramétere. Függvény mint függvény paramétere

OOP #14 (referencia-elv)

Programozás C++ -ban 2007/7

Programozási nyelvek II. JAVA EA+GY 1. gyakolat

Vizuális, eseményvezérelt programozás XI.

Mechatronika és mikroszámítógépek 2017/2018 I. félév. Bevezetés a C nyelvbe

OOP és UML Áttekintés

Webes alkalmazások fejlesztése 8. előadás. Webszolgáltatások megvalósítása (ASP.NET WebAPI)

Bevezetés a Symbian operációs rendszerbe

Memóriakezelés, dinamikus memóriakezelés

JAVA SE/ME tanfolyam tematika

Programozás C nyelven FELÜLNÉZETBŐL elhullatott MORZSÁK. Sapientia EMTE

C programozás. 1 óra Bevezetés

BME MOGI Gépészeti informatika 8.

Bánsághi Anna

Komponens alapú fejlesztés

1. Mi a fejállományok szerepe C és C++ nyelvben és hogyan használjuk őket? 2. Milyen alapvető változókat használhatunk a C és C++ nyelvben?

Java és web programozás

Bevezetés a Programozásba II 4. előadás. Adattípusok hordozhatósága

Mobil Informatikai Rendszerek

WEBFEJLESZTÉS 2. ADATBÁZIS-KEZELÉS, OSZTÁLYOK

Tartalom DCOM. Történeti áttekintés. Történeti áttekintés. Történeti áttekintés. Történeti áttekintés

Számítástechnika II. BMEKOKAA Előadás. Dr. Bécsi Tamás

Java VI. Egy kis kitérő: az UML. Osztály diagram. Általános Informatikai Tanszék Utolsó módosítás:

Programozási technológia

Bevezetés a Programozásba II 11. előadás. Adatszerkezetek megvalósítása. Adatszerkezetek megvalósítása Adatszerkezetek

Programozási nyelvek Java

SDI ALKALMAZÁS I. Workspace / ResourceView / Toolbar / IDR_MAINFRAME. Workspace / ResourceView / Menu / IDR_MAINFRAME

PHP alapjai, bevezetés. Vincze Dávid Miskolci Egyetem, IIT

Programozás 6. Dr. Iványi Péter

Segédanyag: Java alkalmazások gyakorlat

C# osztályok. Krizsán Zoltán

Autóipari beágyazott rendszerek. Komponens és rendszer integráció

Programozás. Osztályok, Származtatott osztályok. Fodor Attila

C# osztálydeníció. Krizsán Zoltán 1. .net C# technológiák tananyag objektum orientált programozás tananyag

Objektumorientált programozás C# nyelven

Java I. A Java programozási nyelv

Átírás:

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