P R O G R A M U J E M EEkvivalentZ<strong>na</strong>k< &apos‘ (apostrof)&qout;“ (úvodzovky)&& (ampersand)$$ $ (dolár) Nedelite¾ná medzera­PomlèkaTab. 1Kategória objektovdo<strong>sk</strong>y a kartyheadaccessmetaudalosti (events)definovanie akcií (ta<strong>sk</strong>s)premennévstup dátodkazy, obrázky a èasovaèeformát textuObjektwmlcardtemplateTab. 2 Základné typy objektovdoontimeronenterforwardonenterbackwardonpickoneventpostfieldgoprevrefreshnoopsetvarinputselectoptionoptgroupfieldsetaanchorimgtimerbrptabletrtdpre (nová z<strong>na</strong>èka vo verzii WAP 1.2)Jednoduchý WML dokument môže vyzera <strong>na</strong>príkladtakto:1) 2) 4) 5) 6) 7) Prva WAP stranka.8) 9) 10) Èísla pred každým riadkom nie sú súèas ou WML dokumentu,urèujú iba èíslo riadka. Vysvetlíme si jednotlivériadky nášho príkladu.1) Povinná hlavièka XML dokumentu – verzia XML.2) Povinná hlavièka XML dokumentu – identifikátordokumentu.3) Povinná hlavièka XML dokumentu – adresa definícietypu dokumentu.4) Urèuje zaèiatok WML dokumentu.5) Definuje kartu. Karta je urèená svojím jednoz<strong>na</strong>ènýmidentifikátorom (nesmie obsahova medzery)a hlavièkou, ktorá sa zobrazí <strong>na</strong> mobilnomzariadení.6) Na tomto riadku sa zaèí<strong>na</strong>jú objekty, ktoré obsahujePrvaKarta. Ide o jeden objekt (odsek) – ajjednoduchý text sa definuje ako objekt.7) Text odseku.8) Koniec objektu „odsek“.9) Koniec karty (karta je takisto objekt).10) Koniec WML dokumentu.Táto stránka sa <strong>na</strong> vašom mobilnom telefóne zobrazíasi tak ako <strong>na</strong> obrázku 2.Objekt wml obsahuje okrem kariet (objekt card) aj objektyako head a template.Objekt head (v dokumente sa môže <strong>na</strong>chádza iba raz) sapoužíva <strong>na</strong> špecifikáciu informácií, ktoré súvisia z danou WAPstránkou. Je to ekvivalent z<strong>na</strong>èky v HTML dokumente.Do objektu head sa vkladajú informácie ako metadata alebosa v nich definuje prístup k dokumentu (všetky WML dokumentysú štandardne definované ako verejné (public) dokumenty– sú prístupné zo všetkých iných domén).Objekt template (v dokumente sa môže <strong>na</strong>chádza iba raz)sa používa <strong>na</strong> definovanie vlastností, ktoré sa majú použi <strong>na</strong>všetky karty definované v dokumente. Ak je v niektorej kartedaná vlastnos definovaná, vlastnos sa prekryje.V karte (v dokumente ich môže by definovaných viac)môžu by definované všetky objekty, ktoré vytvárajú samotnúèas dokumentu. Objekt card teda môže obsahova<strong>na</strong>sledujúce objekty:n formátovaný text – samotný text – odsek, obrázkya odkazy <strong>na</strong> iné kartyn objekt input – umožòuje používate¾ovi zada textpod¾a definovaného formátun objekt select – umožòuje používate¾ovi vybra sijednu alebo viac možnostín objekt fieldset – umožòuje zo<strong>sk</strong>upova objektyJednotlivé objekty si opíšeme ïalej.Základná štruktúra WAP stránky je teda:n Ing. František MalagaObr. 2 WAP stránka<strong>na</strong> mobilnom telefóneNOKIA 7110 (simulátorNOKIA WAP Toolkit 2.0)C++ pod Windows / 5. èas : Zostavovanie aplikácieAPS Podporuje prehliadaè zdrojov Resource view fileVítam vás pri poslednej èasti seriálu v tomto roku a možnoaj storoèí (èi nebodaj tisícroèí?). Je to zaujímavé, ale my, èoteraz žijeme, sme zažili a ešte aj zažijeme to, èo sa možnonepodarilo nikomu. Veï poèítajte so mnou. ZatmenieSlnka a Mesiaca, vidite¾né z ok<strong>na</strong> nášho domu, prelomtisícroèia, rôzne kométy, divoké postavenia planét aïalšie udalosti, ktoré sa normálne dejú jed<strong>na</strong> po druhejs odstupom dobrých 100 až 200 rokov. A my sme ichvšetky zažili v priebehu 5 rokov. K tomu by sa dal prirov<strong>na</strong>azda len otrepaný cirkusový výrok: „Uvidíte, èo eštenikto nikdy nevidel!“ A v tomto prípade je aj pravdivý.No ale vrá me sa k <strong>na</strong>šej téme. Chápem, že sa vám asiažko chce v tomto èase rozmýš¾a o takých veciach, ako súC++ a programovanie, ale èo už... Treba za a zuby apusti sa do uèenia. Na tomto mieste by som chcel poïakovavšetkým, ktorí píšu svoje postrehy o tomto seriáli. Vïakatomu, že si môžem preèíta , èo od neho èakáte a èo by stev òom uvítali, môžem vám jeho štruktúru stále viac prispôsobova. Napríklad už v tejto èasti nájdete ve¾mi dobré linky<strong>na</strong> rôzne stránky zaoberajúce sa programovaním v C++.V každej novej èasti nájdete aj nové linky. Zároveò chcemvyzva vás všetkých: ak máte nejaké nápady èi požiadavky, èoby ste v seriáli chceli/nechceli vidie , <strong>na</strong>píšte mi. Ak to budúdobré nápady, urèite sa zrealizujú.V predchádzajúcej èasti sme zaèali s opisom knižniceMFC. Uviedli sme jeden ukážkový príklad: First, ktorý sme siaj struène opísali. Ak máte pocit, že ste nieèo nepochopili,nemajte strach, ku všetkému sa dostaneme. Zaèneme tým<strong>na</strong>jzákladnejším, teda procesom zostavovania aplikácie.Build processAby sme zaèali úplne od základov, treba objasni pojem projekt.Projekt predstavuje súhrn <strong>na</strong>vzájom súvisiacichsúborov, ktoré sú kompilované a linkované, aby vytvorilispustite¾ný súbor alebo knižnicu DLL. Toto je zaužívanádefinícia, ktorá sa používa pri projektoch vo Windows. Abyste si to vedeli lepšie predstavi , projektom môžeme oz<strong>na</strong>èivšetky súbory, ktoré vytvorí prekladaè v adresári projektu,Prípo<strong>na</strong> súboru Opis Anglický ekvivalentBSC Súbor informácií Source browserprehliadaèa kóduinformation fileCLW „Sprievodca“ triedami Class Wizard fileDSP Súbor projektu Project fileDSW Súbor pracovného priestoru Workspace fileMAKMakefileNCB Súbor prehliadaèa tried Class view fileOPTObsahuje konfiguráciupracovného priestoruPLGVytvára súbor logTab. 1 Zoz<strong>na</strong>m súborov, ktoré generuje prostredieVisual C++plus nejaké ïalšie, ktoré sú uložené v adresároch typickýchpre prekladaè (toto sú <strong>na</strong>pr. hlavièkové súbory, knižnice).Prípony, ako aj opis súborov typických pre Visual C++nájdete v tabu¾ke 1. Mnohí z vás urèite poz<strong>na</strong>jú súbory<strong>na</strong>zývané makefile. Pravda je taká, že ak pracujete s prostredímVisual C++ vyšších verzií, s týmito súbormi sanestretnete, len ak by ste požiadali prekladaè, aby ich12/2000 PC REVUE 121
P R O G R A M U J E M Evygeneroval. Tieto súbory v minulosti slúžili ako základné súbory celého projektu, v nich sadefinovali všetky vz ahy medzi zdrojovými súbormi. Momentálne sa ve¾mi nepoužívajú, a akpredsa, slúžia len pre <strong>sk</strong>utoèných odborníkov a my sa nimi nebudeme zapodieva (ak aj, taklen vo „vyšších“ pokraèovaniach seriálu). V terajšej dobe <strong>na</strong>hradil ich funkciu tzv. súbor projektu(project file). Je to súbor s príponou DSP a plní rov<strong>na</strong>kú funkciu ako súbory makefile(uvažujeme prostredie Visual C++). A ako vlastne prebieha kompletný proces zostavovaniacelej aplikácie? Pozrite si obrázok 1. Myslím, že nepotrebuje komentár.Typy súborov a súèasti Visual C++Aby ste lepšie pochopili, aké typy súborov sa vo Visual C++ generujú, uvedieme si ichstruèný opis a vysvetlíme si aj to, aké súèasti Visual C++ ich vytvárajú.Editor a prehliadaè zdrojov: „Zdrojom“ sa vo Windows aplikáciách oz<strong>na</strong>èuje tá èas vašejaplikácie – projektu, ktorú nemusíte programova len zadávaním nekoneèného množstva kódu,ale zvyèajne ju <strong>na</strong>vrhujete vizuálne, práve v editori zdrojov. Príkladom zdroja sú <strong>na</strong>príkladikony, bitmapy, menu, akcelerátory (klávesové <strong>sk</strong>ratky), dialógy. Každý projekt obyèajneobsahuje aspoò jeden textový súbor <strong>sk</strong>riptov zdrojov (tu sú zadefinované zdroje vašej aplikácie).Tento súbor má príponu RC, èo je <strong>sk</strong>ratka z resource script file. K vytváraniu súborovzdrojov sa dostaneme ne<strong>sk</strong>ôr.Kompilátor zdrojov: Preèíta textový súbor <strong>sk</strong>riptov zdrojov (RC) a zapisuje binárnyRES súbor pre linker.Kompilátor C/C++: Kompiluje zdrojový kód (medzi jazykmi C a C++ rozlišuje pomocouprípony súboru. Ak *.c, použije sa kompilátor pre jazyk C, ak *.cpp, resp *.cxx, použijesa kompilátor jazyka C++) a vytvára súbory s príponou OBJ.Linker: Preèíta súbory s príponou OBJ a RES, ktoré vytvoril kompilátor C/C++ a kompilátorzdrojov a s pomocou LIB súborov knižnice MFC, knižnice runtime a Windows kóduvytvára spustite¾ný EXE súbor. Samozrejmos ou je využitie tzv. inkrementálneho linkovania, èominimalizuje èas potrebný <strong>na</strong> opakované linkovanie kódu, v ktorom sme urobili malé zmeny.App Wizard: Je to generátor kódu, ktorý vytvára funkènú kostru aplikácie. Taktovygenerovaná aplikácia má minimálnu funkènos a slúži len ako základ <strong>na</strong> pridávanieObr. 1 Proces zostavovania aplikácie vo Visual C++ïalších prvkov. Ako bude vyzera táto „minimál<strong>na</strong> funkènos “, to si volíme v dialógochpri generovaní aplikácie pomocou App Wizardu. Jeho konkrétne použitie si vysvetlíme<strong>na</strong>budúce.Class Wizard: Tento program nám u¾ahèuje udržiavanie poriadku v kóde a triedach. Ak potrebujemenovú triedu èi obslúži nejakú správu, robíme tak vždy pomocou Class Wizardu. Vyhnemesa tak mnohým problémom s integritou celej aplikácie. Jeho konkrétne použitie si rov<strong>na</strong>kovysvetlíme <strong>na</strong>budúce.Source Browser: Tento nástroj nám u¾ahèuje vôbec vyz<strong>na</strong> sa v zdrojovom kóde.Umožòuje nám editova aplikáciu nie z poh¾adu súborov, ale z poh¾adu tried a funkcií.Pracuje vo viacerých režimoch, opis nájdete v helpe. Ja vám odporúèam vypnú ho, jed<strong>na</strong>kako zaèiatoèníci sa v òom asi ažko vyznáte, jed<strong>na</strong>k z<strong>na</strong>ène spoma¾uje proceszostavovania aplikácie, keïže generuje dos ve¾ký súbor (*.bsc). Vypnú ho môžete takto:Z menu Project vyberte Settings..., kliknite <strong>na</strong> záložku Browse Info a odškrtnite položku:Build browse info file. Rov<strong>na</strong>ko <strong>na</strong> karte C/C++ odškrtnite položku Generate browse info.(platí pre verziu Visual C++ 6.0). Keï budete písa také zložité aplikácie, že vám buderobi problém vyz<strong>na</strong> sa vo svojom zdrojovom kóde, alebo keï preberiete nejaký projektod svojho kolegu, aby ste sa s ním oboznámili, má použitie Source browsera svoje opodstatnenie,i<strong>na</strong>k nie.Debugger: Predpokladám, že každému z vás je pojem debugger jasný. Tento programmôže èasto predstavova poslednú záchranu z beznádejnej situácie. A samozrejme, ženesmie chýba v takom prostredí, ako je Visual C++. Len v struènosti: debugger VisualC++ obsahuje všetky štandardne používané prvky – krokovanie programu, <strong>na</strong>staveniebodov prerušenia a podobne. Odporúèam vám dobre sa oboznámi s prostredím debuggera,lebo pri vývoji aplikácií ho budete èasto potrebova . Napíšte si nejaký jednoduchý„programík“ (nemusí to by program pod Windows) a potom si ho vy<strong>sk</strong>úšajte odkrokova, sledujte hodnoty premenných...Zodpovedajúca èlen<strong>sk</strong>áSpráva Windows funkcia knižnice MFC OpisWM_CHAR OnChar Reaguje <strong>na</strong> udalos , spôsobenú <strong>na</strong> klávesniciWM_CLOSE OnClose Vymaže okno a uzavrie hoWM_CREATE OnCreate Vytvorenie ok<strong>na</strong>WM_DESTROY OnDestroy Zrušenie ok<strong>na</strong>WM_ERASEBKGND OnEraseBkgnd Obnovenie pozadia ok<strong>na</strong>WM_HSCROLL OnHScroll Kliknutie <strong>na</strong> horizontálny posuvníkWM_VSCROLL OnVScroll Kliknutie <strong>na</strong> vertikálny posuvníkWM_KEYDOWN OnKeyDown Stlaèenie klávesuWM_KEYUP OnKeyUp Uvo¾nenie klávesuWM_LBUTTONDBLCLK OnLButtonDblClk „Dvojklik“ <strong>na</strong> ¾avom tlaèidle myšiWM_RBUTTONDBLCLK OnRButtonDblClk „Dvojklik“ <strong>na</strong> pravom tlaèidle myšiWM_LBUTTONDOWN OnLButtonDown Stlaèenie ¾avého tlaèidla myšiWM_RBUTTONDOWN OnRButtonDown Stlaèenie pravého tlaèidla myšiWM_LBUTTONUP OnLButtonUp Uvo¾nenie ¾avého tlaèidla myšiWM_RBUTTONUP OnRButtonUp Uvo¾nenie pravého tlaèidla myšiWM_MOVE OnMove Presun ok<strong>na</strong>WM_SETFOCUS OnSetFocus Okno sa stalo aktívnym (dostalo focus)WM_SHOWWINDOW OnShowWindow Zobrazenie/ukrytie ok<strong>na</strong>WM_SIZE OnSize Zme<strong>na</strong> ve¾kosti ok<strong>na</strong>WM_TIMER OnTimer Vypršanie èasu <strong>na</strong>staveného v èasovaèiTab. 2Zoz<strong>na</strong>m <strong>na</strong>jèastejšie používaných funkcií <strong>na</strong> obsluhu konkrétnych správsystému WindowsMapovanie správ v knižnici MFCUž viete, ako sa aplikácia zostavuje, aké sú hlavné súèasti prostredia Visual C++, teraz savrá me k príkladu First z predchádzajúcej èasti. Ako vlastne pracuje systém spracúvania správv aplikácii, ktorá využíva knižnicu MFC? Na zaèiatku musíme ešte doplni vaše vedomostio správach. Už sme sa o nich zmienili, ale ešte sme si ich nerozde¾ovali. Rozlišujeme tri základnédruhy správ v systéme Windows. Prvým typom, s ktorým sme sa už stretli, sú tzv. štandardnésprávy. Zaèí<strong>na</strong>jú sa prefixom WM. Príkladom sú <strong>na</strong>pr. správy WM_PAINT, WM_LBUT-TONDOWN, WM_TIMER a podobne. Týchto správ je drvivá väèši<strong>na</strong>. Druhým typom sú príkazovésprávy. Tie reagujú <strong>na</strong> používate¾ov príkaz, ktorý vydal buï kliknutím <strong>na</strong> položku v menu,<strong>na</strong> panel nástrojov alebo <strong>na</strong> nejaký iný ovládací prvok, alebo keï používate¾ stlaèil <strong>sk</strong>ratkovýkláves. Tieto správy sa zaèí<strong>na</strong>jú rov<strong>na</strong>ko prefixom WM, ale za ním musí <strong>na</strong>sledova ešte COM-MAND, takže príkazová správa vyzerá: WM_COMMAND. Tretím typom správ sú notifikaènéalebo aj informaèné správy. Tieto správy využívajú pre seba hlavne ovládacie prvky a dcér<strong>sk</strong>eokná (èo to je, si povieme ne<strong>sk</strong>ôr), aby dali svojmu rodièov<strong>sk</strong>ému oknu vedie , že sa zmenil ichstav. Napríklad keï zmeníte text v textovom poli, ono pošle správu EN_CHANGE, aby oznámilo,že sa nieèo udialo, a je <strong>na</strong> programe, ako túto správu obslúži. Dos však bolo teórie, poïmesi to aj prakticky vy<strong>sk</strong>úša . Pozrite sa teraz <strong>na</strong> výpis príkladu First, <strong>na</strong>jprv <strong>na</strong> výpis súboru first.h.Nájdite si deklaráciu chránených (protected) funkcií v triede CFirstApp. Nájdete tam deklaráciujednej funkcie OnPaint. Z<strong>na</strong>ky afx_msg oz<strong>na</strong>èujú, že táto funkcia slúži <strong>na</strong> spracovanie správsystému Windows funkciami knižnice MFC (v <strong>sk</strong>utoènosti je afx_msg len oz<strong>na</strong>èenie pre nás, žedaná funkcia je èlenom mapy správ, prekladaè toto oz<strong>na</strong>èenie ignoruje). Meno tejto funkcie sinemôžeme voli , ako sa nám zachce. Pre každú správu, ktorú vie knižnica MFC obslúži , má užMFC vyhradené nejaké meno. Takže ak my chceme obslúži stlaèenie ¾avého tlaèidla myši,musíme použi èlen<strong>sk</strong>ú funkciu knižnice MFC OnLButtonDown a nijakú inú. Opis správ a priradenýchfunkcií nájdete v tabu¾ke 2. Pod deklaráciou tejto funkcie sa <strong>na</strong>chádza makroDECLARE_MESSAGE_MAP, ktoré je vždy deklarované v definícii tej triedy, ktorá má <strong>na</strong> starostispracovanie konkrétnej správy. Takto sa deklaruje mapa správ. Implementáciu mapy správ sipozrite v zdrojovom súbore príkladu First.cpp. Zaèí<strong>na</strong> sa makrom BEGIN_MESSAGE_MAP akonèí makrom END_MESSAGE_MAP. V makre BIGIN_MESSAGE_MAP môžete nájs názovtriedy, pre ktorú je urèená táto mapa správ (CMyFrame), ako aj meno triedy, od ktorej je tátotrieda odvodená (CFrameWnd). Medzi týmito dvoma makrami sa <strong>na</strong>chádza zoz<strong>na</strong>m správ,ktoré sú obsluhované funkciami MFC. V <strong>na</strong>šom prípade je to správa ON_WM_PAINT, ktorá jeobsluhovaná funkciou OnPaint. Ak teda aplikácia vyšle správu WM_PAINT, aplikaèný systém juzachytí a zavolá príslušnú funkciu, aby správu obslúžila. Pri vývoji aplikácie sa obyèajnenemusíte stara o písanie správ a písanie príslušných deklarácií ich obslužných funkcií. Tútoprácu za nás robí Class Wizard. Jeho použitie <strong>na</strong> konkrétnom príklade si ukážeme <strong>na</strong>budúce.Aby ste však aspoò trochu pochopili, ako daný systém pracuje, mierne si zdoko<strong>na</strong>líme príkladFirst. Chceme, aby sa po stlaèení ¾avého tlaèidla myši vypísal text „Tu som“ presne <strong>na</strong> tommieste, kde sme klikli myšou do ok<strong>na</strong> aplikácie. Ako to urobi ? V prvom rade musíme pridafunkciu, ktorá by obsluhovala správu stlaèenia ¾avého tlaèidla myši. Nebudeme ešte <strong>na</strong> topoužíva Class Wizard, urobíme to klasicky ruène. Ako vidíte v tabu¾ke 2, správa <strong>na</strong> stlaèenie¾avého tlaèidla myši sa volá WM_LBUTTONDOWN a jej obslužná funkcia OnLButtonDown.Preto dopíšte deklaráciu obslužnej funkcie OnLButtonDown do súboru First.h pod funkciuOnPaint, takže chránená èas triedy CFirstApp bude vyzera takto:protected:// afx_msg oz<strong>na</strong>èuje ,že funkcia OnPaint je súèas ouspracúvania správ MFC122 PC REVUE 12/2000