lekcja40.txt

(21 KB) Pobierz
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);  
___________________________________________________________...
Zgłoś jeśli naruszono regulamin