You are on page 1of 23

IDZ DO

PRZYKADOWY ROZDZIA
SPIS TRECI

KATALOG KSIEK
KATALOG ONLINE
ZAMW DRUKOWANY KATALOG

TWJ KOSZYK
DODAJ DO KOSZYKA

CENNIK I INFORMACJE
ZAMW INFORMACJE
O NOWOCIACH
ZAMW CENNIK

CZYTELNIA
FRAGMENTY KSIEK ONLINE

Wydawnictwo Helion
ul. Chopina 6
44-100 Gliwice
tel. (32)230-98-63
e-mail: helion@helion.pl

ABC programowania
w C++
Autor: Jan Rusek
ISBN: 83-7197-558-9
Format: B5, stron: okoo 200

Cz pierwsza ksiki jest rodzajem samouczka programowania. Prezentuje elementy


jzyka C oraz oparte na klasach, dziedziczeniu i polimorfizmie rozszerzenia obiektowe
waciwe dla C++. Takie konstrukcje jzyka jak ptle, acuchy znakowe, tablice,
funkcje czy konstruktory klas przedstawiono na moliwie krtkich przykadach.
Dla kadego z nich podano kod rdowy, opis dziaania, wydruk i zrzut ekranu
z wynikami. Szczegln uwag zwrcono na wyrobienie u Czytelnika sprawnoci
w posugiwaniu si wskanikami do acuchw, tablic i funkcji. Omwiono
przydzielanie i zwalnianie pamici na stercie przy uyciu operatorw new i delete.
Uwzgldniono tworzenie przemieszczalnych okienek w trybie tekstowym oraz grafiki
punktowej przy wykorzystaniu funkcji oferowanych przez interfejs BGI.
W czci drugiej podano kody rdowe i opisy bardziej zaawansowanych programw.
Sze z nich pracuje w trybie tekstowym a cztery w trybie graficznym. Przykadowo,
program Piano symuluje organy a program Mousebox wywietla sterowane mysz
przemieszczalne listy wyboru. W programie City na uwag zasuguje funkcja takeStr
umoliwiajca wpis, przewijanie i modyfikacje acucha znakowego duszego ni
widoczne na ekranie okienko wpisowe. Program Zegar prezentuje dwa przesuwalne
strzakami zegary, z moliwoci wczania i wyczania melodii. Program Drawthru
pokazuje uycie myszy do narysowania kilku krzywych wykresu, a nastpnie do
wskazania mysz jednej z nich. W sumie, lektura obydwu czci ksiki winna
przybliy Czytelnikowi zasady tworzenia programw tak tekstowych jak i graficznych.

Cz I

Wprowadzenie do jzyka C++..........................................7

Rozdzia 1.

Wprowadzenie..................................................................................9

Rozdzia 2.

Kompilator Borland C++ .................................................................11

Rozdzia 3.

Kompilator Microsoft Visual C++ ....................................................15

Rozdzia 4.

Podstawowe elementy programu ....................................................19


Funkcja gwna main........................................................................................ 19
Funkcje i zbiory nagwkowe........................................................................... 23
Wskanik do acucha znakw......................................................................... 25
Strumie wyjcia cout....................................................................................... 28

Rozdzia 5.

Wydruk na ekran............................................................................31
Funkcja clrscr w rodowisku Borland C++ ...................................................... 31
Zmienne predefiniowane .................................................................................. 33
Kolor wydruku .................................................................................................. 36
Formatowanie wydruku .................................................................................... 39
Formatowany wpis do acucha ....................................................................... 42
Odczyt z pliku ................................................................................................... 45

Rozdzia 6.

Funkcje .........................................................................................49
Przekaz parametrw przez referencj ............................................................... 49
Odczyt z klawiatury .......................................................................................... 51
Zwrot wskanika przez funkcj ........................................................................ 55
Wskanik do funkcji ......................................................................................... 57
Tablica wskanikw do funkcji ........................................................................ 59
Tablice wielowymiarowe typw int ................................................................. 61
Tablice wielowymiarowe typw char............................................................... 63
Wskanik do wskanika.................................................................................... 65
Wskanik do funkcji na licie argumentw...................................................... 68
Argument domniemany .................................................................................... 70
Instrukcja continue............................................................................................ 72
Przeadowanie funkcji....................................................................................... 73

C:\Andrzej\PDF\ABC programowania w C++\!spis tresci.doc

ABC programowania w C++

Rozdzia 7.

Klasy i struktury.............................................................................77
Konstruktor ....................................................................................................... 77
Konstruktor domniemany ................................................................................. 80
Operatory new i delete...................................................................................... 83
Konstruktor w roli konwertera.......................................................................... 85
Kopiowanie gbokie ........................................................................................ 89
Przeadowanie operatorw................................................................................ 92
Lista inicjalizatorw ......................................................................................... 96
Tablice obiektw definiowanych...................................................................... 98
Dziedziczenie.................................................................................................. 100
Dziedziczenie dwch klas............................................................................... 102
Funkcja wirtualna ........................................................................................... 103
Typ enum i instrukcja typedef ........................................................................ 106
Wskanik this.................................................................................................. 109

Rozdzia 8.

Grafika tekstowa .........................................................................113


Wskazanie pola wyboru kursorem.................................................................. 113
Wskazanie pola wyboru tabulatorem.............................................................. 116
Wskazanie pola wyboru mysz....................................................................... 121
Pozycjonowanie pola prostoktnego za pomoc myszy................................. 125

Rozdzia 9.

Grafika punktowa.........................................................................131
Okno lokalne................................................................................................... 131
Pozycjonowanie obiektu za pomoc myszy ................................................... 137
Kopiowanie wycinkw obrazu do pamici..................................................... 143

Rozdzia 10. Argumenty wywoania programu i zmienne rodowiskowe ..............151


Rozdzia 11. Kompilacja programu zoonego z kilku plikw ..............................155

Cz II

Przykady ...................................................................159

Rozdzia 12. Program FACT.cpp obliczajcy silni N = n!...................................161


Rozdzia 13. Program COSI.cpp obliczajcy warto cos(x)...............................165
Rozdzia 14. Program CITY.cpp do wpisu par miast i ich odlegoci ...................173
Rozdzia 15. Program PIANO.cpp do symulacji organw ....................................187
Rozdzia 16. Program ZEGAR.cpp do symulacji 2 zegarw ................................195
Rozdzia 17. Program DYNATREE.cpp do tworzenia
binarnego drzewa dynamicznego ...................................................209
Rozdzia 18. Program REGRE.cpp krelcy prost regresji
dla punktw odczytanych z pliku zewntrznego .............................217
Rozdzia 19. Program MOUSEBOX.cpp do przesuwania mysz okien wyboru ......229
Rozdzia 20. Program DRAWTHRU.cpp do rysowania mysz kilku linii
oraz do wybrania i podwietlenia jednej z nich...............................243

C:\Andrzej\PDF\ABC programowania w C++\!spis tresci.doc

Spis treci

Dodatki .......................................................................................257
Dodatek A

Kody ASCII ..................................................................................259

Dodatek B

Kody klawiatury rozszerzonej ........................................................263

C:\Andrzej\PDF\ABC programowania w C++\!spis tresci.doc

Rozdzia 9.

Okno lokalne
Wsprzdne punktu na ekranie mona opisywa w ukadzie bezwzgldnym dotyczcym
caego ekranu lub w podoknie (viewport) posiadajcym lokalny ukad wsprzdnych,
tak jak ma to miejsce w programie p9_1.cpp. W programie tym na pocztku funkcji
 uruchamiamy tryb graficzny pracy monitora. Mona to uczyni na dwa sposoby:
przez doczenie (wlinkowanie) sterownikw grafiki, tak aby sterowniki te stanowiy
integraln cz naszego programu, lub przez pozostawienie tych sterownikw poza
naszym programem i korzystanie z nich, w sposb automatyczny, w czasie wykonywania programu. W tym drugim przypadku, uywane w programie sterowniki grafiki musz
by obecne na platformie, na ktrej wykonujemy nasz program. Sterownikw tych dostarcza rodowisko Borland w pliku Bgi. Uruchomienie trybu graficznego dla tego
przypadku realizuje (w naszym programie) funkcja . Druga moliwo (z wlinkowaniem, czyli trwaym doczeniem sterownikw grafiki) realizowana jest (w naszym programie) przez funkcj 
 , ktr obecnie unieruchamiamy poprzez
objcie jej symbolami . Ten sposb odwoywania si do sterownikw grafiki
pokazany zostanie w drugiej czci tego podrozdziau.
W funkcji  utworzymy dwa prostoktne podokna poprzez dwukrotne wywoanie
konstruktora klasy   . Na licie argumentw tego konstruktora przekazujemy mu
parametry
, , , , czyli wsprzdne wierzchokw: lewego grnego i prawego dolnego kreowanego okna. W obu wywoaniach wsprzdne te s rne, tak aby uzyska
wzajemne przesunicie podokien, jak jest to pokazane na rysunku 9.1. Wsprzdne
wierzchokw podajemy jako liczby wzgldne odniesione do maksymalnych wymiarw, odpowiednio w kierunku poziomym i pionowym. Te maksymalne wymiary
uzyskujemy z funkcji  oraz . Klasa   posiada funkcj wasn  ,
w ktrej za pomoc funkcji bibliotecznej   , ustalamy lokalne ukady odniesienia dla obiektw klasy   : pierwszego, noszcego nazw  i drugiego, wskazywanego przez wskanik . Klasa   posiada dwie dalsze funkcje wasne: 
 (do
krelenia elipsy) oraz  (do wykrelenia prostej). Na rzecz obiektu  wywoamy
funkcj 
, co spowoduje wykrelenie w pierwszym podoknie (viewport) elipsy

C:\Andrzej\PDF\ABC programowania w C++\r09.doc

131

Cz I Wprowadzenie do jzyka C++

132

usytuowanej centralnie wzgldem tego podokna. Poniewa jednak przy kreacji tego
podokna ostatnim parametrem przekazanym do funkcji    bya jedynka (z wiersza 36.), to czci figur geometrycznych (w tym przypadku elipsy) wychodzce poza
obszar podokna zostan obcite. Std przycicie elipsy widoczne na rysunku 9.1.
Natomiast na rzecz drugiego okna, wskazywanego przez wskanik , zastosujemy
funkcj . Poniewa przy kreacji okna wskazywanego przez wskanik  ostatnim
parametrem przekazanym funkcji    byo zero (z wiersza 37.), wic linia prosta zostanie narysowana w caoci (bez ograniczenia jej tylko do obszaru podokna).
Oto program p9_1.cpp:







*
7
8






 
*
7
8






 
*
7
8






 
*
7
8






132


 



 

 
 
! 
"#$%$&%'()
++, 
',('-&.//012345#&//06-)
, 
',('-&.//0//0-
9
:"1;
!9-9;<-) 
)
=)>
>++???
+@
 A;B
!9
 
 
$4C4? 
 8
!9-9;. DE
 <-) 
)
=)>
 
"#$%$&%'()
, 
',('--)
9
:"1;
!9-9; B;B<-) 
)
=)>
>++???
@+
 1;
!.  3'%'2'0'23'23'0%'0%''0;'D)
 @1' F8G)
 CD)
 $ 9 ='9 ()
 39 ='9 ('9 ='9 ()
1; 9 '9 '9 '9 ' @1'
 ' 0;' D)
>)++??????????
 H
! )
++A;B)
1; 48''''-4"-'36I%24J'AI6%$')
1; @0",1;'' ''-0"-'J$331A'36I%24J'8)
4CD)
4$ ' )
0KCD)
0K3'7'7'K)

) 
)
>++?????????????????????????????????????????????????
1;..1;9 '9 '9 '9 ' @1'
 ' 0;' D.

C:\Andrzej\PDF\ABC programowania w C++\r09.doc

Rozdzia 9. Grafika punktowa



 
*
7
8






 
*
7
8






 
*
7
8


133

'0;0;'DD'11
! ="
H==)
 ("
H=()
3"@=) %"@()
2"@=) 0"@()
23"2K3) 0%"0K%)
23"23+) 0%"0%+)
>++???
 1;..CD
!

B3'%'2'0'D)

9 (
L136#?M633'0;)
8'8'23'0%)
9 '-N N 'N -'1'3'%)


=E 9(3$M%?%$O%'&$5%$2?%$O%)

034&P)

==('7' )
>++???
 1;..$ 9 ='9 (
!
9 (
L136#?M633')
9

23'0%'=@23'(@0%)
>++???
 1;..39 ='9 ('9 ='9 (
!

(
L136#?365$'8')

)

=@23'(@0%'=@23'(@0%)
>

Funkcjonowanie programu obsugujcego grafik punktow wymaga uruchomienia


sterownika (driver) grafiki, udostpniajcego implementacje funkcji poredniczcych
pomidzy programem a konkretnym typem karty graficznej. W tym wypadku chodzi
o funkcje dostarczane przez BGI (Borland Graphics Interface). Funkcje te, na etapie
konsolidacji programu, mona doczy tak, e bd one wraz z programem waciwym stanowi jednolit cao. Inn moliwo stwarza mechanizm zwany DLL (Dynamic Link Library) polegajcy na tym, e program wynikowy nie zawiera moduu
z funkcjami z BGI. Jednake modu ten jest adowany do pamici w czasie wykonywania programu, a jego funkcje s udostpniane programowi (a take innym programom
ewentualnie wykonywanym rwnoczenie); std oszczdno pamici i mniejszy
rozmiar kodu wynikowego. Inicjalizacj grafiki za pomoc drugiego sposobu (DLL)
realizuje funkcja  w wierszu 6., a za pomoc sposobu pierwszego funkcja

  w wierszu 15. Sposb pierwszy jest tu nieaktywny, gdy funkcja 

 objta jest znakami , a jej wywoanie w funkcji  jest poprzedzone
dwoma ukonikami (znakami slasz). Uaktywnienia tej funkcji dokonamy w dalszej czci
rozdziau. Obecnie program graficzny uruchomimy za pomoc  w wierszu 34.
Inicjalizacji albo otwarcia trybu graficznego dokonuje si poprzez wywoanie funkcji
bibliotecznej  (wiersz 9.), przy czym wczeniej naley nada warto
zmiennej , tu rwn staej predefiniowanej !"#". Spowoduje to, e funkcja
 sama rozpozna typ karty graficznej i dobierze dla niej najodpowiedniejszy
tryb pracy. Std zbdno przypisywania wartoci zmiennej  w wierszu 9. Jednak, jeli chcie uzyska tzw. stronicowanie ekranu, to zmiennej  naley nada
warto , a zmiennej  warto $!, jak w programie ZEGAR.cpp, w czci
drugiej. Trzecim argumentem funkcji  jest cieka dostpu do biblioteki BGI.

C:\Andrzej\PDF\ABC programowania w C++\r09.doc

133

134

Cz I Wprowadzenie do jzyka C++

Moe to by np. #%&'(!#&) lub, jak tu, #%&*+&. Konieczno uywania


w programie dwch wstecznych ukonikw && (dwch znakw backslash) wynika
std, e pierwszy z nich ma (w C++) znaczenie specjalne: potraktuj nastpny znak
dosownie.
Efektywny jest wic dopiero drugi ukonik wsteczny & (backslash). Zawsze naley
sprawdzi powodzenie operacji uruchomienia programu graficznego. W tym celu wywouje si funkcj  ,
 i sprawdza, czy zwrcia ona warto predefiniowan  .
W wierszu 24. definiowana jest klasa   do obsugi jednego wycinka ekranu (podokna lokalnego viewport), z lokalnym ukadem wsprzdnych. Skadniki wasne
, ", ',  oznaczaj wsprzdne wierzchokw lewego grnego (Left, Top) i prawego
dolnego (Right, Bottom) podokna lokalnego. Skadnik ' oznacza wymiar poziomy,
a " pionowy okna lokalnego. Skadniki wasne '- i "- s wsprzdnymi rodka
podokna lokalnego (w ukadzie lokalnym). Skadniki * i *  zawiera bd informacj o kolorze rysunku i ta. Skadnik  przyjmowa bdzie warto 0 lub 1. W tym
ostatnim przypadku czci rysunku wystajce poza zakres okna lokalnego bd niewidoczne, czyli realizowane bdzie obcinanie (clipping).
W wierszu 26. widzimy wskanik * .  acucha z czci tytuu okna. Tablica
pomocnicza  zawiera bdzie cay opis okna (tytu + wsprzdne wierzchoka lewego
grnego okna lokalnego).
W wierszu 27. widzimy funkcj wasn  , zdefiniowan w wierszu 54. Funkcja ta,
w wierszu 55, wywouje funkcj biblioteczn    definiujc podokno lokalne.
Na licie argumentw aktualnych tej funkcji podajemy wsprzdne globalne (dla
caego ekranu, z pocztkiem w lewym grnym rogu ekranu). Po ustaleniu podokna
lokalnego, w wierszu 57. wywoujemy funkcj  (czyli supek, lub wypeniony prostokt) podajc na licie argumentw wsprzdne jego wierzchokw: lewego grnego
i prawego dolnego. Wsprzdne /0/ oznaczaj ustawienie wierzchoka lewego grnego
na pocztku podokna lokalnego. Wsprzdne ' i " ustawi prawy dolny wierzchoek
supka () w prawym dolnym rogu podokna lokalnego. Supek () wypeniany
jest kolorem okrelanym przez funkcj 1


 w wierszu 56.
W wierszu 58. funkcja 1 dokonuje sformatowanego wpisu do tablicy pomocniczej . Zauwamy, e wpisany do tej tablicy acuch bdzie zawiera tytu obiektu
wskazany acuchem  oraz wsprzdne , " okna lokalnego (wzgldem caego ekranu).
Wyprowadzenie tekstu (acucha) na ekran, pozostajcy w trybie graficznym, zapewnia
w wierszu 61. funkcja ,. Kolor tego napisu okrela funkcja *
 w wierszu
60. Lokalizacj tekstu na ekranie wskazuj dwa pierwsze argumenty funkcji ,.
Centrowanie tekstu wok tej lokalizacji zapewnia funkcja 2,1 w wierszu 59.
W wierszu 28. widzimy funkcj wasn 
 zdefiniowan w wierszu 63. Funkcja ta,
w wierszu 65, wywouje funkcj biblioteczn 1

 dla argumentw bdcych


skadnikami wasnymi klasy, z ktrych '- oznacza poow szerokoci, a "- poow
wysokoci okna lokalnego. Pozostae dwa argumenty s dugociami posi elipsy
(przeliczanymi z jednostek wzgldnych  i  na bezwzgldne, w pikselach).

134

C:\Andrzej\PDF\ABC programowania w C++\r09.doc

Rozdzia 9. Grafika punktowa

135

W wierszu 29. widzimy nastpn funkcj wasn o nazwie , zdefiniowan w wierszu 67. Funkcja ta wywouje funkcj biblioteczn
 z lokalnymi wsprzdnymi
pocztku i koca linii prostej. Instrukcje przeliczajce jednostki wzgldne 3, -, 3,
- na lokalne bezwzgldne (w pikselach) wystpuj na licie argumentw aktualnych
funkcji
 w wierszu 70. Funkcja 

 w wierszu 68. okrela rodzaj linii
(ciga, przerywana, itp.) oraz jej grubo. Warto 3 ostatniego argumentu oznacza
danie krelenia linii pogrubionej.
W wierszu 30. widzimy konstruktor klasy   , zdefiniowany w wierszu 44. Na licie
parametrw formalnych otrzymuje on informacj
, , ,  o pooeniu wierzchokw
(lewego grnego i prawego dolnego) w jednostkach wzgldnych globalnych, takich e
zero odpowiada lewemu grnemu, a jeden prawemu dolnemu rogowi ekranu. W ciele
konstruktora wsprzdne te s przeliczane na wsprzdne bezwzgldne globalne , ",
', . W tym celu w wierszu 47. (i nastpnym) wywoujemy funkcje  i 
zwracajce wartoci maksymalne (liczone w pikselach) wsprzdnych ekranu w poziomie i w pionie. Kolory,  (clipping) oraz acuch  tytuu obiektu przekazywane s do
klasy za porednictwem listy inicjalizacyjnej (przed wierszem 47.).
W programie  wywoujemy funkcj inicjalizujc grafik albo z wiersza 34. (obecnie), albo z wiersza 35. (w drugiej czci niniejszego podrozdziau).
W wierszu 36. kreowany jest obiekt o nazwie  poprzez wywoanie na jego rzecz
konstruktora klasy   . W wierszu 37. powtarzamy czynnoci z wiersza 36., ale dla
obiektu  klasy   , z tym jednak e tu (dla odmiany) wykreowany obiekt wskazywany jest nie nazw, ale wskanikiem . Zauwamy, e ostatni argument w wywoaniu
konstruktora wynosi: 1 w wierszu 36. i 0 w wierszu 37. Zatem, w przypadku obiektu 
bdzie dziaa mechanizm, ktry spowoduje obcinanie (clipping) wychodzcych poza
podokno lokalnych czci rysowanych figur geometrycznych lub napisw. W przypadku
okna  tak nie bdzie.
W wierszu 38. wywoujemy funkcj  , a w wierszu 39. funkcj 
 na rzecz
obiektu . Poniewa  jest nazw obiektu, wic w wierszach 38. i 39. uywamy operatora kropki.
W wierszach 40. i 41. wywoujemy funkcje   oraz  na rzecz obiektu 
wskazywanego wskanikiem . Std konieczno uycia operatora strzaki w tych
wywoaniach funkcji.
Przed zakoczeniem programu naley zamkn tryb graficzny poprzez wywoanie
funkcji *
 w wierszu 42.
Po skompilowaniu, konsolidacji i wykonaniu programu w trybie Windows lub MSDOS otrzymujemy ekran, jaki przedstawiony zosta na rysunku 9.1.
Rysunek 9.1.
Ekran otrzymany
w wyniku wykonania
programu p9_1.exe

C:\Andrzej\PDF\ABC programowania w C++\r09.doc

135

136

Cz I Wprowadzenie do jzyka C++

Podokno pierwsze pracuje w trybie obcinania figur wystajcych poza obszar podokna
lokalnego, a okno drugie w trybie bez obcinania.
Zauwamy, e elipsa obiektu  zostaa obcita na granicy podokna lokalnego ustalanego funkcj biblioteczn    w wierszu 55. programu. Poniewa mechanizmu
tego nie wywoano przy kreacji obiektu  (w wierszu 37.), wic linia narysowana na
rzecz tego obiektu wychodzi poza granice okna lokalnego (viewport).
Wykonanie powyszego programu na innym komputerze jest moliwe tylko wtedy, gdy
sterowniki grafiki EGAVGA znajduj si rwnie w katalogu C:\Bc5\Bgi, tzn. takim jak
w wierszu 9. programu. W przeciwnym razie naley ponownie skompilowa program,
uaktualniajc ciek dostpu w wierszu 9. programu. Innym rozwizaniem, nie wymagajcym rekompilacji, byoby podanie w wierszu 9. programu pustej cieki dostpu do sterownikw grafiki (czyli 44). Wtedy program (w czasie wykonania) poszukuje sterownikw w katalogu biecym. Majc tak skompilowany program, przed
jego wykonaniem naleaoby skopiowa plik Egavga (z zasobw Borland) do biecego katalogu (w ktrym znajduje si p9_1.exe) i wtedy dopiero go wykona.
Drugi sposb udostpniania programowi sterownikw grafiki (tzn. sposb z tzw.
wlinkowaniem czyli trwaym doczeniem sterownikw EGAVGA) pokaemy w programie p9_1wg.cpp (odmiana programu p9_1.cpp) zlokalizowanym w katalogu p9_1wg
(o takiej samej nazwie jak program).
Najpierw naley uzyska plik Egavga.obj. W tym celu do biecego katalogu, np. C:\
Bcpp5\p9_1wg, naley skopiowa program Bgiobj.exe (z zasobw Borland), np. z katalogu C:\Bc5\Bgi. Kopiowanie to przeprowadzamy poza rodowiskiem programowania
Borland, np. wykorzystujc program Eksplorator Windows.
Nastpnie (nadal korzystajc z programu Eksplorator Windows) otwieramy biecy
katalog, po czym wskazujemy mysz podane dalej pola i wpisujemy: Start|Uruchom|
Bgiobj C:\Bg5\Bgi\Egavga. Po wykonaniu i zamkniciu programu Bgiobj.exe, w katalogu C:\Bcpp5\p9_1wg powinien si pojawi plik Egavga.obj. Zamykamy program
Eksplorator Windows.
Uruchamiamy rodowisko programowania Borland C++ i tworzymy nowy projekt
o nazwie p9_1wg, dla platformy DOS w katalogu p9_1wg, z tym jednak e w oknie New
Target zaznaczamy kwadratowe pole BGI (rysunek 2.2).
Wskazujc mysz na ikony File|Open odszukujemy program p9_1.cpp (w katalogu
p9_1) i zapisujemy go w katalogu p9_1wg pod nazw p9_1wg.cpp.
W oknie Project naprowadzamy kursor na kwadrat z minusem tu przed nazw
p9_1wg.exe i naciskamy prawy przycisk myszy. Pojawia si lista wyboru, na ktrej
lewym przyciskiem myszy wskazujemy polecenie Add node. Pojawi si okno Add to
Project List. W polu Pliki typu rozwijamy list i wybieramy opcj All files (*.*). Mysz
wskazujemy na Egavga.obj, jak pokazano na rysunku 9.1a.

136

C:\Andrzej\PDF\ABC programowania w C++\r09.doc

Rozdzia 9. Grafika punktowa

137

Rysunek 9.1a.
Okno rodowiska
programowania
Borland w czasie
dodawania do ju
utworzonego projektu
(w biecym katalogu)
pliku Egavga.obj w celu
trwaego doczenia
sterownikw grafiki

Po wskazaniu mysz przycisku Otwrz, okno Add to Project List znika, a w oknie
Project pojawia si nowy wze (node) egavga.obj, jak pokazano na rysunku 9.1b.
Rysunek 9.1b.
Fragment okna
rodowiska
programowania
Borland po dodaniu
do projektu pliku
Egavga.obj

Uaktywniamy (poprzez kliknicie) okno z plikiem programu p9_1wg.cpp i dokonujemy w nim modyfikacji polegajcej na uruchomieniu funkcji 
  zamiast
. Po skompilowaniu i konsolidacji otrzymujemy program, ktrego integraln
czci s sterowniki grafiki EGAVGA. Wykonanie tego programu prowadzi do takiego samego wydruku, jak wydruk przedstawiony na rysunku 9.1.

Pozycjonowanie obiektu
za pomoc myszy
Do przesuwania obiektw takich jak figury geometryczne mona uy myszy, podobnie
jak zostanie to zrobione w programie p9_2.cpp. W programie tym dostp do sterownikw grafiki realizujemy sposobem przedstawionym w drugiej czci poprzedniego
podrozdziau, tzn. poprzez wywoanie funkcji 
 . (Funkcja  jest tu
nieczynna). W tym celu uruchamiamy projekt w katalogu p9_2 z zaznaczeniem pola
BGI (widocznego na rysunku 2.2) i z dodaniem wza (node) w postaci pliku egavga.
obj (jak na rysunku 9.1b). Plik ten mona np. przegra z katalogu p9_1wg lub wskaza
go w tym katalogu w czasie doczania nowego wza.
Oczywicie mona go te wykreowa od nowa za pomoc programu Bgiobj.exe, tak jak
zrobiono to w drugiej czci poprzedniego podrozdziau.

C:\Andrzej\PDF\ABC programowania w C++\r09.doc

137

Cz I Wprowadzenie do jzyka C++

138

Do obsugi myszy zdefiniujemy klas $5 zawierajc funkcje wasne: $ (do uruchomienia myszy),  $ (do ujawniania kursora myszy), , $ (do ukrycia kursora
myszy) i 65$ (do zwrotu aktualnych wsprzdnych kursora myszy). W funkcji 
utworzymy tylko jeden obiekt o nazwie  klasy (typu)   . Obiekt ten jest widocznym na rysunku 9.2a prostoktem o wymiarach zdefiniowanych za pomoc wartoci
argumentw w wywoaniu konstruktora klasy   w wierszu 49. Na rzecz tego
obiektu wywoujemy funkcj wasn   klasy   . W funkcji tej definiujemy
podokno z lokalnym ukadem wsprzdnych, pokrywajce si z utworzonym wanie
prostoktem . W tym podoknie narysujemy elips oraz w prawym dolnym rogu may
kwadrat, penicy rol uchwytu do przesuwania okna. Nastpnie w funkcji  uruchomimy nieskoczon ptl 
738, w ktrej sprawdzimy, czy kursor myszy znajduje si w polu uchwytu przesuwu i czy wtedy nacinity jest lewy przycisk myszy.
Jeli tak, to dotychczasowe podokno (viewport) ulega wymazaniu, a cay rysunek
przerysowywany jest w nowym (wskazanym mysz) pooeniu. W tym nowym pooeniu ponownie ustalimy lokalny ukad wsprzdnych (nowy viewport). Nacinicie
klawisza Esc przerywa nieskoczon ptl 
 i program koczy dziaanie.
Oto program p9_2.cpp:







*
7
8






 
*
7
8






 
*
7
8






138


 



 

 

 
+@
 
! 
"#$%$&%'()
, 
',('-&.//012345#&//06-)
9
:"1;
!9-9;<-) 
)
=)>
>++???
@+
 A;B
!9
 
 
$4C4? 
 8
!9-9;. DE
 <-) 
)
=)>
 
"#$%$&%'()
, 
',('--)
9
:"1;
!9-9; B;B<-) 
)
=)>
>++???
 1;
!.
 3'%'2'0'23'23'0%'0%''CD'CD0 'D'
=Q='(Q=)
 CD 0 "8)
 5
BCD)
 $ 9 ='9 ()
1; 9 '9 '9 '9 ' @1'
 ' 0;' 0;0 ' D)
>)++??????????
 Q( R

C:\Andrzej\PDF\ABC programowania w C++\r09.doc

Rozdzia 9. Grafika punktowa



 
*
7
8






 
*
7
8






 
*
7
8






 
*
7
8







*
7
*8
*
*
*
*
*
*
* 
**
*7
78
7
7

139

!.  LF8G)  2$L 2)


 ='('=1'(1'0'01'5=('50)
 Q)
 ;Q !2==") *8=',2',2)>
 ;Q !2==") *8=',2',2)>
  RQ)
>)++??????????????????????????????????????
Q( R Q)
 H
! ;''''') ++ )
A;B)
QQ) Q;Q)
1; 4''''2$#'36I%24J'AI6%$')
4CD)
B

!;"8) 9; 9:;"
 ;"
)
9;""  
;)
Q RQ)
9Q=42K8 ,, Q= 42 ,, Q(40K8 ,, Q( 40
!Q=1"Q=) Q(1"Q() Q01"Q0) ")
B
Q0""
!9!45
BCD) "8)>
Q RQ)
9Q5=(
!"Q=K423K)"Q(K40%K)"Q=S)"Q(S)
9 8 "8)
9 8 "8)
94=Q= "4=Q=K423)
94(Q= "4(Q=K40%)
43") 4%") 42"43S423) 40"4%S40%)
45
BCD)
>>
9Q5=( TT Q50 4CD)
>>

) Q;Q) 
)
>++???????????????????????????????????????
1;..1;9 '9 '9 '9 '
 ' CD' CD0 ' D.
'CDCD'CD0 CD0 'DD'
!=Q="
H==) (Q="
H=()
3"@=Q=) %"@(Q=) 2"@=Q=) 0"@(Q=)
23"2K3) 0%"0K%) 23"23+) 0%"0%+)
>++???
 1;..CD 0 
!

B3'%'2'0'D)
 " 0 < CD0 .CD)

9 (
L136#?M633')
Q;Q) 8'8'23'0%) $ *')

9 (
L136#?M633'J$331A)
23K8'0%K8'23'0%)
9QL'-N 'N -'Q='Q()

9 (
L136#?M633'2$#)
''') 
==(''QL)
Q;Q)

C:\Andrzej\PDF\ABC programowania w C++\r09.doc

139

Cz I Wprowadzenie do jzyka C++

140
7
7
7
7
7 
7*
77
88
8
8
8
8
8
8
8 
8*
87
8




>++???
 1;..5
BCD
!Q;Q) 

B) Q;Q) CD)
>
 1;..$ 9 ='9 (
!
9 (
L136#?M633')
9

23'0%'=@23'(@0%)
>++???
 Q( R..Q
!2=="8) *8=',2',2) 92==""8
!9-/ U E H( R-) 
)
=8)>
 RQ) =1"=) (1"()
>
 Q( R.. RQ
!2==") *8=',2',2) ="2==) ("2= =)
0"2== , 8=888< .8)
5=(" =:"=1 TT (:"(1< .8) 50" 0:"01< .8)
95=( !=1"=) (1"()>
>

W wierszu 7. widzimy pocztek funkcji  uruchamiajcej grafik bez doczania


sterownikw z BGI. Funkcja ta jest tu nieczynna z powodu objcia jej ciaa znakami
... W wierszu 15. widzimy pocztek definicji funkcji 
  inicjalizujcej
tryb graficzny z trwaym doczeniem sterownika EGAVGA z BGI. Ta funkcja jest tu
aktywna. Przed kompilacj programu naley utworzy plik Bgiobj.obj (jak w programie p9_1gw.cpp) i doczy go do listy wzw (node) w oknie Project.
W wierszu 24. widzimy pocztek definicji klasy   . Skadnikami wasnymi tej klasy
s wsprzdne przeciwlegych wierzchokw okna lokalnego oraz jego wymiary.
Zmienne $ i $ przechowywa bd informacj o maksymalnych wartociach
wsprzdnych ekranu w poziomie i w pionie w aktualnym trybie karty graficznej.
W wierszu 28. funkcja  , ustalajca okno lokalne, posiada jeden argument z wartoci domnieman * .9./. Warto 1 tego argumentu spowoduje wybranie dla okna
lokalnego alternatywnego koloru (wtedy, gdy okno to podlega przesuwaniu w inne
miejsce). Realizuje to funkcja (  w wierszu 95., wywoujca funkcj   z parametrem * .9.3. Jednake, gdy nie ma przesuwania okna, wybierany jest zwyky
kolor okrelony zmienn * , co odpowiada podanej wartoci domniemanej zmiennej
*  rwnej zero.
Deklaracj funkcji wasnej (  widzimy w wierszu 29., a jej definicj w wierszu 95.
Przed narysowaniem nowego okna wywoywana jest funkcja *
   czyszczca okno dotychczasowe. Funkcja *
6* wyczyciaby cay ekran.
W wierszu 32. widzimy deklaracj konstruktora klasy   . W wierszu 35. widzimy
pocztek klasy $5 zapewniajcej obsug myszy. Skadnik wasny w postaci tablicy
znakowej : suy bdzie do formatowania wydruku (za pomoc funkcji 1)
z aktualnymi wsprzdnymi myszy. Skadniki ,  przechowuj wsprzdne aktualne,
a  i  wsprzdne poprzednie kursora myszy. Skadniki , i , podaj informacj
o aktualnym i poprzednim naciniciu lewego przycisku myszy. Jeli nastpia zmiana

140

C:\Andrzej\PDF\ABC programowania w C++\r09.doc

Rozdzia 9. Grafika punktowa

141

wsprzdnych lub zmiana stanu nacinicia przycisku myszy, to skadniki ( lub (,
wynosz jeden. Funkcja $ zadeklarowana w wierszu 38. jest zdefiniowana w wierszu 102. i nastpnych. W ciele tej funkcji widzimy wywoanie funkcji 0H przerwania
33H oraz sprawdzenie poprawnoci inicjalizacji. Ewentualne niepowodzenie powoduje
wydruk acucha ;*2
5,2.5. Naley wtedy odszuka w zasobach komputera
np. funkcj msmouse.com i j wykona. Mona wtedy ponownie przystpi do wykonania programu p9_2.exe.
W wierszu 39. podano deklaracj i definicj funkcji  $ ujawniajcej kursor myszy.
Funkcja ta wywouje funkcj 1H przerwania 33H. Ukrywanie kursora myszy zapewnia
funkcja , $ z wiersza 40. Wywouje ona funkcj 2H przerwania 33H.
W wierszu 41. widzimy deklaracj funkcji 65$ dostarczajcej informacji o aktualnym
pooeniu myszy. Jej definicja znajduje si w wierszu 108. i nastpnych. Wywouje
ona funkcj 3H przerwania 33H. Przerwanie to zwraca wsprzdne myszy w rejestrach
CX i DX. Informacja o stanie przycisku myszy w chwili wywoywania przerwania
znajduje si w rejestrze BX. Informacje te przekazywane s do skadnikw wasnych
klasy $5. W wierszu 111. ustalane s skadniki niosce informacj o tym, czy wsprzdne myszy si zmieniy, lub czy zmieni si stan nacinicia przycisku myszy.
W wierszu 43. (jeszcze przed ) definiowany jest obiekt $ klasy $5. Obiekt ten
ma zasig globalny, gdy jest zdefiniowany poza ciaem jakiejkolwiek funkcji.
W wierszu 46. widzimy wywoanie funkcji , z tym e jest ono nieaktywne (po
dwch ukonikach znakach slasz). Aktywne jest wywoanie funkcji 
 
w wierszu 47.
W wierszu 48. inicjalizujemy i ujawniamy mysz. W wierszu 49. kreowany jest obiekt 
klasy   poprzez wywoanie konstruktora tej klasy. Na licie parametrw aktualnych podajemy wsprzdne wzgldne globalne (odnoszce si do caego ekranu)
wierzchokw lewego grnego i prawego dolnego okna lokalnego. Na rzecz tego
obiektu w wierszu 50. wywoywana jest funkcja   ustalajca lokalny ukad wsprzdnych.
W wierszu 51. zaczyna si zasadnicza cz programu w postaci nieskoczonej ptli

738. W wierszu 52. sprawdzamy, czy bufor klawiatury jest niepusty. Jeli tak,

i jeli nacinitym klawiszem by klawisz Esc (o kodzie ASCII = 27), to ptla ta ulega
przerwaniu, po czym nastpuje zakoczenie programu. W wierszu 54. sprawdzamy
aktualne wsprzdne myszy wywoujc funkcj 65$ na rzecz obiektu $ o zasigu
globalnym.
W wierszu 55. sprawdzamy, czy kursor myszy znajduje si na prawym dolnym
uchwycie do przesuwania okna. Jeli tak, to wykonywane jest cae ciao instrukcji 1
od wiersza 55. do 68. W wierszu 57. sprawdzamy dodatkowo, czy lewy przycisk myszy
jest nacinity. Jeli tak, to wykonywane jest cae ciao instrukcji 
7$,9938, od
wiersza 57. do 68. W wierszu 58. wywoywana jest funkcja (  po to, aby zmieni
kolor okna przy przesuwaniu. W wierszu 59. odczytujemy wsprzdne biece myszy
(w trakcie przesuwania). W wierszu 60. sprawdzamy, czy wsprzdne te s inne

C:\Andrzej\PDF\ABC programowania w C++\r09.doc

141

Cz I Wprowadzenie do jzyka C++

142

ni poprzednio. Jeli tak, to wykonywane jest ciao instrukcji warunkowej 17$(8


w wierszach 62. i 67. W wierszu 67. za pomoc funkcji (  rysowane jest okno lokalne, z tym e wiersze poniej wiersza 62. zabezpieczaj brzegi okna przed wyjciem
poza zakres ekranu.
Jeli przycisk myszy zostanie zwolniony, to przerywana jest ptla 
7$,9938
i w wierszu 69. funkcja  , wywoana na rzecz obiektu , odtwarza normalny kolor
okna lokalnego.
Po przerwaniu ptli 
738 za pomoc instrukcji  z wiersza 52. program przechodzi do wiersza 71. i, po zakoczeniu trybu graficznego poprzez wywoanie funkcji
*
 , ,
.5 <*,.
W wierszu 74. widzimy definicj konstruktora klasy   . W wierszu 77. wymiary
ekranu (w pikselach) wpisywane s do zmiennych $ i $.
Funkcja wasna   w wierszu 82. oczekuje na licie parametrw formalnych informacji o tym, czy do rysowania okna lokalnego naley uywa alternatywnego koloru. Warto domniemana tego parametru wynosi zero (wiersz 28.). Na jego podstawie
w wierszu 84. ustalany jest kolor w zmiennej lokalnej *
. W wierszu 86. rysujemy
prostokt (za pomoc funkcji bibliotecznej ) oraz elips, wywoujc funkcj 

z wiersza 98. W wierszu 88. rysowany jest uchwyt do przesuwania okna. W wierszu 89.
funkcja 1 wpisuje wsprzdne myszy do acucha pomocniczego : w obiekcie $
klasy $5. acuch ten jest w wierszu 91. wywietlany na ekranie za pomoc funkcji
,.
Kada operacja graficzna na ekranie powinna by wykonywana przy ukrytej na ten czas
myszy. Po wykonaniu tych operacji ujawniamy mysz, jak w wierszu 92., wywoujc
funkcj  $ na rzecz obiektu $.
Po skompilowaniu, konsolidacji i uruchomieniu programu w trybie Windows lub MSDOS otrzymujemy ekran widoczny na rysunku 9.2a.
Rysunek 9.2a.
Ekran programu
p9_2.exe z prostoktem,
elips, informacj
o pooeniu kursora
i uchwytem do przesuwu
caego rysunku
za pomoc myszy
z nacinitym lewym
przyciskiem

W lewym grnym rogu okna widzimy aktualne wsprzdne myszy. W prawym dolnym
rogu widzimy uchwyt do przesuwania prostoktnego okna lokalnego z elips w jego
centrum. W trakcie przesuwania okna (cignc mysz zaczepion w uchwycie) zmianie
ulega kolor ta okna lokalnego, jak przedstawiono to na rysunku 9.2b.

142

C:\Andrzej\PDF\ABC programowania w C++\r09.doc

Rozdzia 9. Grafika punktowa

143

Rysunek 9.2b.
Ekran programu
p9_2.exe w czasie
przesuwania za pomoc
myszy lokalnego okna
w nowe pooenie

Zwolnienie przycisku myszy przywraca oryginalne kolory okna lokalnego. W celu zakoczenia programu naley nacisn klawisz Esc.

Kopiowanie wycinkw obrazu


do pamici
W wyniku wykonania programu p5_6.exe utworzony zosta zbir mojPlik z kodami
ASCII dziesiciu znakw. Obecnie wartoci tych kodw potraktujemy jako rzdne
dziesiciopunktowego wykresu z rysunku 9.3a. Plik mojPlik kopiujemy z katalogu
p5_6 do katalogu biecego p9_3, w ktrym utworzymy obecny projekt dla programu
p9_3.cpp z grafik wlinkowan (trwale doczon) za pomoc znanej z poprzedniego programu funkcji 
 . W wierszu 43. utworzymy obiekt  poprzez
wywoanie konstruktora klasy   , ktry jest prostoktem koloru jasnoszarego ()
="'>). Na rzecz obiektu  wywoamy funkcj  , ustalajc aktualny ukad odniesienia pokrywajcy si z prostoktem . Majc ju ukad odniesienia, wywoujemy
na rzecz obiektu  funkcj ?
. W funkcji tej stworzymy dostp do pliku mojPlik
(uywajc funkcji bibliotecznej 1 ) i odczytamy z tego pliku dane do wykresu.
Wartoci kodw ASCII kolejno odczytanych znakw stanowi rzdne dla wierzchokw
linii amanej tworzonego wykresu. Wykres utworzymy poprzez wywoanie funkcji
bibliotecznej
 dla kadego wierzchoka linii amanej. W wierzchokach tych narysujemy mae kka (uywajc funkcji bibliotecznej 
*). Nastpnie, w 
uruchomimy nieskoczon ptl 
738. W ptli tej sprawdzamy pooenie kursora
myszy i ewentualne nacinicie jej lewego przycisku. Jeli kursor naprowadzimy na
jeden z wierzchokw linii amanej (na jedno z kek) i naciniemy przycisk myszy,
to nad wskazanym wierzchokiem pojawi si prostokt z napisem (rysunku 9.3b) zawierajcym informacj o znaku i kodzie ASCII, jakiemu odpowiada dany wierzchoek
wykresu (czyli dane kko).
Po zwolnieniu przycisku myszy, napis powinien zosta usunity, a wykres powinien
przyj oryginaln posta. Aby nie narusza pozostaej czci wykresu, postulat ten
zrealizujemy w ten sposb, e jeszcze przed wywietleniem napisu umiecimy w pamici (uywajc funkcji bibliotecznej ) oryginalny obraz prostoktnego wycinka ekranu, w ktrym za moment ma pojawi si napis. Odtworzenie wykresu (po
zakoczeniu wywietlania napisu) polega bdzie na skopiowaniu w miejsce napisu obrazu wycinka ekranu, umieszczonego uprzednio w pamici. Zostanie to zrealizowane za
pomoc funkcji bibliotecznej ,.

C:\Andrzej\PDF\ABC programowania w C++\r09.doc

143

Cz I Wprowadzenie do jzyka C++

144

Oto program p9_3.cpp:









*
7
8






 
*
7
8






 
*
7
8






 
*
7
8






 
*
7
8






144


 



 

 

 
 A;B
!9
 
 
$4C4? 
 8
!9-9;. DE
 <-) 
)
=)>
 
"#$%$&%'()
, 
',('--)
9
:"1;
!9-9; B;B<-) 
)
=)>
>++???
 1;
!.
 3'%'2'0'23'0%''CD'
=Q='(Q=' 9JF8G' OOF8G'JJF8G'
OF8G'OF8G'JF8G'J F8G'B''B(H)
 
OFG'JFG)  F8G)  @6H)
 CD)  P
)
1; 9 '9 '9 '9 '
 ' CD)
>)++??????????
 Q( R
!.  LF8G)  2$L 2)
 ='('=1'(1'0)
 Q)
 ;Q !2==") *8=',2',2)>
 ;Q !2==") *8=',2',2)>
  RQ)
>)++????
Q( R Q)

1;..OFG"!8'8'8'8''7'7>'
1;..JFG"!*'*''8'8'8'8>)++?????
 H
! ';' BDH' ') ++ )
A;B)
QQ) Q;Q)
1; 4'' ''2$#'36I%24J)
4CD)
4P
)
B

!;"8) 9; 9:;"
 ;"
)
9;""  
;)
Q RQ)
9"8) 8)SS
!94OFG Q= ,, Q= 4OFG ,,
4JFG Q( ,, Q( 4J FG ,, Q0
!BDH"8)
!9:BDH
!
9 (
L136#?M633'J$331A)

C:\Andrzej\PDF\ABC programowania w C++\r09.doc

Rozdzia 9. Grafika punktowa



 
*
7
8






 
*
7
8







*
7
*8
*
*
*
*
*
*
* 
**
*7
78
7
7
7
7
7
7
7 
7*
77
88
8
8
8
8
8
8
8 
8*
87
8




145


03V$)
94 '- N'N -'49JFG'49JFG)
"4OOFGK4B+)
"4JFGK4K4%)
Q;Q)

H
'' S4B'S4'46H)
''S4B'S4) 
==(''4 )
Q;Q) BDH")
>
Q RQ)
>B
Q0)
>
9BDH
!Q;Q) H
''46H'&1DJ?DV%)
Q;Q) BDH"8)
>>>
Q;Q) 
)


FG 46H) 46H"5V33)
>++?????????????????????????????????????????????????
1;..1;9 '9 '9 '9 '
 ' CD. 'CDCD
!=Q="
H==) (Q="
H=()
3"@=Q=) %"@(Q=) 2"@=Q=) 0"@(Q=)
23"2K3) 0%"0K%)
9 "8) )SS
!OFG"OFG@23) JFG"KJFG@0%)>
9 '- N'N -'WW'777)
B"
=B  ) "
=
 )
B(H"H
R
8'8'B') 6H"
B FB(HG)
9:6H!Q;Q) 
)
9- 
B 6H<-) 
)
=8)>
>++???
 1;..CD
!

B3'%'2'0')

9 (
L136#?M633'CD)
Q;Q) 8'8'23'0%)


(
L136#?365$'8')
AI6%$)
9 ") )SS

OFKG' JFKG'
OFG' JFG)

2$#) 
==( 8'8'-P;E ;-)
Q;Q)
>++???
 1;..P

! "'E' ='(' O) M63$ @"9
-HED;-'--)
9""5V33
!
==(8'8'-HED; <-) 
)
=8)>

B )

)
9 (
L136#?M633')
9JF8G"9
)
O"23+) =" O) ("8K9JF8G+8@0%)
OOF8G"=) JJF8G"()
!9JFG"9
)
E"8K9JFG+8@0%)

='(' =S O'E) 

='('8'8')
=S" O) ("E) OOFG"=) JJFG"()

C:\Andrzej\PDF\ABC programowania w C++\r09.doc

145

Cz I Wprowadzenie do jzyka C++

146



 
*
7
8






 
*
7
8



>B
E:"$1M ,, SS 8)


='('8'8')
9"8) 8)SS
!OFG"3SOOFGK) OFG"3SOOFGS)
JFG"%SJJFGK) J FG"%SJJFGS)
>
>++???
 Q( R..Q
!2=="8) *8=',2',2) 92==""8
!9-/ U E H( R-) 
)
=8)>
 RQ) =1"=) (1"()
>
 Q( R.. RQ
!2==") *8=',2',2) ="2==) ("2= =)
0"2== , 8=888< .8)
9=:"=1 TT (:"(1 !=1"=) (1"()>
>

W wierszu 7. rozpoczyna si definicja funkcji uruchamiajcej tryb graficzny (jak w programie p9_2.cpp). W wierszu 16. rozpoczyna si definicja klasy   . Skadniki wasne
tej klasy (w wierszu 18.) zawiera bd pooenia i wymiary okna lokalnego. W wierszu 19. widzimy dwie tablice na pomieszczenie wsprzdnych dziesiciopunktowego
(dziesiciowzowego) wykresu. Bd to wsprzdne bezwzgldne (w pikselach)
w oknie lokalnym. Kady wze wykresu jest koem o promieniu rwnym cztery piksele. We wntrzu kadego z tych k wyrnimy kwadrat, taki e jeli wsprzdne
aktualne kursora myszy znajd si we wntrzu tego kwadratu, to dany wze uznamy
za wskazany (zidentyfikowany) mysz. Lewe i prawe oraz grne i dolne brzegi takich
kwadratw (dla kadego wza) zapisane zostan w tablicach @
, @, @ i @6, w wierszu 20.
W wierszu 21. widzimy tablice ,@ i ,> o nie zdefiniowanych rozmiarach. W tablicach
tych zapiszemy (pocztkowo w jednostkach wzgldnych lokalnych) wsprzdne tak
dobranych punktw, e po poczeniu ich lini aman zostan wyrysowane osie lokalnego ukadu odniesienia (razem z pstrzakami). Poniewa deklaracja tych tablic poprzedzona jest deskryptorem *, wic tablice te naley zainicjalizowa globalnie,
poza ciaem jakiejkolwiek funkcji. Umoliwi to ustalenie rozmiarw tych tablic na
etapie inicjalizacji (w wierszu 36. i nastpnym) na podstawie liczby wypisanych po
prawej stronie elementw danej tablicy.
W wierszu 21. widzimy rwnie deklaracj wskanika ) obiektu typu  6, tzn.
obiektu typu nie zdefiniowanego. Wskanik ten bdzie wskazywa na uprzednio zarezerwowany (wiersz 83.) blok pamici (bufor) do skadowania (zapisywania) pierwotnego wygldu (obrazu, image) wybranego wycinka prostoktnego ekranu.
W wierszu 22. widzimy deklaracj funkcji wasnych klasy   . Funkcja   zdefiniowana jest w wierszu 85. i nastpnych. Odpowiada ona za wypenienie ta (za pomoc funkcji bibliotecznej ) kolorem * . Ponadto, w wierszu 89., funkcja ta rysuje osie wsprzdnych okna lokalnego (uywajc funkcji bibliotecznej
).
Zwrmy uwag na jawne konwersje typw 6 ,
 na typy  (wymagane przez
funkcj
) bezporednio na licie argumentw aktualnych w wywoaniu tej funkcji
w wierszu 89. Dziki funkcji  , na ekranie, w trybie graficznym, pojawia si napis
?
 2., , podpowiadajcy co naley uczyni po uruchomieniu tego programu.

146

C:\Andrzej\PDF\ABC programowania w C++\r09.doc

Rozdzia 9. Grafika punktowa

147

Funkcja ?
(wiersz 22.) zdefiniowana jest w wierszu 101. i nastpnych. W wierszu
102. funkcja ta definiuje i uruchamia wskanik  obiektu strumieniowego A) obsugujcego dostp do pliku  2
 . Wskanikowi temu przypisywany jest adres zwracany przez funkcj 1 . Gdyby proces otwarcia pliku (za pomoc funkcji 1 ) si
nie powid (np. gdyby w biecym katalogu nie byo pliku mojPlik), to wskanik 
otrzymaby warto (B. Wtedy w wierszu 102. i nastpnych wydrukowany zostaby
komunikat (jeszcze w trybie graficznym, std uycie funkcji ,) zawierajcy
napis  2
 .C. Nastpnie program zostaby zakoczony. W przypadku powodzenia
otwarcia pliku mojPlik, w wierszu 105. funkcja  678 wymusi ustawienie wskanika  na pocztku tego pliku. Jest to tutaj zabieg czysto formalny, gdy funkcja 1 
automatycznie ustawia wskanik na pocztku otwieranego pliku. Z powyszych uwag
wynika, e aby otwarcie pliku si powiodo, naley w biecym katalogu zapewni
obecno pliku mojPlik np. poprzez wykonanie w tym katalogu programu p5_6.exe
albo poprzez skopiowanie tego zbioru z katalogu p5_6.
W wierszach od 110. do 114. widzimy ptl 6 DE 
78. W wierszu 110. funkcja
1* odczytuje kolejny znak z pliku mojPlik i podstawia go do kolejnych elementw
tablicy 1>. W wierszu 112. funkcja
 kreli kolejny odcinek wykresu (od punktu
poprzedniego) do wza, ktrego rzdna ma odwzorowywa warto kodu ASCII
wanie odczytanego (z pliku) znaku. Kady wze jest koem wypenionym. Kreli
go funkcja 
*. Parametry /0FG/ (stopni) oznaczaj wypenienie caego koa, a nie
tylko jego wycinka. Ostatni parametr, wynoszcy H, oznacza promie (w pikselach)
wza koowego. W wierszu 115. widzimy wywoanie funkcji 
* dla narysowania koa w ostatnim wle wykresu, bowiem wewntrz ptli 6 DE 
78 rysowane
s koa w wle pocztkowym kolejnego odcinka linii amanej.
W wierszu 116. i dwch nastpnych widzimy definicje kwadratw (dla kadego wza)
zapewniajcych atw identyfikacj danego wza przez mysz. Zauwamy dodanie offsetw  i " w celu uzyskania wartoci (bezwzgldnych) globalnych, gdy takimi
wartociami operuj funkcje obsugujce mysz.
W wierszu 23. widzimy deklaracj konstruktora klasy   . W wierszu 27. widzimy
definicj klasy $5, podobn do tej z programu p9_2.cpp. W wierszu 35. kreowany
jest obiekt $ (typu $5) o zasigu globalnym dostpny z kadej funkcji.
W wierszu 41., w , widzimy wywoanie funkcji 
  uruchamiajcej tryb
graficzny. W wierszu 43. kreowany jest obiekt  klasy   poprzez wywoanie na jego
rzecz konstruktora tej klasy.
W wierszu 44. wywoujemy funkcj   (wiersze 22. i 85.), w wyniku czego uzyskujemy wsprzdne ukadu lokalnego. W wierszu 45. wywoujemy funkcj ?
na
rzecz obiektu  (klasy   ).
W wierszu 46. rozpoczyna si zasadnicza cz programu w ptli nieskoczonej

738. W wierszu 48. kontrolowane jest ewentualne nacinicie klawisza Esc (kod
ASCII = 27). Po naciniciu tego klawisza zostanie wykonana instrukcja  . Pro-

gram przerwie ptl i przejdzie do wiersza 71.

C:\Andrzej\PDF\ABC programowania w C++\r09.doc

147

148

Cz I Wprowadzenie do jzyka C++

W wierszach 50. i 51. (w ptli 1 ) sprawdzamy, czy kursor myszy znajduje si w rodku ktrego z dziesiciu wzw i czy rwnoczenie nacinito lewy przycisk myszy.
Jeli tak, to wykonywane jest ciao tej instrukcji w wierszach od 53. do 71. Ponadto
zmienna  ustalana jest na zero, gdy w buforze pamici wskazywanym przez
wskanik ) nie ma jeszcze umieszczonego adnego wycinka obrazu ekranu.
W wierszu 54. rozpoczyna si ptla 6 DE 
78 koczca si w wierszu 66. Jest ona
wykonywana tak dugo, jak dugo pozostaje nacinity przycisk myszy. W wierszu 54.
sprawdzamy, czy wycinek ekranu zosta ju wpisany do bufora w pamici. Jeli jeszcze
nie (dla wanie wskazywanego wza), to wykonywane jest ciao tej instrukcji od
wiersza 55. do wiersza 63. W zakresie tego ciaa, w wierszu 57., uywamy funkcji
1 do sformatowania i zeskadowania (zapisania) (w tablicy ) wydruku bdcego opisem wza.
W wierszu 58. ustalane s wsprzdne miejsca, w ktrym ma zosta wydrukowany
opis wza. Wycinek ekranu, ktry ma by zmieniony z racji nowego wydruku, jest
wczeniej pobrany z ekranu i umieszczony w buforze (przygotowanym w wierszu 84.).
Odbywa si to za pomoc funkcji bibliotecznej  w wierszu 61. Wycinek
ekranu (ktrego obraz jest ju umieszczony w buforze) wypeniamy w wierszu 62.
prostoktem () w kolorze > , ustalonym w wierszu 55.. Na ten prostokt, za
pomoc funkcji ,, nadpisywany jest opis wza.
Po zwolnieniu przycisku myszy przerwaniu ulega ptla 6 DE 
78. Wtedy w wierszu
69. funkcja , odtworzy prostokt za pomoc obrazu ekranu umieszczonego
w buforze, na ktry wskazuje wskanik ).
Nacinicie klawisza Esc powoduje przerwanie nieskoczonej ptli 
738 z wiersza
46. i przejcie programu do wiersza 72. Zamykamy tryb graficzny i zwalniamy pami
dynamiczn (heap), zarezerwowan dla buforu wycinka obrazu ekranu. Poniewa jest
to tablica obiektw typu  6, wic do dealokacji pamici uywamy operatora 6
IJ.
W wierszach od 75. do 85. widzimy definicj konstruktora klasy   . W wierszu 81.
i nastpnym wartoci wzgldne wsprzdnych punktw do wykrelenia osi > i @ lokalnego ukadu odniesienia zamieniane s na wartoci bezwzgldne (w pikselach) lokalne.
W wierszu 82. dokonujemy wpisu sformatowanego napisu wzorcowego zoonego ze
znaku i trzycyfrowej liczby; pniejsze wydruki opisw wzw nie przekrocz rozmiarw tego acucha. W wierszu 83. funkcje  6 i    zwracaj szeroko
i wysoko tego wydruku. Na tej podstawie funkcja 5 (w wierszu 84.) zwraca
rozmiar pamici potrzebnej na bufor do przechowywania obrazu prostoktnego wycinka ekranu o rozmiarze takim, jak rozmiar napisu wzorcowego. Rozmiar bufora podawany jest w bajtach, std typ  6 dla bufora. W wierszu 84. operator  dokona rezerwacji pamici na bufor obrazu wycinka ekranu. Ewentualne niepowodzenie przydziau
pamici dynamicznej spowoduje wykonanie instrukcji z wiersza 85. i nastpnego.
Funkcja wasna $ z wiersza 122. inicjalizuje mysz (jak w programie p9_2.cpp).
Funkcja wasna 65$ z wiersza 128. zwraca informacj o aktualnym pooeniu kursora
myszy (, ) oraz o stanie nacinicia lewego przycisku (,).

148

C:\Andrzej\PDF\ABC programowania w C++\r09.doc

Rozdzia 9. Grafika punktowa

149

Po skompilowaniu, konsolidacji i wykonaniu programu w trybie Windows lub MS-DOS


otrzymujemy ekran widoczny na rysunku 9.3a.
Rysunek 9.3a.
Fragment ekranu
programu p9_3.exe
z wykresem utworzonym
na podstawie pliku
mojPlik
(z programu p5_6)

Program p5_6.exe wpisa do pliku mojPlik cig znakw: , , *, 9, 3, -, F, K , H, H, ktrym


odpowiadaj kody ASCII wynoszce: 97, 98, 99, 61, 49, 50, 51, 10, 52, 52. Rzdne kolejnych wzw na powyszym rysunku odpowiadaj wartociom powyszych kodw
ASCII tych znakw.
Jeli wskaza kursorem myszy jeden z wzw i nacisn lewy przycisk, to nad wskazanym wzem pojawi si jego opis zoony ze znaku, przecinka oraz wartoci kodu
ASCII tego znaku, co wida na rysunku 9.3b.
Rysunek 9.3b.
Fragment ekranu
programu p9_3.exe
z informacj dotyczc
znaku (i jego kodu
ASCII) ukrytego we
wskazanym za pomoc
myszy punkcie wykresu

Mysz wskazuje wze czwarty, std opis zawiera znak rwnoci o wartoci kodu ASCII
wynoszcej 61. W celu zakoczenia programu naley nacisn klawisz Esc.

C:\Andrzej\PDF\ABC programowania w C++\r09.doc

149

You might also like