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...
ZAZZY