Image
7.6.2016 0 Comments

ASSEMBLER pod Windows: 6. časť – Kontext zariadenia

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

Kontext zariadenia

Základný nástroj, ktorý operačný systém Windows používa na to, aby poskytol aplikáciám nezávislosť od zariadenia, sa nazýva kontext zariadenia (DC – device context). Kontext zariadenia je vnútorná štruktúra, ktorú systém Windows používa na udržiavanie informácií o výstupnom zariadení. Miesto toho, aby aplikácia posielala výstup priamo na technický prostriedok, posiela ho do DC a až potom ho Windows pošle technickému vybaveniu. Kontext zariadenia vždy obsahuje jedno pero na kreslenie čiar (PEN), jeden štetec na vyplňovanie plôch (BRUSH), jeden typ písma (FONT) a súbor ďalších hodnôt, ktoré riadia správanie kontextu zariadenia. V prípade, že aplikácia vyžaduje iný font, je potrebné vybrať tento font do grafického kontextu pred zobrazením textu. Vybraním nového fontu sa nezmení text, ktorý už bol zobrazený v klientskej oblasti okna. Pri používaní zdieľaného kontextu zariadenia aplikácia musí obnoviť nastavenie grafického kontextu pred volaním funkcie ReleaseDC. Objekty ako PEN, BRUSH, FONT vytvorené a vybrané do DC by mali byť zmazané pred volaním funkcie ReleaseDC. Nesnažte sa zmazať objekty vrátené funkciou GetStockObject.

Bežne aplikácie zdieľajú a vracajú kontexty zariadení tesne pred ich použitím a tesne po ňom. Tento spôsob funguje dobre pre aplikácie, ktoré nevyžadujú často DC na kreslenie. Aplikácie, ktoré vyžadujú DC na pokračovanie základu, môžu vytvoriť okno s jeho súkromným DC. To sa dosiahne zadaním štýlu triedy CS_OWNDC v definícii triedy okna. S takýmto štýlom triedy kontext zariadenia existuje po celú dobu života aplikácie. Aplikácie stále používajú GetDC na získanie ukazovateľa na kontext zariadenia, ale po použití kontextu zariadenia nemusia volať funkciu ReleaseDC. Pokiaľ program používa súkromný kontext zariadenia, potom zmena nastavenia tohto kontextu, ako nová farba textu, PEN, BRUSH, zostávajú v platnosti, dokiaľ ich aplikácia znovu nezmení.

Vedľa kontextových zariadení používa Windows ďalší druh objektov (nazývaných GDI) na kreslenie obrázkov v oknách i na tlačenej stránke. Vo Windows je kontext zariadenia objektom, na ktorý sa kreslia obrázky, a GDI objekty slúžia ako kresliace nástroje (PEN, BRUSH, FONT).

Grafické rozhranie poskytuje aplikáciám systému Windows nezávislé rozhranie na prístup na obrazovku a tlačiareň. GDI je vrstva medzi aplikáciami a rôznymi typmi technického vybavenia. Táto architektúra zbavuje programátora povinnosti zaoberať sa priamo každým typom zariadenia a prenáša úlohu rozdielnosti medzi rôznymi technickými zariadeniami na GDI. Dobre vytvorené aplikácie budú pracovať rovnako na všetkých typoch technického vybavenia aj na každom novom technickom vybavení v budúcnosti.

Všetky funkcie GDI v prostredí WIN32 používajú 32–bitové hodnoty súradníc. No v prostredí WIN95 a WIN32s je vyššie slovo ignorované a používa sa 16–bitová hodnota súradníc. Aplikácie operačného systému WINDOWS NT používajú celú 32–bitovú hodnotu.

Pretože Windows vyžadujú použitie kontextu zariadenia a GDI objekty pri kresliacich operáciách, musíme používať na kreslenie obrázkov v aplikáciách pre Windows obidva druhy objektov.

Stručne možno Device context (DC) charakterizovať takto:

·      DC je štruktúra, ktorá definuje nastavenie grafických objektov, ich atribútov a grafické režimy ovplyvňujúce výstup,

·      DC je virtuálny objekt, ktorý pripraví plochu na kreslenie,

·      DC je nezávislý od výstupu na obrazovku, resp. tlačiareň alebo plotter.

BeginPaint

Windows NT

Win 95

Win32s

Lib

Include

Áno

Áno

Áno

user32.lib

user32.inc

 

Funkcia BeginPaint pripraví špecifikované okno na kreslenie, vyplňovanie a štruktúru PAINTSTRUCT

s informáciami o maľovaní. BeginPaint aktivuje proces kreslenia do okna, rezervuje kontext zariadenia a vracia informácie o prekresľovanej oblasti. Po volaní funkcie BeginPaint Windows predpokladá, že oblasť, ktorá sa mala aktualizovať, bola prekreslená a nastavuje oblasť určenú na prekreslenie na prázdnu.

Definícia štruktúry PAINTSTRUCT

typedef struct tagPAINTSTRUCT { // ps

    HDC  hdc;

    BOOL fErase;

    RECT rcPaint;

    BOOL fRestore;

    BOOL fIncUpdate;

    BYTE rgbReserved[32];

} PAINTSTRUCT;

hdc HDC: Kontext zariadenia, ktorý sa má použiť na kreslenie.

fErase BOOL: Pokiaľ sa musí pozadie vymazať, je to nenulová hodnota. Pokiaľ bolo okno vytvorené bez štetca pre pozadie, aplikácia je zodpovedná za zmazanie pozadia.

rcPaint RECT: Ohraničujúci pravouholník oblasti, ktorá sa má aktualizovať.

fRestore BOOL: Rezervované; interne používané OS Windows.

fIncUpdate BOOL: Rezervované; interne používané OS Windows.

rgbReserved BYTE[32]: Rezervované; interne používané OS Windows.

Syntax: HDC BeginPaint, HWND  hwnd, LPPAINTSTRUCT  lpPaint

hwnd HWND: Handle okna, kam sa bude kresliť.

lpPaint LPPAINTSTRUCT: Ukazovateľ na štruktúru PAINTSTRUCT. Windows vyplňuje túto štruktúru informáciami o aktualizovanej oblasti daného okna.

Výsledok funkcie: Po úspešnom vykonaní funkcie sa vráti handle kontextu zariadenia, ktorý by sa mal použiť pri kreslení do okna. V ostatných prípadoch sa vráti hodnota NULL.

Správa: WM_PAINT

 

EndPaint

Windows NT

Win 95

Win32s

Lib

Include

Áno

Áno

Áno

user32.lib

user32.inc

Funkcia EndPaint označuje koniec kresliacej procedúry. Funkcia musí byť použitá po BeginPaint, po poslednej operácii kreslenia. Ak bol kurzor funkciou BeginPaint skrytý, potom EndPaint musí jeho stav obnoviť.

Syntax: BOOL EndPaint, HWND  hWnd, LPPAINTSTRUCT  lpPaint

hWnd HWND: Handle okna, kam sa kreslilo.

lpPaint LPPAINTSTRUCT: Ukazovateľ na štruktúru PAINTSTRUCT. Použije sa štruktúra, ktorá bola vyplnená volaním funkcie BeginPaint.

Výsledok funkcie: Funkcia vráti vždy hodnotu TRUE.

 

GetClientRect

Windows NT

Win 95

Win32s

Lib

Include

Áno

Áno

Áno

user32.lib

user32.inc

Funkcia GetClientRect získava súradnice klientskej oblasti okna. Klientske súradnice určuje ľavý horný a pravý dolný roh klientskej oblasti. Pretože klientske súradnice sú relatívne k ľavému hornému rohu klientskej oblasti okna, súradnice ľavého horného rohu sú (0,0). GetClientRect sa používa na zistenie veľkosti klientskej oblasti okna.

Syntax: BOOL GetClientRect, HWND  hWnd, LPRECT  lpRect

hWnd HWND: Handle okna.

lpRect LPRECT: Ukazovateľ na štruktúru RECT, ktorá dostane súradnice klientskej oblasti.

Výsledok funkcie: Funkcia vráti TRUE, ak bola úspešná, inak FALSE.

 

Definícia štruktúry RECT

typedef struct _RECT {    // rc

 

    LONG left;

    LONG top;

    LONG right;

    LONG bottom;

} RECT;

Štruktúra RECT definuje súradnice ľavého horného a pravého dolného rohu pravouholníka.

left – určuje x-ovú súradnicu ľavého horného rohu pravouholníka.

top – určuje y-ovú súradnicu ľavého horného rohu pravouholníka.

right – určuje x-ovú súradnicu pravého dolného rohu pravouholníka.

bottom – určuje y-ovú súradnicu pravého dolného rohu pravouholníka.

 

TabbedTextOut

Windows NT

Win 95

Win32s

Lib

Include

Áno

Áno

Áno

user32.lib

user32.inc

Funkcia vypíše reťazec na špecifikovanú pozíciu v kontexte zariadenia tak, že vykoná rozšírenie tabulátorov na hodnoty zadané v poli pozícií tabulátorov. Text sa vypíše v aktuálnom type písma.

Syntax: LONG TabbedTextOut, HDC hdc, int x, int y, LPCTSTR lpString, int nCount, int nTabPositions, LPINT  lpnTabStopPositions, int nTabOrigin

hdc HDC: Kontext zariadenia.

x int: x-ová súradnica počiatočného bodu reťazca v logických jednotkách.

y int: y-ová súradnica počiatočného bodu reťazca v logických jednotkách.

lpString LPCTSTR: Ukazovateľ na reťazec znakov, ktorý sa má zobraziť.

nCount int: Počet znakov v reťazci.

nTabPositions int: Počet hodnôt v poli pozícií tabulátorov, na ktoré ukazuje parameter.

lpnTabStopPositions int: Ak je hodnota parametra nula, tabulátory sa rozprestrú na osemnásobok priemernej šírky znaku. Ak hodnota tohto parametra je 1, tabulátory sa rozprestrú na veľkosť určenú prvou položkou poľa, na ktoré ukazuje lpnTabStopPositions.

lpnTabStopPositions LPINT: Ukazovateľ na pole, ktoré obsahuje tab-stop pozície tabulátorov vo vzostupnom poradí v logických jednotkách.

nTabOrigin int: Súradnica X v logických jednotkách, počiatočná pozícia, od ktorej sú tabulátory expandované.

Výsledok funkcie: Ak bola funkcia úspešná, vráti rozmery reťazca v logických jednotkách. Výšku predstavuje horná časť slova a šírku spodná.

TextOut

Windows NT

Win 95

Win32s

Lib

Include

Áno

Áno

Áno

gdi32.lib

gdi32.inc

Funkcia vypíše reťazec znakov na zadanú pozíciu pomocou aktuálneho typu písma.

Syntax: BOOL TextOut, HDC hdc, int nXStart, int nYStart, LPCTSTR lpString, int cbString

hdc HDC: Kontext zariadenia.

nXStart int: x-ová súradnica referenčného bodu použitého na vyrovnanie textu.

nYStart int: y-ová súradnica referenčného bodu použitého na vyrovnanie textu.

lpString LPCTSTR: Ukazovateľ na reťazec znakov, ktorý sa má zobraziť.

cbString int: Počet znakov v reťazci.

Výsledok funkcie: Ak bola funkcia úspešná, vráti hodnotu TRUE, inak FALSE.

DrawText

Windows NT

Win 95

Win32s

Lib

Include

Áno

Áno

Áno

user32.lib

user32.inc

Funkcia zobrazí formátovaný text v zadanom pravouholníku.

Syntax: int DrawText, HDC hDC, LPCTSTR lpString, int nCount, LPRECT lpRect, UINT uFormat

hDC HDC: Handle kontextu zariadenia.

lpString LPCTSTR: Ukazovateľ na reťazec, ktorý sa má vykresliť.

nCount int: Počet znakov, ktoré sa majú vykresliť. V prípade, že je táto hodnota –1, predpokladá sa, že reťazec je ukončený nulou.

lpRect LPRECT: Ukazovateľ na štruktúru RECT, ktorá definuje pravouholník, do ktorého bude text formátovaný. 

uFormat UINT: Rôzne príznaky, ktoré riadia proces formátovania. Parameter môže byť akákoľvek kombinácia hodnôt z tabuľky 1.

Tab. 1

Príznak

Opis

DT_BOTTOM

Text je zarovnaný pozdĺž spodnej hrany zadaného pravouholníka. Táto hodnota musí byť kombinovaná s príznakom DT_SINGLELINE.

DT_CALCRECT

Zistí šírku a výšku pravouholníka. Ak zadaný text obsahuje viacnásobné riadky, použije sa šírka zadaného pravouholníka a jeho výška sa zvýši tak, aby sa prispôsobila poslednému riadku textu. Pokiaľ sa spracúva iba jeden riadok textu, prvá strana pravouholníka sa rozšíri tak, aby bol pojatý celý reťazec. Funkcia DrawText vráti výšku formátovaného textu, ale text sa nevykreslí.

DT_CENTER

Každý riadok textu sa v ohraničujúcom pravouholníku horizontálne centruje.

DT_EXPANDTABS

Znaky tabulátor v texte sa rozlišujú. Implicitné nastavenie pre tabulátor je osem medzier.

DT_EXTERNALLEADING

Pri výpočte výšky riadka berie do úvahy vonkajšie riadkovanie. Normálne sa toto neuvažuje.

DT_LEFT

Každý riadok textu zarovná vľavo.

DT_NOCLIP

Kreslí text bez orezania. To dovolí urýchliť priebeh funkcie DrawText.

DT_NOPREFIX

Znaky „&“ v texte nie sú interpretované ako prefixové znaky. Normálne výskyt takéhoto znaku spôsobí, že ho funkcia DrawText preskočí a podčiarkne nasledujúci znak.

DT_RIGHT

Každý riadok textu zarovná vpravo.

DT_SINGLELINE

Návrat vozíka (kód 0Dh) a riadkovanie (kód 0Ah) sa ignorujú. Text sa vypisuje na jednom riadku.

DT_TABSTOP

Dovoľuje zmeniť implicitné nastavenie tabulátora. Normálne je tabulátor nastavený na každých osem pozícií. Použitím tejto hodnoty môžete toto nastavenie odstupu zmeniť. Nové nastavenie by malo byť uložené v horných ôsmich bitoch (teda 15 – 8) parametra uFormat.

DT_TOP

Zarovnanie textu pozdĺž hornej hrany ohraničujúceho pravouholníka. Táto hodnota musí byť kombinovaná s príznakom DT_SINGLELINE.

DT_VCENTER

Text v ohraničujúcom pravouholníku vertikálne vycentruje. Táto hodnota musí byť kombinovaná s príznakom DT_SINGLELINE.

DT_WORDBREAK

Indikuje, že každý riadok sa má prerušiť na konci posledného slova, ktoré horizontálne padne do pravouholníka. Textový reťazec pokračuje nasledujúcim slovom na ďalšom riadku pravouholníka. Znaky návratu vozíka (kód 0Dh) a riadkovania (0Ah) prerušujú riadok.

Výsledok funkcie: Ak bola funkcia úspešná, vráti výšku formátovaného textu.

DrawTextEx

Windows NT

Win 95

Win32s

Lib

Include

Áno

Áno

Nie

user32.lib

user32.inc

 

Funkcia vypíše zadaný text. Ak sa to vyžaduje, vykoná formátovanie výstupu.

Syntax: int DrawTextEx HDC hdc, LPTSTR lpchText, int cchText, LPRECT lprc, UINT dwDTFormat,   LPDRAWTEXTPARAMS lpDTParams

hdc HDC: Handle kontextu zariadenia, do ktorého sa bude kresliť.

lpchText LPTSTR: Ukazovateľ na reťazec, ktorý sa má vykresliť.

cchText int: počet znakov, ktoré sa majú vypísať. Pokiaľ je táto hodnota –1, predpokladá sa, že reťazec je zakončený nulou.

lprc LPRECT: Ukazovateľ na štruktúru RECT, ktorá definuje pravouholník, do ktorého je text formátovaný.

dwDTFormat UINT: Príznaky, ktoré riadia proces formátovania. Parameter môže byť akákoľvek kombinácia hodnôt z tabuľky 2.

lpDTParams LPDRAWTEXTPARAMS: Ukazovateľ na štruktúru DRAWTEXTPARAMS, ktorá obsahuje dodatočné formátovacie informácie a návratové hodnoty. Parameter môže byť NULL.

 

Tab. 2

Príznak

Opis

DT_EDITCONTROL

Formátuje a zobrazuje text ako v editovateľnom prvku. Časť riadka, ktorá sa nevojde do pravouholníka, sa nezobrazí.

DT_END_ELLIPSIS

Pokiaľ sa daný reťazec nezmestí do pravouholníka, na konci reťazca sa použije znak (…). Ak je zadaný príznak  DT_MODIFYSTRING – modifikovaný reťazec sa vráti vo vyrovnávacej pamäti, na ktorú ukazuje lpchText. Nemusia sa zadávať obidva príznaky.

DT_PATH_ELLIPSIS

Ak sa daný reťazec nezmestí do pravouholníka, uprostred reťazca sa použije znak (…). Ak je zadaný príznak  DT_MODIFYSTRING – modifikovaný reťazec sa vráti vo vyrovnávacej pamäti, na ktorú ukazuje lpchText. Nie je potrebné zadávať obidva príznaky. Pokiaľ reťazec obsahuje vložený znak backslash (\) označujúci meno cesty, potom sa ponechá taký dlhý koniec reťazca (pravdepodobne meno súboru), ako je to len možné.

DT_MODIFYSTRING

Keď je použitý spolu s príznakmi DT_PATH_ELLIPSIS alebo DT_END_ELLIPSIS – DT_MODIFYSTRING, nariadi, aby funkcia DrawTextEx vrátila upravený reťazec vo vyrovnávacej pamäti, na ktorú ukazuje lpchText.

DT_RTLREADING

Pokiaľ je písmo špecifikované v kontexte zariadenia ako arabské alebo hebrejské, potom sa text prekladá v poradí right-to-left. Implicitne je nastavená hodnota left-to-right.

DT_TABSTOP

Príznak je podobný príznaku DT_TABSTOP pri funkcii DrawText okrem toho, že zarážky tabulátorov sú založené na hodnote zadanej v štruktúre, na ktorú ukazuje  lpDTParams.

Výsledok funkcie: Ak bola úspešná, vráti výšku formátovaného textu, v opačnom prípade vráti hodnotu NULL.

 

Definícia štruktúry DRAWTEXTPARAMS

typedef struct {

  UINT cbSize;

  int  iTabLength;

  int  iLeftMargin;

  int  iRightMargin;

  UINT uiLengthDrawn;

} DRAWTEXTPARAMS, *LPDRAWTEXTPARAMS;

 

cbSize  UINT: Veľkosť štruktúry v bajtoch.

iTabLength int: Veľkosť každej zarážky tabulátora v jednotkách ekvivalentných priemernej šírke znaku.

iLeftMargin  int: Ľavý okraj v jednotkách ekvivalentných priemernej šírke znaku.

iRightMargin  int: Pravý okraj v jednotkách ekvivalentných priemernej šírke znaku.

uiLengthDrawn  UINT: Získa počet znakov spracovaných funkciou DrawTextEx vrátane prázdnych znakov. Číslo môže predstavovať dĺžku reťazca alebo index prvého riadka, ktorý sa nachádza pod kresliacou oblasťou. Pokiaľ je zadaný formátovací príznak DT_NOCLIP, funkcia DrawTextEx vždy spracuje celý text.

Ukážkový program nájdete opäť na našom webe www.pcrevue.sk.

Nabudúce...

Povieme si niečo o zobrazení textu v ľubovoľnej farbe a s ľubovoľným typom písma. V praktickom príklade sa vrátime k dnešnej téme a nakreslíme si zopár základných grafických objektov.

 

Slovník skratiek

GDI (Graphic Device Interface) – rozhranie grafického zariadenia.

CLIENT AREA – oblasť okna, kde aplikácia zobrazuje výstup – text a grafiku.

COM (Component Object Model) – komponentový objektový model. Je to opis, ktorý hovorí, ako majú komponenty vyzerať a akým spôsobom majú spolu komunikovať. COM tiež definuje, ako má vyzerať rozhranie komponentu a ako sa má používať. Tento opis zverejnila firma Microsoft takmer pred štyrmi rokmi a vytvorila z neho štandard.


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á