LEKCJA 39: KORZYSTAMY ZE STANDARDOWYCH ZASOB�W Windows. ________________________________________________________________ W trakcie tej lekcji dowiesz si�, jak korzysta� z zasob�w Windows bez potrzeby wnikania w wiele szczeg�l�w technicznych interfejsu aplikacji - Windows API. ________________________________________________________________ Poniewa� nasze programy mog� korzysta� ze standardowych zasob�w Windows, na pocz�tku b�dziemy pos�ugiwa� si� okienkami standardowymi. Pocz�wszy od aplikacji WIN3.EXE "rozszerzymy ofert�" do dwu podstawowych typ�w: * Standardowe g��wne okno programu (Default main window). To takie w�a�nie okno, jakie dosta�y nasze pierwsze aplikacje WIN1.EXE. * Okienkiem dialogowym (Dialog box), a dok�adniej najprostszym rodzajem okienek dialogowych - tzw. okienkami komunikat�w - Message Box. Zastosowanie okienka dialogowego pozwoli nam na wprowadzenie do akcji klawiszy (buttons). ________________________________________________________________ UWAGA: Niestety nie wszystkie tradycyjne funkcje typu printf(), scanf(), gets() itp. zosta�y zaimplementowane dla Windows! Pisz�c w�asne programy mo�esz przekona� si� o tym dzi�ki opisowi funkcji w Help. Funkcj� nale�y odszuka� w Help | Index. Opr�cz przyk�adu zastosowania znajdziesz tam tabelk� typu: DOS Unix Windows ANSI C C++ Only cscanf Yes fscanf Yes Yes Yes Yes scanf Yes Yes Yes sscanf Yes Yes Yes Yes [Yes] oznacza "zaimplementowana". Dlatego w�a�nie w dalszych programach przyk�adowych dla wersji 3.0 nale�y np. stosowa� np. makro getchar() zamiast tradycyjnego getch() zaimplementowane dla Windows ju� w wersji BC++ 3.0. ________________________________________________________________ Dla przyk�adu spr�bujmy skompilowa� i uruchomi� w �rodowisku Windows jeden z wcze�niejszych program�w - tabliczk� mno�enia. Zwr�� uwag� na do��czony dodatkowy plik WINDOWS.H i nowy typ wska�nika. Zamiast zwyk�ego char *p ... LPSTR p ... LPSTR - to Long Pointer to STRing - daleki wska�nik do �a�cucha tekstowego. Jest to jeden z "ulubionych" typ�w Windows. /* WIN2.CPP: */ /* - Tablica dwuwymiarowa - Wskazniki do element�w tablicy */ #include <windows.h> #include <iostream.h> #include <stdio.h> int T[10][10], *pT, i, j, k; char spacja = ' '; LPSTR p1 = " TABLICZKA MNOZENIA (ineksy)\n"; LPSTR p2 = " Inicjujemy i INKREMENTUJEMY wskaznik:\n"; LPSTR p3 = "... nacisnij cokolwiek (koniec)..."; void main() { printf(p1); for (i = 0; i < 10; i++) { for (j = 0; j < 10; j++) { T[i][j] = (i + 1)*(j + 1); if (T[i][j] < 10) cout << T[i][j] << spacja << spacja; else cout << T[i][j] << spacja; } cout << '\n'; } printf(p2); pT = &T[0][0]; for (k = 0; k < 10*10; k++) { if (*(pT+k) < 10) cout << *(pT + k) << spacja << spacja; else cout << *(pT + k) << spacja; if ((k + 1)%10 == 0) cout << '\n'; } printf(p3); getchar(); } Wybrali�my dla aplikacji standardowe g��wne okno (Main Window), poniewa� istnieje potrzeba pionowego przewijania okna w celu przejrzenia pe�nego wydruku obu tablic. [???] Dlaczego ten tekst jest nier�wny??? ________________________________________________________________ Niestety, znaki w trybie graficznym Windows nie maj� sta�ej szeroko�ci (jak by�o to w trybie tekstowym DOS). Niekt�re aplikacje przeniesione ze �rodowiska DOS b�d� sprawia� k�opoty. ________________________________________________________________ APLIKACJE DWUPOZIOMOWE. Zastosujemy teraz najprostszy typ okienka dialogowego - okienko kamunikat�w (Message Box), nasze nast�pne aplikacje mog� by� ju� nie jedno- a dwupoziomowe. Typowe post�powanie okienkowych aplikacji bywa takie: * program wy�wietla w g��wnym oknie to, co ma do powiedzenia; * aby zadawa� pytania stosuje okienka dialogowe, b�d� okienka komunikat�w; * funkcja okienkowa (u nas MessageBox()) zwraca do programu decyzj� u�ytkownika; * program g��wny analizuje odpowied� i podejmuje w g��wnym oknie stosowne dzia�ania. Prze�led�my ewolucj� powstaj�cej w taki spos�b aplikacji. STADIUM 1. Tekst w g��wnym oknie. Zaczniemy tworzenie naszej aplikacji tak: /* WINR1.CPP: */ /* Stadium 1: Dwa okienka w jednym programie */ # include <stdio.h> # include <windows.h> char *p1 = "Teraz dziala \n funkcja \n MessageBox()"; char *p2 = "START"; int wynik; void main() { printf(" Start: Piszemy w glownym oknie \n"); printf(" ...nacisnij cosik..."); getchar(); MessageBox(0, p1, p2, 0); printf("\n\n\n Hello World dla WINDOWS!"); printf("\n\t...dowolny klawisz... "); getchar(); } Mogliby�my zrezygnowa� z metod typowych dla aplikacji DOSowskich i zatrzymania (i zapytania) makrem getchar() (odpowiednik getch() dla Windows). To dzia�anie mo�emy z powodzeniem powierzy� funkcji okienkowej MessageBox(). Funkcja MessageBox() pobiera cztery parametry: int Message Box(hwndParent, lpszText, lpszTitle, Style) HWND hwndParent - identyfikator macie�ystego okna (g��wnego okna aplikacji). Poniewa� nie wiemy p�ki co pod jakim numerem (identyfikatorem) Windows zarejestruj� nasz� aplikacj� - wpisujemy 0 LPCSTR lpszText - daleki wska�nik do �a�cucha tekstowego wewn�trz okienka. LPCSTR lpszTitle - daleki wska�nik do �a�cucha tekstowego - tytu�u okienka komunikatu. UINT Style - UINT = unsigned int; numer okre�laj�cy zawarto�� okienka. int Return Value - identyfikator klawisza, kt�ry wybra� u�ytkownik w okienku komunikatu. [!!!] UWAGA ________________________________________________________________ Deklaracje wska�nik�w do tekst�w powinny wygl�da� tak: LPCSTR p1 = "Napis1", p2 = "Tekst2"; ale C++ mo�e samodzielnie dokona� forsowania typ�w i zamieni� typ char* na typ LPCSTR (lub LPSTR). ________________________________________________________________ /* WINR2.CPP: */ /* Stadium 2: Dwa okienka ze zmienn� zawaro�ci� */ # include <windows.h> # include <stdio.h> char *p2, *p1 = "Dopisywanie:"; char napisy[4][20] = { "Borland ", "C++ ", "dla ", "Windows" }; void main() { printf("\n\n\n Hello World dla WINDOWS!"); printf("\n AUTOR: ..................."); for( int i = 0; i < 4; i++) { p2 = &napisy[i][0]; MessageBox(0, p2, p1, MB_OK); printf("\n %s", napisy[i]); } MessageBox(0, "I to juz \n wszystko...", "KONIEC", MB_OK); } W tym stadium stosujemy: - g��wne okno aplikacji - dwa okienka komunikat�w (Dopisywanie i KONIEC) - jeden klawisz - [OK] �a�cuchy tekstowe przeznaczone do pola tekstowego okienka pobierane s� z tablicy napisy[4][20] (cztery napisy po max. 20 znak�w) przy pomocy wska�nika p2. MB_OK to predefiniowana sta�a (Message Box OK - key identifier - identyfikator klawisza [OK] dla okienek komunikat�w). /* WINR3.CPP: */ /* Stadium 3: Dwa okienka steruj� p�tl� */ # include <windows.h> # include <stdio.h> char *p2, *p1 = "Dopisywanie:"; char napisy[4][20] = { "Borland ", "C++ ", "dla ", "Windows" }; void main() { printf("\n\n\n Hello World dla WINDOWS!"); printf("\n AUTOR: ..................."); for( int i = 0; i < 4; i++) { p2 = &napisy[i][0]; if( MessageBox(0, p2, p1, MB_ICONSTOP | MB_OKCANCEL) == IDOK) printf("\n %s", napisy[i]); else printf("\n ...?"); } MessageBox(0, "I to juz \n wszystko...", "KONIEC", MB_OK); } W tym stadium stosujemy: - g��wne okno aplikacji - dwa okienka komunikat�w (Dopisywanie i KONIEC) - dwa klawisze - [OK] i [Anuluj] (OK/Cancel) - jedn� ikon� [STOP] Zwr�� uwag�, �e tym razem sprawdzamy, kt�ry klawisz wybra� u�ytkownik w okienku. Odbywa si� to tak: if( MessageBox(0, p2, p1, MB_ICONSTOP | MB_OKCANCEL) == IDOK) IDOK jest predefiniowan� sta�� - kodem klawisza [OK] (ang. OK-key IDentifier - identyfikator klawisza OK). Identyfikatory r�nych zasob�w Windows s� liczbami ca�kowitymi. Je�li jeste� dociekliwy Czytelniku, mo�esz sprawdzi� - jaki numer ma klawisz [OK] rozbudowuj�c tekst aplikacji np. tak: int Numer; ... Numer = MessageBox(0, p2, p1, MB_ICONSTOP | MB_OKCANCEL); printf("\nKlawisz [OK] ma numer: %d", Numer); if(Numer == IDOK) ... Zwr�� uwag� na spos�b wykorzystania zasob�w w funkcji MessageBox(). Identyfikatory zasob�w, kt�re chcemy umie�ci� w okienku s� wpisywane jako ostatni czwarty argument funkcji i mog� by� sumowane przy pomocy znaku | (ang. ORing), np.: MessageBox(0,..,.., MB_ICONSTOP | MB_OKCANCEL); oznacza umieszczenie ikony STOP i klawiszy [OK] i [Anuluj]. Kod zwracany przez funkcj� mo�e by� wykorzystywany we wszelkich konstrukcjach warunkowych (switch, case, for, while, if-else, itp.). /* WINR4.CPP: */ /* Stadium 4: Okienka steruj� 2 p�tlami, przybywa zasob�w. */ # include <windows.h> # include <stdio.h> char *p2, *p1 = "Dopisywanie:"; char *p3 = "I to by bylo na tyle...\n Konczymy ???"; char *p4 = "UWA...
mikomil