Resources, okna a zprávy Andrea Číková Martin Osovský Agenda ● struktura PE souboru a resources ● programová práce s resources ● USER a GDI objekty ● okna ● zprávy, vlákna a okna Resources ● data, která je možno uložit do spustitelného souboru (PE) ● jakákoliv binární data nebo řetězce ● LoadResource, FindResource, LockResource ● pro některé existují jednodušší API funkce ● ikony, kurzory a bitmapy (e.g. LoadIcon) ● menu a dialogy (DialogBox) ● řetězce (LoadString) Vytváření resources ● rc soubor ● každý má záznam v textové podobě ● může být strukturovaný ● může obsahovat odkaz na soubor ● pomocí rc.exe zkompilujeme do res souboru ● ten přilinkujeme do spustitelného souboru (link.exe) ● soubory a jiné resources jsou pak ve sp. souboru ve zvláštní sekci (ResourceDirectory) Okna a kreslení ● většina kódu je v jádře (win32k.sys) ● okna, zprávy, vstup z klávesnice a myši, GDI ● z hlediska aplikace se o to stará Windows Subsystem, komunikace pomocí fast LPC ● konzolová okna jsou úplně v user space (csrss.exe) 6 Základní komponenty systému OS/2 Windows POSIX Environment Subsystems User Application Subsystem DLL Windows User/GDI Device Driver Executive Device Drivers Kernel Hardware Abstraction Layer (HAL) User Mode Kernel Mode System & Service Processes Windows 7 Okna ● patří mezi tzv. user objekty (User32.dll) ● mají handle jako cokoliv jiného ● každá komponenta je okno (i tlačítko) ● operace s nimi se provádějí pomocí zpráv ● k oknu je přiřazena funkce, které systém posílá zprávy ● společné vlastnosti skupiny oken jsou shrnuty ve struktuře třídy okna (WindowClassEx) 8 Třídy oken ● definují základní vlastnosti pro vzhled a chování okna, zejména ● styl třídy (jak se chová při překreslování) ● menu ● ikony a kurzor ● procedura pro zpracování zpráv ● globální, lokální a systémové ● systémové např. button nebo combobox 9 Vytvoření okna ● okno musí mít třídu (systémovou nebo registrovanou pomocí RegisterClass) ● konkrétní okno se vytvoří pomocí CreateWindow, kde se nastaví ● styl okna (má-li posuvníky, jaké má okraje ap.) ● titulek ● velikost ● konstanta pro menu 10 Překreslování ● když je okno vytvořeno, systém je může zobrazit a následně překreslovat ● také přijímá zprávy a reaguje na ně ● WM_PAINT – reakce na požadavek překreslení okna (UpdateWindow), invalidní regiony (překrytí okna jiným a objevením, menu, kurzor) ● WM_COMMAND – reakce na uživatelský požadavek prostřednictvím komponenty ● ... 11 Vlákna a zprávy ● zprávy se posílají vláknům, mohou být určeny pro nějaké okno ● zprávy lze posílat ručně (PostMessage, SendMessage) ● nebo je posílá systém (vždy z nějakého vlákna) ● zprávy myši a klávesnice ● inicializační a ukončovací zprávy ● zpráva o překreslení 12 Struktura zprávy (MSG) ● HWND – okno kterému je určena (i NULL) ● čas a souřadnice ● identifikátor zprávy (UINT) ● lParam a wParam – dva 32 bitové parametry, význam závisí na konkrétní zprávě 13 Příklad - WM_COMMAND ● identifikátor je hex 111 ● lParam – handle okna komponenty ● LOWORD(wParam) – identifikátor komponenty ● HIWORD(wParam) – control code (co se vlastně stalo) 14 Funkce na zpracování zpráv ● GetMessage a PeekMessage ● TranlateMessage ● DispatchMessage ● WindowProc ● parametry okno, zpráva, lParam, wParam ● uvnitř switch na typ zprávy ● vrací 0 je-li vše v pořádku ● message crackers a makra (jinak je to kruté) 15 Vlákno a zprávy 16 Vlákno a zprávy 17 Vstup z hardwaru