Fotografický magazín "iZIN IDIF" každý týden ve Vašem e-mailu.
Co nového ve světě fotografie!
Zadejte Vaši e-mailovou adresu:
Kamarád fotí rád?
Přihlas ho k odběru fotomagazínu!
Zadejte e-mailovou adresu kamaráda:
Assembler
Win32Asm 2 - Text
asm
25. ledna 2002, 00.00 | Ukážeme si jak jednoduše pracovat s textem, pozadím a s fonty a jejich atributy. Dozvíme co je to kontext zařízení.
1. ÚvodUživatel komunikuje s Windows pomocí GUI (Graphic user interface) - grafického uživatelského rozhraní, což vyžaduje mnohem komplikovanější řešení než byl textový režim v MS-DOSu. Programy ve Windows využívají funkcí (jsou obsaženy v knihovně GDI32.dll) rozhraní GDI (Graphics device interface). To je univerzální programová vrstva zajišťující komunikaci mezi konkrétní aplikací a hardwarem. Univerzální proto, že její funkce jsou hardwarově nezávislé a lze je tedy použít pro všechny typy grafických karet. Tato univerzálnost je ovšem také vítězstvím nad rychlostí a proto není možné využívat těchto funkcí např. při programování her, od toho tu máme třeba funkce DirectX API. (Téměř) každá aplikace je tvořena oknem do jehož klientské oblasti můžeme kreslit, neboli spíše často musíme, protože okno může být např. překryto jiným oknem a protože Windows si neukládají obsah překryté oblasti, musí být celá oblast po odkrytí znovu překreslena. O nutnosti takového překreslení jsme informování zprávou WM_PAINT. Dostane-li program takovou zprávu, znamená to, že nějakou část klientské oblasti je nutno překreslit, tzn. že tato oblast je tzv. označena za neplatnou.
2. Kontext zařízení
Kontext zařízení (device contect) je určitá struktura obsahující informace o typu písma, jeho velikosti, barvě štětce, atd. Většina funkcí požaduje jako jeden z parametrů handle kontextu zařízení. Po využití kontextu zařízení nějakou funkcí by se měl tento handle uvolnit:
invoke BeginPaint , hWin, ADDR ps
push eax
pop hdc
...
invoke EndPaint , hWin, ADDR ps
BeginPaint - tato funkce získá handle kontextu zařízení a naplní strukturu PAINTSTRUCT.
Vyvolání této funkce také způsobí vymazání neplatné oblasti.
EndPaint znamená konec kreslení
Tento postup se používá pro ošetření zprávy WM_PAINT. Překreslená oblast bude oblast určená v proměnné
rcPaint typu RECT Proto je tento postup nevhodný pro použití v situaci, kdy chceme překreslit i jinou oblast než jen tu neplatnou.
V takovém případě je možné označit tuto oblast za neplatnou pomocí funkce InvalidateRect. Potom jsou dvě možnosti zápisu:a/ Pomocí BeginPaint a EndPaint:
|
b/ Bez použití BeginPaint a EndPaint:
|
3. Barvy
Běžná grafická karta skládá každý bod buď ze 24 bitů (true color), kdy je pro každou barevnou složku určeno 8 bitů nebo z 16 bitů (high color), v tom případě je zelené barvě vyhrazeno 6 bitů a červené s modrou po 5 bitech. Pokud je počet barev pouze 256 (oblíbený DOSovský mód), tj. 8 bitů potom jsou čísla 0-255 indexy do tabulky barev (palety), což znamená, že současně lze zobrazit maximálně 256 jakýchkoliv barev. Barevnému schématu na obrázku odpovídá i následující struktura:
RGBQUAD STRUCT
rgbBlue BYTE ?
rgbGreen BYTE ?
rgbRed BYTE ?
rgbReserved BYTE ?
RGBQUAD ENDS
Můžeme použít registr eax do něhož umístíme barvu pomocí makra:RGB MACRO red,green,blue
XOR EAX,EAX
MOV AL,blue
SHL EAX,8
MOV AL ,green
SHL EAX,8
MOV AL,red
ENDM
Takto získanou barvu využijeme pro vyplnění plochy. Nejdříve vytvoříme štětec
voláním funkce CreateBrushIndirect, jehož parametrem
je ukazatel na strukturu LOGBRUSH:LOGBRUSH STRUCT
lbStyle DWORD ?
lbColor DWORD ?
lbHatch DWORD ?
LOGBRUSH ENDS
Parametr lbColor je barva a lbHatch vzorek na pozadí.
Další funkcí, kterou použijeme je SetBkColor určující barvu pozadí a SetTextColor pro barvu textu.4. CreateFont
Tato funkce vytváří logické písmo, tzn. že v rámci parametrů této funkce vytvoří modifikaci některého z fontů obsaženém ve Windows (adresář C:\WINDOWS\FONTS). Lze jí nastavit výšku, šířku, tloušťku, kurzívu, podtržení, přeškrtnutí, úhel (pod WinNT), atd. Lze použít také funkci CreateFontIndirect, která má místo 14 parametrů parametr jediný - adresu struktury LOGFONT. Následující výpis vytvoří písmo, které je vidět na obrázku. Posledním parametrem je adresa řetězce obsahujícího název fontu : "New Time Romance". Ostatní parametry viz. WIN32 Help.
invoke CreateFont, 40,10,0,0,0,0,0,0,EASTEUROPE_CHARSET,OUT_DEFAULT_PRECIS,
LIP_DEFAULT_PRECIS,PROOF_QUALITY,FF_DONTCARE,ADDR szFontName
invoke SelectObject, hdc, eax
Funkce vrací handle logického fontu, který pomocí funkce SelectObject přiřadíme
do kontextu zařízení. Zrušení provedeme voláním funkce DeleteObject.
Celý výpis obsluhy zprávy WM_PAINT vypadá potom následovně:
|
-
25. listopadu 2012
-
30. srpna 2002
-
10. října 2002
-
4. listopadu 2002
-
12. září 2002
-
25. listopadu 2012
-
28. července 1998
-
31. července 1998
-
28. srpna 1998
-
6. prosince 2000
-
27. prosince 2007
-
4. května 2007