7.6.2016 0 Comments

ASSEMBLER pod Windows: Zobrazenie okna (4. časť)

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

ASM WEB linky

To, že Assembler nepatrí do starého železa, dokazuje hneď niekoľko stránok autorov, ktorí spustili projekty vizuálneho prostredia pre vývoj win32 Assemblera. Napríklad projekt VASM veľmi pripomína vývojový nástroj typu RAD. Projekt je síce iba v začiatkoch, ale po dokončení by mohol výrazne zjednodušiť programovanie aplikácií v Assembleri pod Wndows. Na nasledujúcich adresách nájdete hneď niekoľko projektov, ktoré sa venujú tvorbe vizuálnych nástrojov.

§    TASMIDE – http://tasm.freeservers.com

§    NAGOA Visual Assembler – http://www.visual–assembler.pt.vu

§    VASM:Visual Assembler IDE – http://www.czar.com/vasm/

§    The Assembly Studio – http://asmstudio.cjb.net

§    Ultra Ide–asM – http://ideasm.cjb.net

§    Visual Assembler – http://visualasm.cjb.net

§    Visual Assembler Master – http://visualasembler.freeservers.com

V tejto časti seriálu budeme pokračovať v opise programu z predošlého čísla.

Keď sa vytvorí okno, Windows automaticky posiela správy do funkcie WndProc, ktorá sa nachádza v aplikácii. Väčšina týchto správ je odovzdaná do DefWindowProc. Funkcia WndProc by mala do DefWindowProc implicitne posielať správy, ktoré aplikácia nespracúva. To dovoľuje, aby Windows vykonal väčšinu ťažkej práce, a umožňuje to aplikácii, aby spracúvala iba tie správy, ktoré potrebuje. Keď funkcia CreateWindowEx vytvára hlavné okno aplikácie, do funkcie WndProc je poslaných päť správ (tab. 1). Funkcia WndProc normálne spracuje správu WM_CREATE, zatiaľ čo ostatné štyri správy odovzdá funkcii DefWindowProc. Správu WM_CREATE používa aplikácia pri inicializácii okna.

Správa

Význam

WM_GETMINMAXINFO

Získava veľkosť a umiestnenie okna, ktoré sa vytvára.

WM_NCCREATE

Správa WM_NCCREATE je poslaná pred správou WM_CREATE pred vytvorením prvého okna.

WM_NCCALCSIZE

Správa je poslaná, keď sa vypočíta veľkosť a pozícia klientskej oblasti okna. Pri spracovaní správy aplikácia preberie kontrolu nad obsahom klientskej oblasti okna, keď je zmenená veľkosť alebo pozícia okna.

WM_CREATE

Správa je poslaná, keď aplikácia požaduje vytvorenie okna a používa sa na inicializáciu.

WM_SHOWWINDOW

Správa je poslaná, keď existuje skryté alebo zobrazené okno.

Tab. 1 Správy generované funkciou CreateWindowEx

Windows generuje správy pre každú hardvérovú udalosť (napr. stlačenie klávesu, pohyb myši atď.). Tieto správy odovzdáva do frontu správ príslušného vlákna. Každé vlákno v systéme spracúva správy vo svojom vlastnom fronte správ. Ak je správa určená pre špecifické vlákno, je umiestnená do frontu správ tohto vlákna. Vlákno (thread) alebo proces vyťahujú správy z frontu správ pomocou slučky na spracovanie správ (message loop). Hlavná slučka na spracovanie správ aplikácie je na konci funkcie WinMain. Slučka na spracovanie správ má obyčajne nasledujúcu podobu:

.WHILE TRUE

                invoke GetMessage, ADDR msg,NULL,0,0

                .BREAK .IF (!eax)

                invoke TranslateMessage, ADDR msg

                invoke DispatchMessage, ADDR msg

.ENDW

Funkcia GetMessage vyberá správy z frontu správ. Po funkcii GetMessage nasledujú TranslateMessage a DispatchMessage. DispatchMessage posiela dáta správy do funkcie WndProc pre handle okna, ktorý je obsiahnutý v štruktúre správy. DispatchMessage vie, ktorá funkcia má správy dostať, pretože funkcia WndProc je asociovaná s dátami okna. Funkcia WndProc je implicitne tá, ktorá je definovaná v definícii triedy okna.

Front správ a slučka správ

Každý program pre Windows je založený na udalostiach a správach a obsahuje hlavnú slučku správ, ktorá nepretržite a opakovane zisťuje, či nedošla nejaká správa. Keď operačný systém Windows zistí používateľom spôsobenú udalosť, vygeneruje správu ako odpoveď a tú vloží do frontu správ, ktorá patrí spustenej aplikácii. Ak chce aplikácia zistiť, či bola používateľom vygenerovaná správa a o aký druh správy ide, môže to zistiť pomocou preskúmania všetkých správ, ktoré operačný systém vkladá do frontu správ. Aplikácia vo Windows API opakovane zisťuje stav frontu správ vykonávaním funkcií, ktoré obsahuje WinMain. Tieto funkcie sa vykonávajú v slučke nazývanej slučka správ. Prvou funkciou v slučke správ je obyčajne GetMessage. Vždy, keď slučka správ aplikácie volá GetMessage, vráti funkcia informácie o každej správe, ktorá by mohla čakať vo fronte správ aplikácie. Po tom, čo slučka správ aplikácie zavolá GetMessage, zvyčajne volá niekoľko ďalších funkcií, ktoré riadia dialógové okná, vstupy klávesnice a výstup. Nasleduje volanie funkcie DispatchMessage, ktorej hlavnou úlohou je volanie procedúry okna s názvom WndProc (obr. 1).

WndProc nie je procedúra Windows API – je to procedúra, ktorú musí zabezpečovať váš program. Aplikácia môže obsahovať viac ako jednu procedúru okna, pokiaľ aplikácia obsahuje viac okien, môže mať každé vlastnú procedúru okna. Keď zavolá funkcia DispatchMessage procedúru WndProc, oznámi WndProc, aký druh udalosti nastal. WndProc odpovie na udalosť volaním zasa ďalších funkcií zabezpečených spusteným programom. Táto funkcia sa nazýva rutina správy.

ShowWindow

Windows NT

Win 95

Win32s

Lib

Include

Áno

Áno

Áno

user32.lib

user32.inc

 

Funkcia ShowWindow sa zvyčajne používa po vytvorení okna (pozri CreateWindowEx) na jeho zviditeľnenie. Funkciu je možné využiť aj na minimalizovanie, resp. maximalizovanie okna. ShowWindow však nezabezpečí, že okno bude zobrazené na popredí.

Syntax: BOOL ShowWindow, HWND hwnd, nCmdShow

  hwnd HWND: Handle okna

nCmdShow Určuje, ako bude okno zobrazené. Môžete použiť hodnoty z tabuľky 2.

Výsledok funkcie: Ak bola funkcia ShowWindow úspešná (TRUE), okno bolo viditeľné, v opačnom prípade vráti hodnotu FALSE.

Správa: WM_SHOWWINDOW

 

Správa

Význam

SW_HIDE

Skryje okno a aktivuje iné.

SW_MINIMIZE

Minimalizuje špecifikované okno a aktivuje okno na najvyššej úrovni v systémovom zozname.

SW_MAXIMIZE

Maximalizuje špecifikované okno.

SW_RESTORE

Aktivuje a zobrazí okno. Pokiaľ je okno maximalizované alebo minimalizované, bude obnovené na svoju pôvodnú veľkosť a umiestnenie.

SW_SHOW

Aktivuje a zobrazí okno vo svojej aktuálnej veľkosti a pozícii.

SW_SHOWDEFAULT

Používa sa pri spustení aplikácie na nastavenie stavu zobrazenia podľa príznaku SW_ v štruktúre STARTUPINFO.

SW_SHOWMAXIMIZED

Aktivuje a zobrazí okno ako maximalizované.

SW_SHOWMINIMIZED

Aktivuje a zobrazí okno ako minimalizované.

SW_SHOWMINNOACTIVE

Zobrazí okno ako minimalizované a aktívne okno zostáva aktívnym.

SW_SHOWNA

Zobrazí okno vo svojom aktuálnom stave a aktívne okno zostáva aktívnym.

SW_SHOWNOACTIVATE

Zobrazí okno vo svojej poslednej veľkosti a pozícii. Aktívne okno zostáva aktívnym.

SW_SHOWNORMAL

Aktivuje  a zobrazí okno vo svojej normálnej veľkosti.

Tab. 2 Hodnoty funkcie ShowWindow

 

UpdateWindow

Windows NT

Win 95

Win32s

Lib

Include

Áno

Áno

Áno

user32.lib

user32.inc

Funkcia UpdateWindow spôsobí, že Windows pošle danému oknu správu WM_PAINT. Správa je poslaná priamo procedúre daného okna, teda obchádza front správ. Ak je oblasť určená na aktualizáciu prázdna, neposiela sa nijaká správa.

Syntax: BOOL UpdateWindow, HWND hwnd

hwnd HWND: Handle okna, ktoré sa bude aktualizovať.

Výsledok funkcie: Ak bola funkcia UpdateWindow úspešná, vráti sa TRUE, v opačnom prípade FALSE.

Správa: WM_PAINT

 

GetMessage

Windows NT

Win 95

Win32s

Lib

Include

Áno

Áno

Áno

user32.lib

user32.inc

 

Funkcia GetMessage načíta ďalšiu čakajúcu správu z frontu správ volajúceho vlákna do štruktúry MSG, na ktorú ukazuje msg. Správy pre ostatné vlákna alebo aplikácie sa nevyhľadávajú.

Syntax: BOOL GetMessage, MSG msg, HWND hwnd, UINT wMsgFilterMin, UINT wMsgFilterMax

msg MSG: Ukazovateľ na štruktúru MSG. Štruktúra MSG je definovaná takto:

 

Definícia štruktúry MSG

typedef struct tagMSG { //msg 

 

HWND hwnd;

identifikuje okno, ktorého window procedúra prijíma správy

UINT message;

špecifikuje číslo správy

WPARAM wParam;

špecifikuje dodatočné informácie o správe, presný význam závisí od hodnoty správy

LPARAM lParam;

špecifikuje dodatočné informácie o správe, presný význam závisí od hodnoty správy

DWORD time;

špecifikuje čas odoslania správy (v milisekundách od spustenia Windows)

POINT pt;

špecifikuje pozíciu kurzora v súradniciach obrazovky

} MSG;

 

 

hwnd HWND: Handle k oknu prijímajúcemu správy. Normálne sa nastavuje na hodnotu NULL, aby vyhľadával správy pre všetky okná, ktoré patria volajúcemu vláknu, a správy pre vlákna, posielané do volajúceho vlákna pomocou funkcie PostThreadMessage.

wMsgFilterMin UINT: Minimálna hodnota správy, ktorá sa má prijať. Normálne sa nastavuje na nulu.

wMsgFilterMax UINT: Maximálna hodnota správy, ktorá sa má prijať. V prípade, že sú wMsgFilterMin a wMsgFilterMax nastavené na nulu, budú načítané všetky správy. Normálne sa nastavuje na nulu.

Výsledok funkcie: Vracia TRUE, pokiaľ sa nezačne správa WM_QUIT, potom FALSE. Slučka na spracovanie správ by mala pokračovať, pokiaľ nie je z GetMessage vrátená hodnota FALSE, čo ukončí program.

 

TranslateMessage

Windows NT

Win 95

Win32s

Lib

Include

Áno

Áno

Áno

user32.lib

user32.inc

 

Vo chvíli, keď používateľ stlačí kláves (napríklad Enter), systém generuje správu virtuálneho klávesu (VK_RETURN). Funkcia TranslateMessage prekladá správy virtuálnych klávesov (tab. 5) na znakové správy. Teda keď sa prijme kód virtuálneho klávesu, funkcia TranslateMessage pošle do frontu správ aplikácie zodpovedajúci kód WM_CHAR.

Syntax: BOOL TranslateMessage, MSG msg

msg MSG: Ukazovateľ na štruktúru MSG, ktorá bola použitá s funkciou GetMessage alebo PeekMessage na vyhľadanie správy.

Výsledok funkcie: Vracia TRUE, ak bola správa preložená, v opačnom prípade je vrátená hodnota FALSE.

Správy: WM_CHAR, WM_SYSCHAR, WM_DEADCHAR, WM_SYSDEADCHAR

DispatchMessage

Windows NT

Win 95

Win32s

Lib

Include

Áno

Áno

Áno

user32.lib

user32.inc

 

DispatchMessage posiela správy zo slučky na spracovanie správ aplikácie príslušnej procedúre okna (obyčajne WndProc) na spracovanie.

Syntax: LONG DispatchMessage, MSG msg

msg MSG: Ukazovateľ na štruktúru MSG, ktorá obsahuje správu.

Výsledok funkcie: Vracia návratovú hodnotu pre spracúvanú správu. Táto hodnota sa zvyčajne  ignoruje.

 

DefWindowProc

Windows NT

Win 95

Win32s

Lib

Include

Áno

Áno

Áno

user32.lib

user32.inc

 

Aby bolo zabezpečené, že bude spracovaná každá správa, DefWindowProc poskytuje východiskové spracovanie správ pre správy, ktoré aplikácia nespracúva. Funkcia na východiskové spracovanie správ patrí medzi základné operácie aplikácie vo Windows.  

Syntax: LRESULT DefWindowProc, HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam

hWnd HWND: Identifikuje okno, ktorého window procedúra prijíma správy.

Msg UINT: Špecifikuje správu.

wParam WPARAM: Špecifikuje dodatočné informácie o správe, presný význam závisí od hodnoty správy.

lParam LPARAM: Špecifikuje dodatočné informácie o správe, presný význam závisí od hodnoty správy.

Výsledok funkcie: Návratová hodnota je výsledkom spracovania správy a závisí od správy.

 

WinMain

WinMain je volaná systémom, ako vstupný bod pre aplikácie založené na Win32.

Syntax: int WINAPI WinMain, HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow

hInstance HINSTANCE: Identifikuje aktuálnu inštanciu aplikácie.

hPrevInstance HINSTANCE: Identifikuje predchádzajúcu inštanciu aplikácie. Pre aplikácie založené na Win32 je tento parameter vždy NULL.

lpCmdLine LPSTR: Ukazovateľ na reťazec zakončený nulou, obsahujúci príkazový riadok, použitý na spustenie aplikácie.

nCmdShow int: Špecifikuje, ako má byť aplikácia na začiatku zobrazená. Tento parameter môže byť jedna z hodnôt v tabuľke 2.

Výsledok funkcie: Vracia kód pre aplikáciu, ktorý by mal byť hodnotou použitou s funkciou PostQuitMessage.

 

PostQuitMessage

Windows NT

Win 95

Win32s

Lib

Include

Áno

Áno

Áno

user32.lib

user32.inc

 

Funkcia PostQuitMessage posiela správu WM_QUIT, aby oznámila operačnému systému Windows, že vlákno požiadalo o ukončenie. PostQuitMessage sa používa na spracovanie správ WM_DESTROY a položiek menu, ktoré nútia aplikáciu, aby sa ukončila.

Syntax: PostQuitMessage,  int nExitCode

nExitCode int: špecifikuje kód na ukončenie aplikácie. Táto hodnota je použitá ako parameter wParam správy WM_QUIT.

Výsledok funkcie: Funkcia nevracia nijakú hodnotu.

Správy: WM_QUIT, WM_DESTROY

 

Nabudúce ...

Nasledujúca časť bude venovaná výpisu textu do klientskej oblasti okna, dozviete sa aj základné informácie o kontexte zariadenia DC.

Slovník skratiek

HANDLE – 32–bitové číslo identifikujúce daný objekt, napr. okno.

RAD (Rapid Application Development) – rýchly vývoj aplikácií – používa sa v súvislosti s vizuálnymi nástrojmi (Delphi, C++Builder a pod.) na tvorbu aplikácií.

VLÁKNO (Thread) – Vlákno je objektom systému Win32, v ktorom beží programový kód (strojový kód). Pri každom vytvorení nového procesu (teda pri zavedení každej novej aplikácie) sa vytvorí vlákno, z ktorého sa spustí beh vlastného kódu programu. Takéto vlákno sa nazýva primárne vlákno. Každé vlákno môže potom pre jeden a ten istý proces vytvoriť jedno alebo viacej ďalších vlákien, pričom všetky tieto vlákna využívajú jeden a ten istý, spoločný virtuálny adresný priestor.

 

                                                                                                                        

 

 


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á