Professional Documents
Culture Documents
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 I
Rozdzia 1.
Wprowadzenie..................................................................................9
Rozdzia 2.
Rozdzia 3.
Rozdzia 4.
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
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.
Rozdzia 9.
Grafika punktowa.........................................................................131
Okno lokalne................................................................................................... 131
Pozycjonowanie obiektu za pomoc myszy ................................................... 137
Kopiowanie wycinkw obrazu do pamici..................................................... 143
Cz II
Przykady ...................................................................159
Spis treci
Dodatki .......................................................................................257
Dodatek A
Dodatek B
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
131
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.
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%)
>
133
134
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
134
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
135
136
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
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.
137
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=)
CD0
"8)
5
BCD)
$
9='9()
1;9'9'9'9'@1'
'0;'0;0
'D)
>)++??????????
Q(
R
139
139
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
EH(
R-)
)
=8)>
RQ)=1"=)(1"()
>
Q(
R.. RQ
!2==")*8=',2',2)="2==)("2= =)
0"2==,8=888<.8)
5=("=:"=1TT(:"(1<.8)50"0:"01<.8)
95=(!=1"=)(1"()>
>
140
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
141
142
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
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.
143
144
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$L2)
='('=1'(1'0)
Q)
;Q!2==")*8=',2',2)>
;Q!2==")*8=',2',2)>
RQ)
>)++????
Q(
RQ)
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
!94OFGQ=,,Q=4OFG,,
4JFGQ(,,Q(4J FG,,Q0
!BDH"8)
!9:BDH
!
9
(
L136#?M633'J$331A)
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)
)
FG46H)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"
BFB(HG)
9:6H!Q;Q)
)
9-
B6H<-)
)
=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"()
145
146
*
7
8
*
7
8
>B
E:"$1M,,SS8)
='('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
EH(
R-)
)
=8)>
RQ)=1"=)(1"()
>
Q(
R.. RQ
!2==")*8=',2',2)="2==)("2= =)
0"2==,8=888<.8)
9=:"=1TT(:"(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
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 6DE
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 6DE
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-
147
148
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 6DE
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 6DE
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
149
Mysz wskazuje wze czwarty, std opis zawiera znak rwnoci o wartoci kodu ASCII
wynoszcej 61. W celu zakoczenia programu naley nacisn klawisz Esc.
149