Image
23.6.2016 0 Comments

C++ pod Windows / Zostavovanie aplikácie / 5. časť

Späť na úvod >> Späť na programovanie >> Späť na seriál

Vítam vás pri poslednej časti seriálu v tomto roku a možno aj storočí (či nebodaj tisícročí?). Je to zaujímavé, ale my, čo teraz žijeme, sme zažili a ešte aj zažijeme to, čo sa možno nepodarilo nikomu. Veď počítajte so mnou. Zatmenie Slnka a Mesiaca, viditeľné z okna nášho domu, prelom tisícročia, rôzne kométy, divoké postavenia planét a ďalšie udalosti, ktoré sa normálne dejú jedna po druhej s odstupom dobrých 100 až 200 rokov. A my sme ich všetky zažili v priebehu 5 rokov. K tomu by sa dal prirovnať azda len otrepaný cirkusový výrok: „Uvidíte, čo ešte nikto nikdy nevidel!“ A v tomto prípade je aj pravdivý.

No ale vráťme sa k našej téme. Chápem, že sa vám asi ťažko chce v tomto čase rozmýšľať o takých veciach, ako sú C++ a programovanie, ale čo už... Treba zaťať zuby a pustiť sa do učenia. Na tomto mieste by som chcel poďakovať všetkým, ktorí píšu svoje postrehy o tomto seriáli. Vďaka tomu, že si môžem prečítať, čo od neho čakáte a čo by ste v ň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 na rôzne stránky zaoberajúce sa programovaním v C++. V každej novej časti nájdete aj nové linky. Zároveň chcem vyzvať vás všetkých: ak máte nejaké nápady či požiadavky, čo by ste v seriáli chceli/nechceli vidieť, napíšte mi. Ak to budú dobré nápady, určite sa zrealizujú.

V predchádzajúcej časti sme začali s opisom knižnice MFC. Uviedli sme jeden ukážkový príklad: First, ktorý sme si aj 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 najzákladnejším, teda procesom zostavovania aplikácie.

BUILD PROCESS. Aby sme začali úplne od základov, treba objasniť pojem projekt. Projekt predstavuje súhrn navzájom súvisiacich súborov, ktoré sú kompilované a linkované, aby vytvorili spustiteľný súbor alebo knižnicu DLL. Toto je zaužívaná definícia, ktorá sa používa pri projektoch vo Windows. Aby ste si to vedeli lepšie predstaviť, projektom môžeme označiť všetky súbory, ktoré vytvorí prekladač v adresári projektu, plus nejaké ďalšie, ktoré sú uložené v adresároch typických pre prekladač (toto sú napr. 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 poznajú súbory nazývané makefile. Pravda je taká, že ak pracujete s prostredím Visual C++ vyšších verzií, s týmito súbormi sa nestretnete, len ak by ste požiadali prekladač, aby ich vygeneroval. Tieto súbory v minulosti slúžili ako základné súbory celého projektu, v nich sa definovali všetky vzťahy medzi zdrojovými súbormi. Momentálne sa veľmi nepoužívajú, a ak predsa, slúžia len pre skutočných odborníkov a my sa nimi nebudeme zapodievať (ak aj, tak len vo „vyšších“ pokračovaniach seriálu). V terajšej dobe nahradil ich funkciu tzv. súbor projektu (project file). Je to súbor s príponou DSP a plní rovnakú funkciu ako súbory makefile (uvažujeme prostredie Visual C++). A ako vlastne prebieha kompletný proces zostavovania celej aplikácie? Pozrite si obrázok 1. Myslím, že nepotrebuje komentár.

Prípona súboru

Opis

Anglický ekvivalent

APS

Podporuje prehliadač zdrojov

Resource view file

BSC

Súbor informácií prehliadača kódu

Source browser information file

CLW

„Sprievodca“ triedami

Class Wizard file

DSP

Súbor projektu

Project file

DSW

Súbor pracovného priestoru

Workspace file

MAK

Makefile

 

NCB

Súbor prehliadača tried

Class view file

OPT

Obsahuje konfiguráciu pracovného priestoru

 

PLG

Vytvára súbor log

 

Tab. 1  Zoznam súborov, ktoré generuje prostredie Visual C++

Typy súborov a súčasti Visual C++. Aby ste lepšie pochopili, aké typy súborov sa vo Visual C++ generujú, uvedieme si ich struč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 označuje tá časť vašej aplikácie – projektu, ktorú nemusíte programovať len zadávaním nekonečného množstva kódu, ale zvyčajne ju navrhujete vizuálne, práve v editori zdrojov. Príkladom zdroja sú napríklad ikony, bitmapy, menu, akcelerátory (klávesové skratky), dialógy.  Každý projekt obyčajne obsahuje aspoň jeden textový súbor skriptov zdrojov (tu sú zadefinované zdroje vašej aplikácie). Tento súbor má príponu RC, čo je skratka z resource script file. K vytváraniu súborov zdrojov sa dostaneme neskôr.

Kompilátor zdrojov: Prečíta textový súbor skriptov zdrojov (RC) a zapisuje binárny RES súbor pre linker.

Kompilátor C/C++: Kompiluje zdrojový kód (medzi jazykmi C a C++ rozlišuje pomocou prípony súboru. Ak *.c, použije sa kompilátor pre jazyk C, ak *.cpp, resp *.cxx, použije sa 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átor zdrojov a s pomocou LIB súborov knižnice MFC, knižnice runtime a Windows kódu vytvára spustiteľný EXE súbor. Samozrejmosťou je využitie tzv. inkrementálneho linkovania, čo minimalizuje čas potrebný na 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. Takto vygenerovaná aplikácia má minimálnu funkčnosť a slúži len ako základ na pridávanie ďalších prvkov. Ako bude vyzerať táto „minimálna funkčnosť“, to si volíme v dialógoch pri generovaní aplikácie pomocou App Wizardu. Jeho konkrétne použitie si vysvetlíme nabudúce.

Obr. 1 Proces zostavovania aplikácie vo Visual C++

Class Wizard: Tento program nám uľahčuje udržiavanie poriadku v kóde a triedach. Ak potrebujeme novú triedu či obslúžiť nejakú správu, robíme tak vždy pomocou Class Wizardu. Vyhneme sa tak mnohým problémom s integritou celej aplikácie. Jeho konkrétne použitie si rovnako vysvetlíme nabudúce.

Source Browser: Tento nástroj nám uľahčuje vôbec vyznať 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, jednak ako začiatočníci sa v ňom asi ťažko vyznáte, jednak značne spomaľuje proces zostavovania aplikácie, keďže generuje dosť veľký súbor (*.bsc). Vypnúť ho môžete takto: Z menu Project vyberte Settings..., kliknite na záložku Browse Info a odškrtnite položku: Build browse info file. Rovnako na 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 bude robiť problém vyznať sa vo svojom zdrojovom kóde, alebo keď preberiete nejaký projekt od svojho kolegu, aby ste sa s ním oboznámili, má použitie Source browsera svoje opodstatnenie, inak nie.

Debugger: Predpokladám, že každému z vás je pojem debugger jasný. Tento program môže často predstavovať poslednú záchranu z beznádejnej situácie. A samozrejme, že nesmie chýbať v takom prostredí, ako je Visual C++. Len v stručnosti: debugger Visual C++ obsahuje všetky štandardne používané prvky – krokovanie programu, nastavenie bodov 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 vyskúšajte odkrokovať, sledujte hodnoty premenných...           

MAPOVANIE SPRÁV V KNIŽNICI MFC. Už viete, ako sa aplikácia zostavuje, aké sú hlavné súčasti prostredia Visual C++, teraz sa vráťme k príkladu First z predchádzajúcej časti. Ako vlastne pracuje systém spracúvania správ v aplikácii, ktorá využíva knižnicu MFC? Na začiatku musíme ešte doplniť vaše vedomosti o 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čínajú sa prefixom WM. Príkladom sú napr. správy WM_PAINT, WM_LBUTTONDOWN, WM_TIMER a podobne. Týchto správ je drvivá väčšina. Druhým typom sú príkazové správy. Tie reagujú na používateľov príkaz, ktorý vydal buď kliknutím na položku v menu, na panel nástrojov alebo na nejaký iný ovládací prvok, alebo keď používateľ stlačil skratkový kláves. Tieto správy sa začínajú rovnako prefixom WM, ale za ním musí nasledovať ešte COMMAND, 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érske okná (čo to je, si povieme neskôr), aby dali svojmu rodičovskému oknu vedieť, že sa zmenil ich stav. 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 na programe, ako túto správu obslúži. Dosť však bolo teórie, poďme si to aj prakticky vyskúšať. Pozrite sa teraz na výpis príkladu First, najprv na výpis súboru first.h. Nájdite si deklaráciu chránených (protected) funkcií v triede CFirstApp. Nájdete tam deklaráciu jednej funkcie OnPaint. Znaky afx_msg označujú, že táto funkcia slúži na spracovanie správ systému Windows funkciami knižnice MFC (v skutočnosti je afx_msg len označenie pre nás, že daná funkcia je členom mapy správ, prekladač toto označenie ignoruje). Meno tejto funkcie si nemôž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ť členskú funkciu knižnice MFC OnLButtonDown a nijakú inú. Opis správ a priradených funkcií nájdete v tabuľke 2. Pod deklaráciou tejto funkcie sa nachádza makro DECLARE_MESSAGE_MAP, ktoré je vždy deklarované v definícii tej triedy, ktorá má na starosti spracovanie konkrétnej správy. Takto sa deklaruje mapa správ. Implementáciu mapy správ si pozrite v zdrojovom súbore príkladu First.cpp. Začína sa makrom BEGIN_MESSAGE_MAP a končí makrom END_MESSAGE_MAP. V makre BIGIN_MESSAGE_MAP môžete nájsť názov triedy, pre ktorú je určená táto mapa správ (CMyFrame), ako aj meno triedy, od ktorej je táto trieda odvodená (CFrameWnd). Medzi týmito dvoma makrami sa nachádza zoznam správ, ktoré sú obsluhované funkciami MFC. V našom prípade je to správa ON_WM_PAINT, ktorá je obsluhovaná funkciou OnPaint. Ak teda aplikácia vyšle správu WM_PAINT, aplikačný systém ju zachytí a zavolá príslušnú funkciu, aby správu obslúžila. Pri vývoji aplikácie sa obyčajne nemusíte starať o písanie správ a písanie príslušných deklarácií ich obslužných funkcií. Túto prácu za nás robí Class Wizard. Jeho použitie na konkrétnom príklade si ukážeme nabudúce. Aby ste však aspoň trochu pochopili, ako daný systém pracuje, mierne si zdokonalíme príklad First. Chceme, aby sa po stlačení ľavého tlačidla myši vypísal text „Tu som“ presne na tom mieste, kde sme klikli myšou do okna aplikácie. Ako to urobiť? V prvom rade musíme pridať funkciu, ktorá by obsluhovala správu stlačenia ľavého tlačidla myši. Nebudeme ešte na to používať Class Wizard, urobíme to klasicky ručne. Ako vidíte v tabuľke 2, správa na 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 funkciu OnPaint, takže chránená časť triedy CFirstApp bude vyzerať takto:

protected:

            // afx_msg označuje ,že funkcia OnPaint je súčasťou spracúvania správ MFC
afx_msg void OnPaint();
afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
      DECLARE_MESSAGE_MAP()

Prvý parameter funkcie OnLButtonDown nás teraz nemusí zaujímať. O druhom nám stačí vedieť to, že v ňom sú uložené súradnice kurzora pri stlačení ľavého tlačidla myši. X-ová súradnica je prístupná ako point.x a Y-ová ako point.y (prečo to tak je, to si vysvetlíme v ďalších častiach, majte strpenie). Takže funkcia OnLButtonDown nám poskytuje presne to, čo potrebujeme. Aby náš program fungoval, nestačí pripísať funkciu na stlačenie ľavého tlačidla len do deklarácie mapy správ. Musíme pozmeniť aj jej implementáciu (súbor: First.cpp), a to takto: 

BEGIN_MESSAGE_MAP(CMyFrame, CFrameWnd)   // mapa správ
      ON_WM_LBUTTONDOWN()
      ON_WM_PAINT()
END_MESSAGE_MAP()

Teraz máme funkciu už kompletne pridanú do systému mapy správ. Ale po spustení programu zistíte, že stlačenie ľavého tlačidla myši nič neurobí. Na čo sme asi zabudli? Samozrejme, zabudli sme napísať samotné telo funkcie OnLButtonDown. Pripíšte preto nasledujúci kód do súboru First.cpp nad funkciu OnPaint (alebo aj pod ňu, je to jedno):

void CMyFrame::OnLButtonDown(UINT nFlags, CPoint point)
{
      CClientDC dc(this);
      dc.TextOut(point.x, point.y, "Tu som");
}

Správa Windows

Zodpovedajúca členská funkcia knižnice MFC

Opis

WM_CHAR

OnChar

Reaguje na udalosť, spôsobenú na klávesnici

WM_CLOSE

OnClose

Vymaže okno a uzavrie ho

WM_CREATE

OnCreate

Vytvorenie okna

WM_DESTROY

OnDestroy

Zrušenie okna

WM_ERASEBKGND

OnEraseBkgnd

Obnovenie pozadia okna

WM_HSCROLL

OnHScroll

Kliknutie na horizontálny posuvník

WM_VSCROLL

OnVScroll

Kliknutie na vertikálny posuvník

WM_KEYDOWN

OnKeyDown

Stlačenie klávesu

WM_KEYUP

OnKeyUp

Uvoľnenie klávesu

WM_LBUTTONDBLCLK

OnLButtonDblClk

„Dvojklik“ na ľavom tlačidle myši

WM_RBUTTONDBLCLK

OnRButtonDblClk

„Dvojklik“ na pravom tlačidle myši

WM_LBUTTONDOWN

OnLButtonDown

Stlačenie ľavého tlačidla myši

WM_RBUTTONDOWN

OnRButtonDown

Stlačenie pravého tlačidla myši

WM_LBUTTONUP

OnLButtonUp

Uvoľnenie ľavého tlačidla myši

WM_RBUTTONUP

OnRButtonUp

Uvoľnenie pravého tlačidla myši

WM_MOVE

OnMove

Presun okna

WM_SETFOCUS

OnSetFocus

Okno sa stalo aktívnym (dostalo focus)

WM_SHOWWINDOW

OnShowWindow

Zobrazenie/ukrytie okna

WM_SIZE

OnSize

Zmena veľkosti okna

WM_TIMER

OnTimer

Vypršanie času nastaveného v časovači

Tab. 2  Zoznam najčastejšie používaných funkcií na obsluhu konkrétnych správ systému Windows

Ak teraz spustíte program First, po stlačení ľavého tlačidla myši sa na obrazovke presne na pozícií kurzora objaví text: „Tu som“. A je to hotové. Ani to nebolo také ťažké, no nie? Ak vás zaujíma, čo to znamená CClientDC dc(this), prezradím vám len to, že týmto vytvárame kontext zariadení, ktorý má také rozmery ako používateľská oblasť okna programu First. Na zopakovanie: používateľská oblasť okna nezahŕňa titulkový pruh, menu a okraj okna. Podrobnejšie si túto tému rozoberieme v časti venovanej triedam kontextu zariadení.

Tipy na WWW. Ako som písal v úvode, od tejto časti vás budem pravidelne informovať o zaujímavých adresách, ktoré sa týkajú problematiky programovania v jazykoch C/C++ a Visual C++. Ak aj vy poznáte nejaké dobré adresy, prosím, napíšte mi ich, čím ich bude viac, tým lepšie. Tu je prvých päť:

http://www.programmingtutorials.com/main.asp – niečo pre začiatočníkov, rôzne tutorialy

http://www.visualc.com/ – stránka venovaná Visual C++

http://www.planet-source-code.com/– tu nájdete skutočne nepreberné množstvo zdrojových kódov

http://www.programmersheaven.com/– vynikajúca stránka, nájdete tu veľa odkazov na iné stránky

http://www.cuj.com/ – stránka C/C++ Journalu, časopis venovaný jazykom C/C++

Toľko na začiatok, nabudúce ďalšie.

Tipy na doma. Skúste pridať do programu First ďalšie funkcie obsluhujúce správy. Napríklad vymyslite nejakú činnosť pre pravé tlačidlo myši, pre „dvojklik“ ľavého tlačidla a podobne. Inšpiráciu na funkcie, ktoré môžete použiť, nájdete v tabuľke 2.

Nabudúce. Nabudúce si opíšeme prácu s prostredím Visual C++ (vytvoríme aplikáciu s App Wizardom, použijeme Class Wizard, editor zdrojov). Takže stretneme sa až v budúcom roku. Želám vám krásne prežitie vianočných sviatkov a veľa úspechov v novom roku. Majte sa pekne.

Zobrazit Galériu

Nechajte si posielať prehľad najdôležitejších správ emailom

Mohlo by Vás zaujímať

Ako na to

Tipy a triky: Ako na snímku obrazovky na akomkoľvek počítači s Windows?

02.12.2016 00:13

Ak snímky obrazovky robíte často apotrebujete napríklad funkcie na posun stránok alebo snímanie zobrazenia pri vyššom rozlíšení displeja, zrejme používate nejakú špecializovanú aplikáciu. Väčšina použ ...

Ako na to 1

Tipy a triky: Ako aplikácii prednastaviť spúšťanie s administrátorskými právami?

30.11.2016 00:10

Väčšina aspoň trochu skúsenejších používateľov vie, že aj keď máte na operačnom systéme Windows vytvorený administrátorský účet, aplikácie pre bezpečnosť nefungujú vždy splnými administrátorskými práv ...

Ako na to 2

Tipy a triky: Ako vypnúť uzamykaciu obrazovku vo Windows 10?

29.11.2016 00:10

Rozčuľuje vás, že pred každým prihlásením doúčtu vášho počítača musíte prejsť uzamykacou obrazovkou? Windows 10 na tejto obrazovke ukazuje čas,dátum anejakú zaujímavú fotografiu zrôznych kútov sveta. ...

Žiadne komentáre

Vyhľadávanie

Kyocera - prve-zariadenia-formatu-a4-s-vykonom-a3

Najnovšie videá