LEKCJA39.TXT

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