Image
22.6.2016 0 Comments

C++ pod Windows / Objekty Windows / 3. časť

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

V predošlej časti seriálu som vám sľúbil, že v tejto časti si dokončíme rozbor príkladu Hello a uvedieme si aj niečo o kontexte zariadení a GDI objektoch. Svoj sľub hodlám dodržať. Možno sa vám zdá, že sa priveľmi zaoberám opisom „klasického“ programovania vo Windows využitím jazyka C a na jazyk C++ akosi zabúdam. Nebojte sa, dostaneme sa aj k C++, ale základná znalosť Windows API je pre programátora, ktorý vyvíja aplikácie pre Windows, nevyhnutná. Možno si myslíte, že keď sa naučíte používať niektorú knižnicu (napr. MFC), funkcie a rovnako aj znalosti Windows API vám budú zbytočné. Nie je to pravda. Veľakrát sa ocitnete v situácii, keď budete musieť zavolať niektorú API funkciu, lebo vami používaná knižnica neobsahuje vlastné prostriedky na vykonanie vašich požiadaviek. Pri tejto príležitosti mi nedá nespomenúť knihu Programování ve Windows z vydavateľstva Computer Press, ktorej autorom je Charles Petzold. Táto kniha sa podrobne zaoberá programovaním vo Windows využitím len Windows API. Mal som možnosť si túto knihu prezrieť a môžem vám povedať, že sa dotýka takmer všetkých (ak nie úplne všetkých) oblastí programovania vo Windows. No ale na úvod by hádam už aj stačilo, určite ste netrpezliví a chcete sa rýchlo dozvedieť viac o programovaní vo Windows J. Tak teda poďme na to.

PROGRAM HELLO. V predošlej časti sme opísali funkciu WinMain programu Hello. Už viete, čo sa deje pri spustení programu, ako sa nám ukáže hlavné okno programu a ako program vlastne funguje. Zostáva nám už iba povedať si niečo o funkcii WndProc. O tejto funkcii už viete, že sa nazýva aj procedúrou okna a reaguje na udalosti spôsobené programom. Ale ako to vlastne robí? Jednoducho. Jeden jej parameter – UINT message – obsahuje informácie o správe prijatej od funkcie DispatchMessage (tá správu získala od funkcie GetMessage). Tento parameter sa využije neskôr v príkaze switch, aby „nasmeroval“ túto správu na správnu rutinu správy. V našom príklade sú to rutiny WM_PAINT WM_DESTROY. WM_PAINT je zavolaná vždy, keď okno potrebuje prekresliť. U nás spracuje WM_PAINT správu tak, že „vykreslí“ pomocou funkcie DrawText do okna text Hello, world!. Bližšie si o tejto funkcii povieme, keď si budeme opisovať kontext zariadení. Rutina WM_DESTROY je zavolaná vždy, keď sa má okno zrušiť, resp. keď má byť aplikácia ukončená. WM_DESTROY zavolá API funkciu PostQuitMessage, ktorá vyšle správu WM_QUIT, ktorá oznamuje Windows, že aplikácia môže byť ukončená. Windows už vykoná všetko potrebné na to, aby sa aplikácia riadne skončila.

KONTEXT ZARIADENÍ. Ak chceme do okna kresliť obrázok, písať text, ak chceme tento text či obrázok neskôr vytlačiť, určite sa nevyhneme použitiu tzv. kontextu zariadení. Kontext zariadení, označuje sa ako DC, je objekt Windows, ktorý prijíma kresliace príkazy z programu a odovzdáva ich výstupným zariadeniam (v skutočnosti to ide ešte cez nízkoúrovňové API, ktoré obsluhuje výstupné zariadenia, a až potom k samotným zariadeniam – pozri obr. 1). V programoch nie je dôležité, aké zariadenie je použité ako výstupné. Program jednoducho získa handle na kontext zariadení a kreslí doň. O viac sa program nestará. Jeho prácu preberá práve kontext zariadení, ktorý prevedie kresliace príkazy na nízkoúrovňové príkazy, ktorým rozumie nízkoúrovňové API a to tieto príkazy odovzdá výstupným zariadeniam. Je viac spôsobov, ako vytvoriť kontext zariadení. Dostaneme sa k nim v ďalších častiach seriálu.

GDI OBJEKTY. GDI objekty sa rovnako ako kontext zariadení používajú na kreslenie. Ale zatiaľ čo kontext zariadení je objekt, na ktorý sa kreslí, GDI objekty sú objekty, pomocou ktorých sa kreslí (teda napríklad pero, štetec, font atď.). To znamená, že ak chcete v systéme Windows kresliť, musíte používať oba tieto „kresliace“ objekty. Aby sme však boli presní, nie všetky funkcie, ktoré kreslia do kontextu zariadení, musia využívať GDI objekty. Existuje zoznam GDI funkcií (je ich veľmi veľa), ktoré GDI využívajú. Naopak, existujú funkcie, ktoré GDI „obchádzajú“. Použitie GDI, ako aj klasických „kontextových“ funkcií si opäť ukážeme na príklade programu Hello.

Obr. 1 Vysvetlenie väzby GDI objektov a kontextu zariadení s aplikáciou

POUŽITIE „KRESLIACICH“ OBJEKTOV. V našom príklade Hello sa celá „kresliaca“ činnosť odohráva v procedúre správy WM_PAINT­. Aby aplikácia dokázala nakresliť niečo na obrazovku, nemusí toho až tak veľa urobiť. Ako vidíme v príklade, najprv sa volá funkcia BeginPaint. Táto funkcia, jednoducho povedané, pripraví okno na kreslenie a vráti nám aj handle na kontext zariadení. Ako parametre požaduje handle okna, kde sa bude kresliť (hwnd) a adresu štruktúry PAINTSTRUCT, do ktorej bude odovzdávať informácie o kreslení (&ps). Handle na kontext zariadení sa uloží do premennej hdc. Na čo je tento handle potrebný, to sme si už opisovali. Ďalej musí aplikácia zistiť súradnice okna (tzv. klientskeho okna, čo je okno vnútri rámčekov ohraničujúcich aplikáciu a pod menu), do ktorého sa bude kresliť. Potom musí aplikácia získať handle na GDI objekt použitý pri kreslení (v našom prípade je GDI objektom objekt pera). Tento handle sa uloží do premennej hpen a je to vlastne návratová hodnota funkcie CreatePen. Funkcia CreatePen má tri parametre, ktoré určujú, akým perom sa bude kresliť. Prvé dva parametre sú, myslím, jasné, určujú typ pera (v našom prípade plný) a jeho šírku (6 pixelov). Tretí parameter je zaujímavý tým, že parameter RGB(0, 0, 255) je makro. Používa sa na určenie farby GDI objektu a jeho tromi parametrami sú intenzita červenej, zelenej a modrej farby. To znamená, že príkaz RGB(0, 0, 255) vytvorí modré pero. Ďalší príkaz hpenOld=SelectObject(hdc, hpen) priradí vytvorený objekt pera do kontextu zariadení (objekt hpen sa priradí k objektu hdc). Funkcia SelectObject vracia handle na ten GDI objekt, ktorý bol v kontexte zariadení pred tým, ako sme tam uložili objekt hpen. Ako neskôr uvidíte, handle na predchádzajúci GDI objekt je dôležitý pri uvoľňovaní pamäte. Teraz náš program vykoná kreslenie textu na obrazovku pomocou funkcie DrawText. Táto funkcia nevyžaduje nijaký GDI objekt (takže to nie je GDI funkcia), ale päť parametrov. Nebudem ich tu opisovať, ich opis nájdete v helpe, azda len spomeniem, že sú to parametre, ktoré nám udávajú, kde sa text vykreslí a aký kontext zariadení sa na to použije. Teraz sa určite pýtate, načo sme vytvárali GDI objekty a teraz ich nepoužijeme? Je pravda, že súčasná verzia programu Hello tieto GDI objekty vytvára, ruší, ale na kreslenie ich prakticky nijako nevyužívame. Preto dopíšte nasledujúci riadok do procedúry WM_PAINT pod funkciu DrawText:

Ellipse(hdc, rect.left+10, rect.top+10, rect.right-10, rect.bottom-10);

Tento príkaz nakreslí do okna elipsu tak, aby sa neprekrývala s textom. Funkcia Ellipse (to už je GDI funkcia) použije GDI objekt hpen na kreslenie do okna. Skúste sa teraz zamyslieť, prečo je kružnica modrá a text čierny. Riešenie je tu prakticky uvedené. Keď sme už skončili s využívaním GDI objektov, je potrebné uviesť všetko do pôvodného stavu, aby sa zbytočne nezaplňovala pamäť. Na to slúži príkaz SelectObject(hdc, hpenOld), ktorý priradí do kontextu zariadení pôvodný GDI objekt, ktorý tam bol pred objektom hpen. Až teraz zmažeme nami vytvorený objekt pera hpen príkazom DeleteObject(hpen), čím vlastne uvoľníme pamäť, ktorú objekt zaberal. No a nakoniec zavoláme funkciu EndPaint, ktorá oznámi Windows, že všetko kreslenie je úspešne ukončené a práca s kontextom zariadení sa rovnako skončila. Ak by sme túto funkciu nezavolali, Windows by si myslel, že kreslenie je neúspešné, resp. ešte sa neskončilo, a stále by posielal správu WM_PAINT, aby prekreslil svoje okno.

DÁTOVÉ TYPY WINDOWS. Aby sme mohli uzavrieť rozprávanie o základoch programovania vo Windows, treba ešte uviesť niektoré dátové typy, ktoré systém Windows zavádza do jazykov C/C++. Nových dátových typov je nesmierne veľa, preto sa obmedzím na opis tých najzákladnejších a najčastejšie používaných. Ich charakteristiku nájdete v tabuľke. Väčšina ukazovateľov sa začína písmenami P alebo LP. Podobne, ak ide o handle na nejaký objekt, obyčajne sa dátový typ začína písmenom H.

Dátový typ

Stručná charakteristika

BYTE

8 bitov bez znamienka

COLORREF

RGB farebná hodnota – 32 bitov

DWORD

32 bitov bez znamienka

HBRUSH

Handle na objekt typu Brush

HDC

Handle na kontext zariadení

HDESK

Handle na desktop (plochu)

HKEY

Handle na registračný kľúč

HPEN

Handle na objekt Pen

LPARAM

32 bitov so znamienkom (prenáša správu)

LPBYTE

Ukazovateľ na BYTE

LPCSTR

Ukazovateľ na konštantný reťazec

LPINT

Ukazovateľ na INT

LPLONG

Ukazovateľ na LONG

UINT

Unsigned int

WPARAM

32 bitov so znamienkom (prenáša správu)

Tipy na doma. Mohli by ste si pozrieť zoznam GDI funkcií, niektoré rutiny správ a pokúsiť sa aj dopísať niektoré nové rutiny správ do nášho programu Hello. Napríklad sa pokúste napísať takú rutinu, aby stlačenie ľavého tlačidla myši vyvolalo zvukový signál. Na vyslanie zvukového signálu môžete použiť funkciu MessageBeep. Jej opis je v helpe. Rovnako si pozrite aj opisy funkcií DrawText, SelectObject, CreatePen, DeleteObject. Nezabudnite si aspoň zbežne pozrieť nové dátové typy Windows.

Nabudúce. Ukončili sme opis klasického programovania pod Windows. Bol to letmý pohľad na to, ako sa kedysi vo Windows programovalo. Tým však nechcem povedať, že informácie tu uvedené vám budú nanič (pozri úvod). V ďalšej časti už začneme s opisom knižnice MFC a vytvoríme nejaké „skutočné“ aplikácie pre Windows.

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á