LEKCJA 40: STRUKTURA PROGRAMU PROCEDURALNO - ZDARZENIOWEGO PRZEZNACZONEGO DLA WINDOWS. ________________________________________________________________ W trakcie tej lekcji poznasz og�ln� budow� interfejsu API Windows i dowiesz si�, co z tego wynika dla nas - autor�w program�w przeznaczonych dla Windows. ________________________________________________________________ W przeciwie�stwie do d�ugich liniowych program�w przeznaczonych dla DOS, w naszych programach dla Windows b�dziemy pisa� co� na kszta�t kr�tkich odcink�w programu i przekazywa� sterowanie Windows. Jest to bardzo wa�na cecha - kod programu jest zwykle silnie zwi�zany z Windows w taki spos�b, �e u�ytkownik mo�e w du�ym stopniu decydowa� o sposobie (kolejno�ci) wykonywania programu. Praktycznie robi to poprzez wyb�r opcji-klawiszy w dowolnej kolejno�ci. Przy takiej filozofii w dowolnym momencie powinni�my mie� mo�liwo�� prze��czenia si� do innego programu (innego okna) i nasz program powinien (bez zauwa�alnej zw�oki) przekaza� sterowanie, nie zagarniaj�c i nie marnuj�c czasu CPU. Z tego powodu kod programu powinien by� bardzo "zmodularyzowany". Ka�da sekcja kodu powinna by� odseparowana i ka�da, po wykonaniu powinna przekazywa� sterowanie do Windows. NOTACJA W�GIERSKA I NOWE TYPY DANYCH. Tworzenie zdarzeniowych program�w dla Windows wymaga kilku wst�pnych uwag na temat nowych typ�w danych. Okienkowe typy s� definiowane w plikach nag��wkowych (WINDOWS.H, WINDOWSX.H, OWL.H itp) i maj� posta� najcz�ciej struktury, b�d� klasy. Typowe sposoby deklaracji w programach okienkowych s� nast�puj�ce: HWND hWnd - WiNDow Handle - identyfikator okna HWND hWnd - typ (predefiniowany), hWnd - zmienna HINSTANCE hInstance - Instance Handle - identyfikator danego wyst�pienia (uruchomienia) programu PAINTSTRUCT - struktura graficzna typu PAINTSTRUCT ps - nasza robocza struktura (zmienna) WNDCLASS - struktura (a nie klasa wbrew myl�cej nazwie) POINT - struktura (wsp�rz�dne punktu - piksela na ekranie) RECT - struktura (wsp�rz�dne prostok�ta) BOOL - typ signed int wykorzystywany jako flaga (TRUE/FALSE) WORD - unsigned int DWORD - unsigned long int LONG - long int HANDLE, HWND, HINSTANCE - unsigned int (jako nr - identyfikator) UINT - j. w. - unsigned int. W programach okienkowych stosuje si� wiele predefiniowanych sta�ych, kt�rych znaczenie sugeruje przedrostek i nazwa, np: WM_CREATE - Windows Message: Create! - Komunikat Windows: Utworzy�! (np. okno) WS_VISIBLE - Window Style: Visible - Styl Okna: Widoczne ID_... - IDentifier - IDentyfikator MB_... - Message Box - elementy okienka komunikat�w W �rodowisku Windows stosuje si� specjaln� notacj� nazwan� od narodowo�ci swojego wynalazcy Karoja Szimoni - notacj� w�giersk�. Sens notacji w�gierskiej polega na dodaniu do nazwy zmiennej okre�lonych liter jako przedrostka (prefix). Litery-przedrostki stosowane w notacji w�gierskiej zebrano w Tabeli poni�ej. Pomi�dzy nazewnictwem Microsofta a Borlanda istniej� wprawdzie drobne rozbie�no�ci, ale og�lne zasady mo�na odnie�� zar�wno do BORLAND C++ 3+...4+, jak i Microsoft C++ 6...7, czy Visual C++. Notacja w�gierska ________________________________________________________________ Prefix Skr�t ang. Znaczenie ________________________________________________________________ a array tablica b bool zmienna logiczna (0 lub 1) by unsigned char znak (bajt) c char znak cb count of bytes liczba bajt�w cr color reference value okre�lenie koloru cx, cy short (count x, y len.) x-ilo��, y-d�ugo�� (short) dw unsigned long liczba d�uga bez znaku double word podw�jne s�owo fn function funkcja pfn pointer to function wsk. do funkcji h handle "uchwyt" - identyfikator i integer ca�kowity id identifier identyfikator n short or int kr�tki lub ca�kowity np near pointer wska�nik bliski p pointer wska�nik l long d�ugi lp long pointer wska�nik typu long int lpfn l. p. to function daleki wska�n. do funkcji s string �a�cuch znak�w sz string terminated '\0' �a�cuch ASCIIZ tm text metric miara tekstowa w unsigned int (word) s�owo x,y short x,y coordinate wsp�rz�dne x,y (typ: short) ________________________________________________________________ O PROGRAMOWANIU PROCEDURALNO - ZDARZENIOWYM DLA WINDOWS. W proceduralno-sekwencyjnych programach DOS'owskich sterowanie jest przekazywane mniej lub bardziej kolejno kolejnym instrukcjom w taki spos�b, jak �yczy� sobie tego programista. W Windows program-aplikacja prezentuje u�ytkownikowi wszystkie dost�pne opcje w formie widocznych na ekranie obiekt�w (visual objects) do wyboru przez u�ytkownika. Program funkcjonuje zatem wed�ug zupe�nie innej koncepcji nazywanej "programowaniem zdarzeniowym" (ang. event-driven programming). Mo�na powiedzie�, �e za przebieg wykonania programu nie jest odpowiedzialny tylko programista lecz cz�� tej odpowiedzialno�ci przejmuje u�ytkownik i to on decyduje w jaki spos�b przebiega wykonanie programu. U�ytkownik mo�e wybra� w dowolnym momencie dowoln� spo�r�d wszystkich oferowanych mu opcji a program powinien zawsze zareagowa� poprawnie i r�wnie szybko. Jest oczywiste, �e pisz�c program nie mo�emy przewidzie� w jakiej kolejno�ci u�ytkownik b�dzie wybiera� opcje/rozkazy z menu. Przeciwnie powini�my napisa� program w taki spos�b by dla ka�dego rozkazu istnia� oddzielny kod. Jest to og�lna koncepcja, na kt�rej opiera si� programowanie zdarzeniowe. W przeciwie�stwie do program�w proceduralno - sekwencyjnych, kt�re nale�y czyta� od pocz�tku do ko�ca, programy dla Windows musz� zosta� poci�te na na mniejsze fragmenty - sekcje - na zasadzie jedna sekcja - obs�uga jednego zdarzenia. Je�li zechcesz wy�wietli� napis "Hello, World", sekcja zdarzeniowego programu obs�uguj�ca takie zdarzenie mo�e wygl�da� np. tak: Funkcja_Obs�ugi_Komunikat�w_o_Zdarzeniach(komunikat) { switch (komunikat_od_Windows) { case WM_CREATE: ... TextOut(0, 0, "Napis: np. Hello world.", dlugosc_tekstu); break; ... case WM_CLOSE: // CLOSE - zamkn�� okno .... break; ..................... itd. } a w przypadku obiektowego stylu programowania - metoda obs�uguj�ca to zdarzenie (nale��ca np. do obiektu Obiekt_G��wne_Okno - TMainWindow) mo�e wygl�da� np. tak: void TMainWindow::RysujOkno() { TString Obiekt_napis = "Hello, World"; int dlugosc_tekstu = sizeof(Obiekt_napis); TextOut(DC, 10, 10, Obiekt-napis, dlugosc_tekstu); } Taki fragment kodu programu jest specjalnie przeznaczony do obs�ugi jednego zdarzenia (ewent-ualno�ci). W okienku wykonuje si� operacja PAINT (maluj). "Malowanie" okna mo�e si� odbywa� albo po raz pierwszy, albo na skutek przesuni�cia. Programy zdarzeniowe tworzone w C++ dla Windows b�d� zbiorem podobnych "kawa�k�w" nast�puj�cych w tek�cie programu sekcja za sekcj�. Oto jak dzia�a program zdarzeniowy: kod programu, podzielony na sekcje obs�uguj�ce poszczeg�lne zdarzenia koncentruje si� wok� interfejsu. FUNKCJE WinMain() i WindowProc(). W programach pisanych w standardowym C dla Windows u�ywane s� dwie najwa�niejsze funkcje: WinMain() i WindowProc(). ________________________________________________________________ UWAGA: Funkcji WindowProc() mo�na nada� dowoln� nazw�, ale WinMain() musi si� zawsze nazywa� WinMain(). Jest to nazwa zastrze�ona podobnie jak main() dla aplikacji DOSowskich. ________________________________________________________________ Funkcja WinMain() powoduje utworzenie okna programu umo�liwiaj�c zdefiniowanie i zarejestrowanie struktury "okno" (struct WNDCLASS) a nast�pnie powoduje wy�wietlenie okna na ekranie. Od tego momentu zarz�dzanie przejmuje funkcja WindowProc(). W typowej proceduralno - zdarzeniowej aplikacji dla Windows to w�a�nie funkcja WindowProc() obs�uguje pobieranie informacji od u�ytkownika (np. naci�ni�cie klawisza lub wyb�r z menu). Funkcja WindowProc() robi to dzi�ki otrzymywaniu tzw. komunikat�w (ang. Windows message). W Windows zawsze po wyst�pieniu jakiego� zdarzenia (event) nast�puje przes�anie komunikatu (message) o tym zdarzeniu do bie��cego aktywnego w danym momencie programu w celu poinformowania go, co si� sta�o. Je�li zosta� naci�ni�ty klawisz, komunikat o tym zdarzeniu zostanie przes�any do funkcji WindowProc(). Tak funkcjonuje interfejs pomi�dzy aplikacj� a Windows. W programach tworzonych w C prototyp funkcji WindowProc() wygl�da nast�puj�co: LONG FAR PASCAL WindowProc(HWND hWnd, WORD Message, WORD wParam, LONG lParam); S�owa FAR i PASCAL oznaczaj�, �e: FAR - kod funkcji znajduje si� w innym segmencie ni� kod programu; PASCAL - kolejno�� odk�adania argument�w na stos - odwrotna (jak w Pascalu). ________________________________________________________________ UWAGA: Prototyp funkcji mo�e zosta� podany r�wnie� tak: LONG FAR PASCAL WndProc(HWND, unsigned, WORD, LONG); ___________________________________________________________...
PabloPCK