LEKCJA42.TXT

(16 KB) Pobierz
LEKCJA 42: KOMPILATORY "SPECJALNIE DLA Windows". 
________________________________________________________________ 
Z tej lekcji dowiesz si�, czym r�ni� si� kompilatory  
przeznaczone dla pracy w �rodowisku Windows.  
________________________________________________________________ 
 
W IDE i w sposobie zachowania zasz�y istotne zmiany. Pos�uguj�c  
si� Turbo C++ z pakietu BORLAND C++ 3.0 lub BCW z pakietu 3.1  
mo�emy korzysta� z urok�w i us�ug Windows szerzej ni� do tej  
pory. Mo�emy otwiera� wiele okien i uruchamia� bezpo�rednio z  
poziomu IDE okienkowe aplikacje. W g��wnym menu kompilatora  
zasz�y pewne zmiany (sygnalizuj�ce obiektowo- i okienkowo -  
zorientowan� ewolucj� pakiet�w Borlanda), na kt�re warto zwr�ci� 
uwag�.  
 
Znikn�o menu Debug (co wcale nie oznacza, �e nie mo�emy  
korzysta� z Debuggera), pojawi�o si� natomiast nowe menu Browse  
(przegl�danie). Rozkazy, kt�rych tradycyjnie szukali�my w menu  
Debug zosta�y rozrzucone do innych menu. I tak:  
 
Menu Compile zawiera:  
 
Compile           (kompilacja do *.OBJ),  
Make              (kompilacja i konsolidacja do *.EXE),  
Link              (konsolidacja bez powt�rnej kompilacji),  
Build all         (konsolidacja wszystkich modu��w),  
Information...    (informacja o przebiegu kompilacji),  
Remove messages   (usuwanie komunikat�w z pliku wynikowego)  
 
Menu Run zawiera:  
 
Run               (uruchomienie i ewentualna rekompilcja),  
Arguments...      (argumenty uruchomieniowe z wiersza rozkazu),  
Debugger          (zamiast w Debug - TU!)  
Debugger arguments...  (argumenty dla Debuggera)  
 
Menu Project zawiera:  
 
Open project       - otw�rz (nowy lub istniej�cy) plik projektu, 
 
Close project      - zamknij projekt,  
Add item...        - dodaj element (plik) do projektu,  
Delete item        - usu� element (plik) z projektu,  
Include ��files...  ��- ��podaj �katalog �zawieraj�cy �dodatkowe 
 
                    do��czane do programu pliki nag��wkowe *.H  
 
W menu Options (zestaw znany ju� z Borland C++) warto zwr�ci�  
uwag� na pewn� dodatkow� mo�liwo��. Jak wiemy z do�wiadczenia,  
uruchamiaj�c program cz�sto dokonujemy zmian i korekt w pliku  
�r�d�owym *.C, czy *.CPP. Znacznie rzadziej jednak zmieniamy  
zestaw do��czanych do programu plik�w nag��wkowych *.H. Wiemy  
r�wnie�, �e kompilacja tych w�a�nie plik�w nag��wkowych zajmuje  
cz�sto lwi� cz�� czasu ca�ej kompilacji i konsolidacji  
programu. Borland zauwa�y� to i w okienku dialogowym:  
 
Options | Compiler | Code generation --> Code Generation Options 
 
 
umie�ci� opcj� Pre-compiled headers (pliki nag��wkowe wst�pnie  
skompilowane wcze�niej - i tylko jeden raz). Szczeg�lnie w  
przypadku aplikacji okienkowych mo�e to znacznie przyspieszy�  
proces uruchamiania i "szlifowania" naszych program�w. Nie ma  
jednak nic za darmo. Borland/Turbo C++ po skompilowaniu plik�w  
nag��wkowych tworzy na dysku roboczy plik *.SYM nadaj�c mu nazw� 
 
zgodn� z nazw� bie��cego projektu (jest to zwykle nazwa g��wnego 
 
modu�u *.CPP) i do poprawnego dzia�ania wymaga kilkadziesi�t lub 
 
nawet kilkaset kilobajt�w dodatkowej przestrzeni na dysku.  
 
[!!!]UWAGA  
________________________________________________________________ 
 
Je�li przenosisz projekt na dyskietk� i tam kontynuujesz prac�  
nad projektem, pami�taj, �e mo�e zabrakn�� miejsca na  
prekompilowany plik .SYM.  
________________________________________________________________ 
 
 
Czytelnik zechce sam sprawdzi� w jakim stopniu przyspieszy to  
kompilacj� naszego w�asnego programu proceduralno -  
zdarzeniowego WINPZ1.CPP:  
 
WINZ1.CPP. Jednomodu�owa aplikacja proceduralno - zdarzeniowa  
dla Windows. 
________________________________________________________________ 
#include <windows.h>  
#pragma argused  
 
long FAR PASCAL WndProc (HWND, unsigned, WORD, LONG) ;  
  
int PASCAL WinMain(HANDLE hInstance, HANDLE hPrevInstance,  
   LPSTR lpszCmdLine, int nCmdShow )  
{  
  WNDCLASS Okno1;  
  MSG komunikaty;  
  HWND NrOkna;  
  LPSTR     LongPtr1 = "Okno 1";  
  LPSTR     lp2      = "AM: BC++ 3..4/Reczne sterowanie (1)";  
  
    if (hPrevInstance == 0)  
    {  
Okno1.style= CS_HREDRAW | CS_VREDRAW ;  
Okno1.lpfnWndProc= WndProc;  
Okno1.cbClsExtra = 0;  
Okno1.cbWndExtra= 0;  
Okno1.hInstance = hInstance;  
Okno1.hCursor        = LoadCursor(0, IDC_CROSS );  
Okno1.hbrBackground= GetStockObject(WHITE_BRUSH );  
Okno1.lpszMenuName= 0;  
Okno1.lpszClassName= LongPtr1;  
  
    if (!RegisterClass(&Okno1))  
return 0;  
    }  
  
    NrOkna = CreateWindow(LongPtr1, lp2,  WS_VISIBLE |  
                              WS_SYSMENU | 
                WS_MINIMIZEBOX | WS_VSCROLL | WS_MAXIMIZEBOX,  
                CW_USEDEFAULT, 0, CW_USEDEFAULT, 0,  
                0, 0, hInstance, 0);  
  
    ShowWindow(NrOkna, nCmdShow);  
    UpdateWindow(NrOkna);  
  
    while (GetMessage(&komunikaty, 0, 0, 0))  
    {  
TranslateMessage(&komunikaty );  
DispatchMessage(&komunikaty );  
    }  
    return 0;  
}  
  
long FAR PASCAL WndProc (HWND NrOkna, unsigned KomunikatWindows, 
 
 WORD wParam, LONG lParam)  
{  
HDC          NrKontekstu;  
PAINTSTRUCT  struktura_graficzna;  
RECT         prostokat;  
  
    switch(KomunikatWindows)  
    {  
      case WM_PAINT:  
   {  
    NrKontekstu = BeginPaint(NrOkna, &struktura_graficzna);  
    GetClientRect(NrOkna, &prostokat);  
    TextOut(NrKontekstu,80,50,  ": Reczne sterowanie:", 20 );  
    TextOut(NrKontekstu, 5,70,  "Tu -->", 6);  
    TextOut(NrKontekstu, 5, 85, "Blad:", 5);  
    TextOut(NrKontekstu,75,70,  "-----------------------------", 
 
40);  
    TextOut(NrKontekstu,30,110, "Programowanie proceduralno -  
zdarzeniowe.", 41 );  
    TextOut(NrKontekstu,30,135, "Szablon moze zostac rozbudowany 
 
o inne funkcje.", 47 );  
    TextOut(NrKontekstu,30,180, "RECZNIE panujemy np. nad:", 25  
);  
    TextOut(NrKontekstu,20,220, "paskiem tytulowym okna, tytulem 
 
ikonki...", 41);  
    TextOut(NrKontekstu, 100, 250, "!KONIEC - [Alt]+[F4]", 20);  
  
    EndPaint(NrOkna,&struktura_graficzna);  
    break;  
    }  
      case WM_DESTROY:  
    {  
    PostQuitMessage(0);  
    break;  
    }  
      default:  
    return DefWindowProc(NrOkna,KomunikatWindows,wParam,lParam); 
 
    }  
    return 0;  
}  
 
Program demonstruje opisane wy�ej mechanizmy, mo�e by�  
uruchamiany wielokrotnie i sprowadzony do ikony. Z uwagi na brak 
 
zdefiniowanych dodatkowych zasob�w (brak w projekcie plik�w:  
.RC - resources - zasoby  
.ICO - ikona  
.DEF - definicji  
.PRJ lub .IDE - projektu  
.DSK - konfiguracyjnego  
itp.)  
 
podczas kompilacji programu wyst�pi� dwa komunikaty  
ostrzegawcze. Komunikaty te mo�na zignorowa�.  
 
A oto druga przyk�adowa aplikacja w tym samym stylu. Tym razem  
funkcja okienkowa reaguje na naci�ni�cie lewego klawisza myszki, 
 
co powoduje wygenerowanie komunikatu WM_LEFTBUTTONDOWN.  
 
Program WINZ-2.CPP  
________________________________________________________________ 
#include <windows.h>  
#include <string.h>  
#pragma argused  
 
char napis[10];  
int X, Y;  
  
LONG FAR PASCAL WndProc (HWND, WORD, WORD, LONG);  
  
int PASCAL WinMain(HANDLE hInstance, HANDLE hPrevInstance,  
   LPSTR lpszCmdLine, int nCmdShow )  
{  
    WNDCLASSwndClass;  
    MSGmsg;  
    HWNDhWnd;  
    LPSTR       Lp1 = "Mysza1";  
    LPSTR       lp2 = "WINPZ2: Wykrywanie Lewego Klawisza  
Myszki";  
  
    if (!hPrevInstance)  
    {  
wndClass.style= CS_HREDRAW | CS_VREDRAW ;  
wndClass.lpfnWndProc= WndProc;  
wndClass.cbClsExtra = 0;  
wndClass.cbWndExtra= 0;  
wndClass.hInstance = hInstance;  
wndClass.hIcon = 0;  
wndClass.hCursor= LoadCursor(0, IDC_ARROW );  
wndClass.hbrBackground= GetStockObject(WHITE_BRUSH );  
wndClass.lpszMenuName= 0;  
wndClass.lpszClassName= Lp1;  
  
    if (!RegisterClass(&wndClass))  
exit(1);  
    }  
  
hWnd = CreateWindow(Lp1, lp2, WS_OVERLAPPEDWINDOW,  
CW_USEDEFAULT, 0, CW_USEDEFAULT, 0,  
0, 0, hInstance, 0);  
  
    ShowWindow(hWnd, nCmdShow);  
    UpdateWindow(hWnd);  
  
    while (GetMessage(&msg, 0, 0, 0))  
    {  
TranslateMessage(&msg );  
DispatchMessage(&msg );  
    }  
    return 0;  
}  
  
LONG FAR PASCAL WndProc (HWND hWnd, WORD Message,  
 WORD wParam, LONG lParam)  
{  
HDC hDC;  
PAINTSTRUCT ps;  
RECT rect;  
    switch(Message)  
    {  
case WM_SIZE:  
    hDC = GetDC( hWnd );  
    TextOut(hDC, 50, 100, "Wykrywanie nacisniecia", 22);  
    TextOut(hDC, 50, 120, "lewego klawisza myszki.", 23);  
    TextOut(hDC, 20, 140, "Komunikat o zdarzeniu: ", 22);  
    TextOut(hDC, 20, 156, "Left Button Down - LBUTTONDOWN", 31); 
 
    TextOut(hDC, 50, 170, "Po wcisnieciu klawisza,", 23);  
    TextOut(hDC, 50, 190,"w biezacej pozycji kursora, pojawi sie 
 
napis <-- Tu!.", 52);  
    ReleaseDC(hWnd, hDC);  
    break;  
  
case WM_PAINT:  
    hDC = BeginPaint(hWnd, &ps);  
    TextOut(hDC, X,Y, napis, strlen(napis));  
    EndPaint(hWnd, &ps);  
    break;  
  
case WM_LBUTTONDOWN:  
    strcpy(napis,"<-- Tu !");  
    X = LOWORD(lParam);  
    Y = HIWORD(lParam);  
    InvalidateRect(hWnd, 0, TRUE);  
    UpdateWindow(hWnd);  
    break;  
  
case WM_DESTROY:  
    PostQuitMessage(0);  break;  
  
default:  
return DefWindowProc(hWnd, Message, wParam, lParam);  
    }  
    return 0;  
}  
 
Plik nag��wkowy STRING.H pojawia si� ze wzgl�du na obecno��  
funkcji strlen() wyznaczaj�cej d�ugo�� napisu. Zmienne X i Y to  
bie��ce (wzgl�dne) wsp�rz�dne kursora myszki w momencie  
naci�ni�cia klawisza. Program demonstruje nast�puj�ce efekty:  
 
    X = LOWORD(lParam);  
 
- przekazanie wsp�rz�dnej X przy pomocy parametru lParam  
(LOWORD to L...
Zgłoś jeśli naruszono regulamin