You are on page 1of 29

IDZ DO

PRZYKADOWY ROZDZIA
SPIS TRECI

KATALOG KSIEK
KATALOG ONLINE
ZAMW DRUKOWANY KATALOG

C++ Builder 6
dla kadego
Autor: Kent Reisdorph
Tumaczenie: Tomasz M. Sadowski
ISBN: 83-7197-859-6
Tytu oryginau: Sams Teach Yourself
Borland C++ Builder 3 in 21 Days
Format: B5, stron: 812

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

C++Builder naley do systemw byskawicznego projektowania aplikacji (ang. RAD Rapid Application Development) i jak sama nazwa wskazuje, przeznaczony jest do
tworzenia programw w jzyku C++. Wykorzystujc to narzdzie, moesz efektywnie
i szybko konstruowa 32-bitowe programy pracujce w trybie graficznym bd
tekstowym pod kontrol systemu Windows.
Ksika ta poprowadzi Ci przez zagadnienia zwizane z programowaniem w systemie
C++ Builder. Poznasz go poczwszy od podstaw, poprzez bibliotek VCL i jej
komponenty, narzdzia systemu i metody programowania wizualnego, a po techniki
programowania grafiki, obsugi baz danych i aplikacji internetowych. Dziki zdobytej
wiedzy bdziesz mg byskawicznie przej od tradycyjnych metod programowania
do projektowania i programowania wizualnego.
Czytajc j:
Nauczysz si programowa w jzyku C++
Poznasz programowanie zorientowane obiektowo
Zapoznasz si z elementami rodowiska systemu C++Builder 6
oraz bibliotek VCL
Zaznajomisz si ze sposobami byskawicznego prototypowania, budowy
i uruchamiania 32-bitowych aplikacji dla Windows 95 i Windows NT
Nauczysz si tworzy atrakcyjny interfejs uytkownika do swoich aplikacji
Zapoznasz si z zaawansowanymi technikami programowania, jak obsuga
wyjtkw i komunikatw, wykorzystanie rejestru czy udostpnianie polece
Poznasz metody programowania grafiki, obsugi baz danych, tworzenia
aplikacji internetowych, wasnych komponentw i bibliotek DLL
Autor ksiki, Kent Reisdorph, kieruje zespoem programistw w firmie TurboPower
Software w Colorado Springs. Wsppracuje on take z firm Borland, biorc udzia
w pracach grupy doradczej o nazwie TeamB jako niezaleny programista i konsultant.

Spis treci
O Autorze ........................................................................................ 13
Podzikowania................................................................................. 15
Witamy! .......................................................................................... 17
Na co zwraca uwag? ......................................................................................................18

Cz I ..........................................................................................19
Rozdzia 1. Pierwsze kroki w systemie C++Builder ............................................. 21
Czym jest C++Builder?.....................................................................................................21
IDE od pierwszego wejrzenia ...........................................................................................22
Ahoj, przygodo! ................................................................................................................25
To samo w wersji tekstowej ..............................................................................................27
Wprowadzenie do C++ .....................................................................................................33
Narodziny jzyka ........................................................................................................34
Zmienne ......................................................................................................................35
Typy danych w C++ ...................................................................................................36
Operatory ....................................................................................................................39
Funkcje........................................................................................................................41
Funkcja main() ............................................................................................................45
Tablice.........................................................................................................................48
Tablice znakowe .........................................................................................................50
Funkcje operujce na acuchach ...............................................................................52
Tablice acuchw ......................................................................................................54
Podsumowanie ..................................................................................................................55

Rozdzia 2. Wprowadzenie do C++ ..................................................................... 57


Jeeli..............................................................................................................................57
Ptle i ich zastosowania.....................................................................................................61
Ptla for.......................................................................................................................62
Ptla while...................................................................................................................65
Ptla do-while .............................................................................................................66
Instrukcja goto ............................................................................................................67
Instrukcje continue i break..........................................................................................68
Instrukcja switch ...............................................................................................................69
Zasig ................................................................................................................................71
Zmienne zewntrzne ...................................................................................................73

C++Builder 6 dla kadego


Struktury............................................................................................................................74
Tablice struktur ...........................................................................................................76
Pliki nagwkowe i pliki rdowe .............................................................................76
Struktury w akcji.........................................................................................................78
Podsumowanie ..................................................................................................................82

Rozdzia 3. Zaawansowane elementy C++.......................................................... 83


Wskaniki..........................................................................................................................83
Zmienne lokalne i dynamiczne ...................................................................................84
Obiekty dynamiczne a wskaniki ...............................................................................85
Jak to si ma do naszego programu?...........................................................................86
Dereferencja czyli wyuskanie....................................................................................88
Do dziea!....................................................................................................................89
Referencje..........................................................................................................................91
Przekazywanie parametrw przez wskanik i przez referencje ........................................94
Modyfikator const.......................................................................................................96
Operatory new i delete ......................................................................................................96
Operator new...............................................................................................................97
Operator delete............................................................................................................98
Rozwizanie zagadki ..................................................................................................99
Operatory new[ ] i delete[ ].......................................................................................100
Co mog funkcje w C++? ...............................................................................................100
Przecianie funkcji ..................................................................................................101
Parametry domylne funkcji .....................................................................................103
Funkcje skadowe klas ..............................................................................................104
Funkcje wstawiane....................................................................................................105
Co zrobi, gdy w danych jest bd?.................................................................................106
Podsumowanie ................................................................................................................108

Rozdzia 4. O klasach i programowaniu obiektowym ......................................... 109


Co to jest klasa?...............................................................................................................109
Anatomia klasy................................................................................................................110
Dostp do elementw klasy ......................................................................................111
Konstruktory .............................................................................................................113
Destruktory ...............................................................................................................116
Pola ...........................................................................................................................117
Funkcje skadowe......................................................................................................119
Wskanik this............................................................................................................121
A teraz przykad........................................................................................................124
Dziedziczenie ..................................................................................................................131
Dziedziczenie wielokrotne........................................................................................134
Wprowadzenie do operacji wejcia-wyjcia ...................................................................136
Odczytujemy dane ....................................................................................................137
Zapisujemy dane .......................................................................................................139
Ustalenie trybu otwarcia pliku ..................................................................................141
Obsuga plikw binarnych ........................................................................................142
Wskanik plikowy ....................................................................................................142
Swobodny dostp do pliku........................................................................................143
Podsumowanie ................................................................................................................145

Rozdzia 5. Biblioteki klas i komponenty .......................................................... 147


Kilka sw wprowadzenia ...............................................................................................147
Po co mi to wszystko?...............................................................................................148
W czym tkwi haczyk?...............................................................................................150
Biblioteki jako wzr projektowania i programowania obiektowego........................151

Spis treci

5
Wojny bibliotek...............................................................................................................151
Biblioteka Object Windows Library.........................................................................152
Biblioteka Microsoft Foundation Class Library .......................................................153
Co wiec wybra?.......................................................................................................154
Biblioteka Visual Component Library ............................................................................154
Komponenty..............................................................................................................155
Waciwoci, metody i zdarzenia..............................................................................156
C++Builder a biblioteka VCL .........................................................................................168
VCL dla praktykw C++ ..........................................................................................169
Wszystkie obiekty klas zdefiniowanych w VCL
musz by tworzone dynamicznie..........................................................................170
VCL nie dopuszcza domylnych parametrw funkcji ..............................................170
VCL nie umoliwia dziedziczenia wielokrotnego....................................................171
Implementacja acuchw w bibliotece VCL .................................................................171
Czy to naprawd jest potrzebne? ..............................................................................172
Szablon SmallString..................................................................................................173
Klasa AnsiString .......................................................................................................173
Typ zbiorowy ............................................................................................................177
Nieco wicej o bibliotece VCL .......................................................................................179
Klasy implementujce formularz i aplikacje ............................................................181
Klasy komponentowe................................................................................................181
To jeszcze nie koniec ............................................................................................186
Podsumowanie ................................................................................................................187

Rozdzia 6. Wicej o rodowisku systemu ........................................................ 189


Projekty w systemie C++Builder ....................................................................................190
Pliki wykorzystywane w projektach .........................................................................191
Moduy rdowe ......................................................................................................197
Menu gwne i paleta narzdzi........................................................................................199
Paleta komponentw i jej wykorzystanie........................................................................200
Umieszczenie kilku kopii komponentu na formularzu .............................................201
Wyrodkowanie komponentu na formularzu............................................................202
Menu kontekstowe palety komponentw .................................................................202
Nawigacja na palecie komponentw ........................................................................202
Object TreeView .............................................................................................................203
Wracamy do rzeczy, czyli aplikacja wielomoduowa.....................................................204
Kompilacja, czenie i budowa aplikacji ..................................................................207
Kompilacja innych programw w C++...........................................................................209
O formularzach nieco wicej...........................................................................................212
Formularz okna gwnego ........................................................................................212
Formularze okienek dialogowych.............................................................................212
Okienka dodatkowe a dialogi....................................................................................218
Aplikacje wielodokumentowe (MDI) .......................................................................218
Podstawowe waciwoci formularzy .......................................................................219
Metody formularzy ...................................................................................................223
Zdarzenia obsugiwane przez formularze .................................................................224
Inspektor obiektw..........................................................................................................226
Lista komponentw...................................................................................................227
Karta waciwoci .....................................................................................................228
Karta zdarze ............................................................................................................231
Przykadowa aplikacja MDI............................................................................................232
Podsumowanie ................................................................................................................241

C++Builder 6 dla kadego

Rozdzia 7. Edytor formularzy i edytor menu ..................................................... 243


Edytor formularzy i jego wykorzystanie.........................................................................243
Menu kontekstowe edytora formularzy ....................................................................244
Rozmieszczanie komponentw w formularzu ..........................................................245
Siatka edytora formularzy.........................................................................................246
Wybieranie komponentw ........................................................................................246
Przesuwanie komponentw ......................................................................................250
Zabezpieczenie komponentw przed przesuwaniem i zmian rozmiarw...............252
Zmiana porzdku gbokoci komponentw oraz ich kopiowanie,
wycinanie i wklejanie .............................................................................................252
Zmiana wielkoci komponentw ..............................................................................255
Wyrwnywanie komponentw .................................................................................257
Ustalanie porzdku wyboru komponentw ..............................................................267
Prosimy o menu! .............................................................................................................268
Tworzymy menu gwne ..........................................................................................269
Nieco programowania...............................................................................................278
Menu kontekstowe ....................................................................................................285
Tworzenie i zapamitywanie szablonw menu ........................................................286
Podsumowanie ................................................................................................................287

Cz II .......................................................................................289
Rozdzia 8. Komponenty biblioteki VCL ............................................................ 291
Nieco przypomnienia ......................................................................................................291
Waciwo Name ...........................................................................................................293
Waniejsze wsplne waciwoci komponentw............................................................295
Waciwo Align i Anchors ....................................................................................295
Waciwo Color .....................................................................................................295
Kursory .....................................................................................................................297
Waciwo Enabled .................................................................................................297
Waciwo Font.......................................................................................................298
Waciwo Hint .......................................................................................................300
Waciwoci ParentColor,ParentCtl3D, ParentFont, BarentBiDiMode
i ParentShowHint ...................................................................................................300
Caption, Text, Lines, Items.......................................................................................301
Waciwo Tag ........................................................................................................301
Inne waciwoci.......................................................................................................301
Podstawowe metody komponentw................................................................................302
Podstawowe zdarzenia obsugiwane przez komponenty ................................................303
Klasa TStrings .................................................................................................................304
Standardowe elementy sterujce systemu Windows.......................................................307
Komponenty edycyjne ..............................................................................................307
Listy ..........................................................................................................................309
Przyciski....................................................................................................................314
Etykiety .....................................................................................................................323
Paski przewijania ......................................................................................................323
Panele........................................................................................................................324
I wiele innych............................................................................................................324
Standardowe okienka dialogowe.....................................................................................325
Metoda Execute()......................................................................................................325
Okienka dialogowe otwarcia i zapisania pliku................................................................326
Okienka dialogowe otwarcia i zapisania pliku graficznego .....................................329
Okienko dialogowe wyboru koloru ..........................................................................330

Spis treci

7
Okienko dialogowe wyboru czcionki .......................................................................330
Okienka dialogowe wyszukiwania i zamiany...........................................................330
Podsumowanie ................................................................................................................331

Rozdzia 9. Tworzenie aplikacji w systemie C++Builder..................................... 333


Skadnica obiektw i jej wykorzystanie..........................................................................333
Dostp do zawartoci skadnicy obiektw................................................................334
Wykorzystanie zawartoci skadnicy obiektw ........................................................334
Tworzenie elementw aplikacji z uyciem skadnicy obiektw...............................338
Dodawanie obiektw do skadnicy ...........................................................................339
Dodawanie projektw do skadnicy..........................................................................341
Zarzdzanie zawartoci skadnicy...........................................................................341
Tworzenie formularzy i aplikacji z uyciem kreatorw..................................................343
Kreator dialogw ......................................................................................................344
Kreator aplikacji........................................................................................................345
Definiowanie funkcji skadowych i pl klasy .................................................................349
Deklaracje klas w systemie C++Builder...................................................................350
Szablony komponentw ..................................................................................................352
Wykorzystanie zasobw..................................................................................................355
Pakiety.............................................................................................................................361
Co to jest pakiet?.......................................................................................................362
czenie statyczne i dynamiczne..............................................................................363
adowanie dynamiczne pakietw.............................................................................365
Wykorzystywanie pakietw w aplikacjach...............................................................371
Tworzenie pakietu.....................................................................................................371
Dystrybucja aplikacji wykorzystujcych pakiety .....................................................372
Podsumowanie ................................................................................................................373

Rozdzia 10. O projektach nieco wicej.............................................................. 375


Bez projektu ani rusz.......................................................................................................375
Korzystanie z menedera projektw ...............................................................................375
Grupy projektw .......................................................................................................376
Okno menedera projektw ......................................................................................377
Tworzenie i korzystanie z grup projektw................................................................380
Budowa projektw i ich grup....................................................................................382
Konfiguracja projektu .....................................................................................................382
Karta Forms ..............................................................................................................383
Karta Application......................................................................................................385
Karta Compiler..........................................................................................................386
Karta Advanced Compiler ........................................................................................390
Karta C++ .................................................................................................................392
Karta Pascal ..............................................................................................................393
Karta Linker ..............................................................................................................393
Karta Advanced Linker.............................................................................................395
Karta Directories/Conditionals .................................................................................395
Karta Version Info ....................................................................................................397
Karta Packages..........................................................................................................398
Karta Tasm................................................................................................................399
Karta CORBA...........................................................................................................399
Edytor kodu .....................................................................................................................399
Podstawowe operacje na tekcie rdowym............................................................400
Zaawansowane funkcje edytora................................................................................406
Menu kontekstowe edytora kodu ..............................................................................410
Zmiana konfiguracji edytora.....................................................................................410
Podsumowanie ................................................................................................................416

C++Builder 6 dla kadego

Rozdzia 11. Debugger....................................................................................... 417


Po co uywa debuggera? ...............................................................................................418
Polecenia debuggera........................................................................................................418
Punkty wstrzymania ........................................................................................................419
Ustawianie i usuwanie punktw wstrzymania..........................................................420
Lista punktw wstrzymania ......................................................................................422
Bezwarunkowe punkty wstrzymania ........................................................................425
Warunkowe punkty wstrzymania .............................................................................425
Polecenie Run to Cursor ...........................................................................................426
Punkty przerwania nieprzerywajce pracy programu...............................................426
ledzenie zmiennych.......................................................................................................427
Podgld wyrae wskazanych kursorem.........................................................................427
Menu kontekstowe listy zmiennych ledzonych.............................................................428
Okno dialogowe ustawie ledzenia ...............................................................................429
Zawieszenie ledzenia zmiennej .....................................................................................431
Dodanie zmiennej do listy zmiennych ledzonych .........................................................431
Korzystanie z listy zmiennych ledzonych .....................................................................431
Inspektor danych .............................................................................................................434
Pozostae narzdzia uruchomieniowe .............................................................................436
Podgld i modyfikacja zmiennych............................................................................437
Stos wywoa funkcji................................................................................................438
Podgld rejestrw procesora .....................................................................................439
Lokalizacja adresw w kodzie rdowym...............................................................440
Praca krokowa...........................................................................................................440
Uruchamianie bibliotek DLL ..........................................................................................444
Raport uruchomieniowy..................................................................................................444
Okno widoku moduw...................................................................................................445
Techniki uruchomieniowe...............................................................................................445
Funkcja OutputDebugString() ..................................................................................445
CodeGuard ......................................................................................................................448
Wskazwki i rady............................................................................................................450
Konfiguracja debuggera ..................................................................................................451
Opcja Integrated debugging......................................................................................452
Zakadka General ......................................................................................................452
Zakadka Event Log..................................................................................................453
Zakadka Language Exceptions ................................................................................453
Zakadka OS Exceptions...........................................................................................454
Podsumowanie ................................................................................................................454

Rozdzia 12. Programy narzdziowe i konfiguracja IDE ........................................ 455


Edytor graficzny..............................................................................................................455
Kolor ta i atramentu .................................................................................................456
Funkcje graficzne edytora.........................................................................................458
Powikszanie rysunku...............................................................................................460
Dobr szerokoci linii i ksztatu pdzla ....................................................................460
Projektowanie map bitowych....................................................................................461
Projektowanie ikon ...................................................................................................462
Projektowanie kursorw ...........................................................................................464
Menu kontekstowe edytora graficznego ...................................................................465
Tworzenie plikw zasobw ......................................................................................465
Agent WinSight czyli szpiegostwo w Windows .............................................................467
Wymiana komunikatw w systemie Windows.........................................................468
Panel listy okien........................................................................................................469
Panel komunikatw...................................................................................................470

Spis treci

9
Jak ledzi okna?.......................................................................................................470
Filtrowanie komunikatw .........................................................................................471
Pozostae funkcje programu WinSight .....................................................................472
DOS-owe programy narzdziowe ...................................................................................474
GREP.EXE................................................................................................................474
COFF2OMF.EXE .....................................................................................................475
IMPLIB.EXE ............................................................................................................475
TOUCH.EXE ............................................................................................................476
TDUMP.EXE............................................................................................................476
Konfiguracja menu narzdzi ...........................................................................................478
Okno dialogowe konfiguracji narzdzi.....................................................................478
Konfiguracja rodowiska systemu ..................................................................................480
Karta Preferences ......................................................................................................480
Karta Designer ..........................................................................................................482
Karta Object Inspector ..............................................................................................482
Karta Library.............................................................................................................483
Karta Palette..............................................................................................................483
Karta Environment Variables ...................................................................................484
Karta Type Library ...................................................................................................484
Karta ClassExplorer ..................................................................................................485
Karta CORBA...........................................................................................................485
Karta C++ Builder Direct .........................................................................................485
Karta Internet ............................................................................................................485
Podsumowanie ................................................................................................................486

Cz III ......................................................................................487
Rozdzia 13. Programowanie operacji graficznych ............................................... 489
Grafika minimalnym kosztem.........................................................................................489
Konteksty urzdze i klasa TCanvas ..............................................................................490
Obiekty GDI....................................................................................................................492
Pira, pdzle i czcionki .............................................................................................493
Ograniczanie obszaru rysowania ..............................................................................498
Podstawowe operacje graficzne ......................................................................................499
Rysowanie tekstu ......................................................................................................500
Rysowanie map bitowych .........................................................................................505
Mapy bitowe przechowywane w pamici .......................................................................506
Mapy bitowe typu DIB....................................................................................................511
Podsumowanie ................................................................................................................515

Rozdzia 14. Obsuga baz danych ....................................................................... 517


Wstp...............................................................................................................................517
Lokalne bazy danych ................................................................................................519
Bazy danych typu klient-serwer................................................................................519
Wielowarstwowa architektura baz danych ...............................................................520
Przegld technologii........................................................................................................521
ClientDataSet ............................................................................................................522
Borland Database Engine (BDE) ..............................................................................522
InterBase Express......................................................................................................523
dbExpress..................................................................................................................524
DbGo (ADOExpress)................................................................................................524
DataSnap ...................................................................................................................524
Wybr technologii dostpu do danych............................................................................525
Podejcie prototypowe ..............................................................................................525
Planowanie cyklu yciowego ................................................................................526

10

C++Builder 6 dla kadego


Poczenie z bazami danych .....................................................................................526
Tworzenie prostego formularza bazy danych ...........................................................528
Dodawanie kolejnych kontrolek bazodanowych ......................................................533
Relacja og-szczegy .............................................................................................535
Obsuga pl rekordw .....................................................................................................537
Waciwoci pl i komponent TField .......................................................................538
Edytor waciwoci pl .............................................................................................538
Modyfikowanie waciwoci pola.............................................................................541
Formatowanie pl przy uyciu masek edycyjnych...................................................543
Dostp do wartoci kolumny ....................................................................................544
Pola wyliczane ..........................................................................................................547
Pola przegldowe ......................................................................................................549
Weryfikacja danych wejciowych ............................................................................551
Zbiory danych .................................................................................................................553
Kontrolowanie wskanika biecego rekordu ..........................................................554
Edycja danych...........................................................................................................557
Ograniczanie zbiorw danych...................................................................................558
Wyszukiwanie rekordw ..........................................................................................560
Oznaczanie rekordw za pomoc zakadek ..............................................................561
Definiowanie wartoci domylnych pl....................................................................563
Podstawowe waciwoci, metody i zdarzenia zbiorw danych...............................564
Wsppraca z serwerami .................................................................................................565
Autoryzacja klienta ...................................................................................................567
Transakcje .................................................................................................................569
Komponent ClientDataSet...............................................................................................572
Borland Database Engine ................................................................................................580
Administrator BDE ...................................................................................................580
Instalacja BDE ..........................................................................................................587
Kreator formularzy baz danych ................................................................................588
Komponenty BDE.....................................................................................................593
Funkcje BDE API .....................................................................................................604
ActiveX Database Objects ..............................................................................................605
ADO w C++Builder..................................................................................................606
Standardowe sterowniki ADO ..................................................................................610
Argumenty poczenia ..............................................................................................610
TADOConnetion.......................................................................................................611
TADODataSet...........................................................................................................614
Excel jako baza danych.............................................................................................615
Dostp do danych za pomoc technologii dbExpress .....................................................619
Komponenty interfejsu dbExpress............................................................................620
Jak to dziaa w praktyce? ..........................................................................................621
Uzgadnianie bdw serwera ....................................................................................625
Rozpowszechnianie aplikacji z interfejsem dbExpress ............................................626
InterBase Express............................................................................................................627
Przegld komponentw InterBase Express...............................................................628
Technologia DataSnap ....................................................................................................634
Architektura wielowarstwowa ..................................................................................635
MIDAS i DataSnap ...................................................................................................637

Rozdzia 15. Budowa i wykorzystanie bibliotek DLL ............................................ 645


Nieco podstaw .................................................................................................................645
Czym jest biblioteka DLL?.......................................................................................646
Budowa biblioteki DLL ............................................................................................647
Po co mi biblioteki DLL? .........................................................................................653

Spis treci

11
Korzystanie z zawartoci bibliotek DLL.........................................................................656
adowanie bibliotek DLL do pamici ......................................................................656
Wywoywanie funkcji z bibliotek DLL ....................................................................657
Tworzenie biblioteki DLL...............................................................................................658
Eksportowanie i importowanie funkcji i klas ...........................................................659
Tajemnicze makro DLL_EXP ..................................................................................662
Tworzenie biblioteki DLL za pomoc skadnicy obiektw ......................................663
Generacja pliku biblioteki importowej .....................................................................667
Budowa aplikacji wykorzystujcej bibliotek DLL........................................................667
Doczanie pliku nagwkowego biblioteki do kodu rdowego............................668
Doczanie biblioteki importowej do projektu .........................................................668
Formularze w bibliotekach DLL .....................................................................................669
Wywoywanie formularza z biblioteki przez aplikacje
napisan w systemie C++Builder ...........................................................................669
Wywoywanie formularza MDI z biblioteki dynamicznej .......................................671
Wywoywanie formularza z biblioteki przez aplikacj
utworzon za pomoc innego kompilatora.............................................................673
Umieszczanie zasobw w pliku DLL..............................................................................674
Utworzenie biblioteki zasobw.................................................................................675
Wykorzystywanie biblioteki zasobw ......................................................................676
Rnice pomidzy BPL a DLL .......................................................................................677
Jeszcze troch na temat DLL ....................................................................................677
Czym rni si pakiet od biblioteki DLL?................................................................678
Podsumowanie ................................................................................................................680

Rozdzia 16. XML .............................................................................................. 681


Czym jest XML? .............................................................................................................681
Co to s znaczniki? ...................................................................................................682
Rozszerzalno XML-a.............................................................................................683
Podstawowe reguy skadni XML ...................................................................................684
Przetwarzanie dokumentw XML Interfejsy SAX i DOM.............................................686
SAX Simple API for XML ..................................................................................687
DOM Document Object Model ...........................................................................687
Komponent XMLDocument ...........................................................................................688
Interfejsy IDOMDocument i IXMLDocument.........................................................689
Aplikacja Interfejsy_XMLDocument .......................................................................692
Obsuga bdw skadni w dokumencie XML..........................................................696
Inne metody poruszania si po drzewie, dodawanie wezw ...................................697
XML Data Binding Wizard.............................................................................................697
Korzystanie z XML Data Binding Wizard ...............................................................700
XML Mapper...................................................................................................................704
Generowanie plikw transformacji...........................................................................706
Co dalej? ...................................................................................................................707
XMLTransform ...............................................................................................................707

Rozdzia 17. Tworzenie aplikacji internetowych .................................................. 709


Co to s aplikacje internetowe?.......................................................................................710
Rodzaje aplikacji .............................................................................................................710
Komunikacja aplikacji klienckiej z serwerem ..........................................................711
Wsppraca aplikacji klienckiej i aplikacji serwerowej............................................713
Aplikacje internetowe w Builderze...........................................................................713
Aplikacje klienckie..........................................................................................................713
Wykorzystywanie poczty..........................................................................................713
Klient ftp ...................................................................................................................723
Przegldanie stron.....................................................................................................725

12

C++Builder 6 dla kadego


Aplikacje serwerowe .......................................................................................................727
Troch teorii..............................................................................................................728
WebBroker................................................................................................................731
WebSnap ...................................................................................................................751
Uruchamianie aplikacji ISAPI/NSAPI/DSO ............................................................762
Debugowanie aplikacji serwerowych .......................................................................764
Uycie usug sieciowych.................................................................................................766
Przykad korzystania z usug ....................................................................................768
Podsumowanie ................................................................................................................772

Dodatki .......................................................................................773
Skorowidz...................................................................................... 775

Rozdzia 13.

Programowanie
operacji graficznych
Programowanie grafiki naley do milszych elementw rzemiosa programistycznego.
Niniejszy rozdzia stanowi wprowadzenie do programowania operacji graficznych
systemie C++Builder. Wiksza cz rozdziau powicona bdzie omwieniu klas
 i 
 . Na pocztek przedstawimy kilka elementarnych metod prezentacji
grafiki w aplikacjach, tworzonych w systemie C++Builder, natomiast w dalszej czci
rozdziau powiemy kilka sw o interfejsie GDI (Graphics Device Interface) i jego
skadnikach. Niejako po drodze zapoznasz si z rnorodnymi metodami wywietlania linii, figur geometrycznych i map bitowych. Ostatni cz rozdziau powicimy
wykorzystaniu map bitowych przechowywanych w pamici.

Grafika minimalnym kosztem


Programowanie grafiki bywa czasem atwiejsze, ni przypuszczasz. Jeli np. musisz
wywietli na formularzu obrazek lub prost figur geometryczn, moesz uy w tym
celu odpowiedniego komponentu z biblioteki VCL. Zanim zatem przejdziemy do powanego programowania, przyjrzyjmy si gotowym komponentom i moliwociom ich
wykorzystania.
Aby wywietli na formularzu prost figur geometryczn, moesz wykorzysta komponent  . Narysowanie figury sprowadza si w takim przypadku do umieszczenia
komponentu na formularzu i odpowiedniej zmiany waciwoci  ,  i  .
Sposb ten pozwala na atwe krelenie k, elips, kwadratw, prostoktw i prostoktw z zaokrglonymi wierzchokami. Kolor ta figury mona modyfikowa poprzez
zmian waciwoci  , natomiast za pomoc waciwoci  mona zmienia
kolor i grubo linii tworzcej kontur figury.
Prezentacj mapy bitowej na formularzu umoliwia komponent 
. Komponent ten
jest idealnym narzdziem do realizacji wielu operacji graficznych, takich jak np. umieszczenie wzoru ta na formularzu. Wywietlana przez komponent 
 mapa bitowa

490

Cz III

definiowana jest poprzez waciwo   typu  . W fazie projektowania
ustalenie, jaka bitmapa bdzie przez komponent wywietlana, dokonuje si za pomoc
inspektora obiektw, natomiast w trakcie pracy programu mona to zrobi np. tak:



"".

Waciwo   kontroluje skalowanie mapy bitowej wywietlanej przez komponent,


natomiast za pomoc waciwoci    moesz nakaza komponentowi dostosowanie swoich rozmiarw do wielkoci bitmapy. Waciwo   umoliwia wyrodkowanie mapy bitowej w obrbie komponentu.
Na koniec tego punktu warto jeszcze wspomnie o komponencie  , umoliwiajcym rysowanie na ustalonym obszarze (wycinku) formularza. Jedyn godn uwagi
waciwoci komponentu   jest waciwo , bdca obiektem klasy
. Poniewa to wanie  jest klas umoliwiajc wykonywanie wikszoci
operacji graficznych w aplikacjach, tworzonych w systemie C++Builder, jej omwieniu
powicimy kilka kolejnych stron.

Konteksty urzdze i klasa TCanvas


Obszar (ang. canvas ptno), na ktrym rysowane s obiekty, okrelany jest w terminologii Windows mianem kontekstu urzdzenia (ang. device context). Pojcie to pojawio si ju w rozdziale 13. podczas omawiania operacji drukowania. Wykorzystujc
konteksty urzdze, moesz realizowa operacje graficzne m.in.:
 w obszarze roboczym lub ramce okienka,
 na pulpicie Windows,
 w pamici,
 na drukarce i innych urzdzeniach graficznych.

Konteksty urzdze zwizane s rwnie z innymi elementami systemu, takimi jak


np. menu, ale zagadnienia te s do zoone, tote nie bdziemy si nimi zajmowa,
ograniczajc si do elementw wymienionych powyej.
Wykorzystanie kontekstw urzdze na poziomie Windows API est do skomplikowane. Na pocztek takiej operacji musisz uzyska od systemu aktualny uchwyt kontekstu (ang. device context handle). W nastpnej kolejnoci naley wybra odpowiedni
obiekt (czyli narzdzie do rysowania), jak np. piro (ang. pen), pdzel (ang. brush) czy
czcionk (ang. font), po czym nareszcie mona przystpi do rysowania. Po zakoczeniu krelenia musisz usun kontekst urzdzenia, jednak przedtem konieczne jest
usunicie wszystkich wybranych uprzednio obiektw. Niedopenienie tego obowizku
spowoduje zjadanie pamici przez aplikacj. Jak wida, stosowanie opisanego procesu
jest co najmniej kopotliwe.
Na szczcie biblioteka VCL daje programicie do dyspozycji klas , radykalnie
uatwiajc korzystanie z kontekstw urzdze. Aby nie by goosownym, pokamy,

Rozdzia 13. Programowanie operacji graficznych

491

jak wyglda kod wykrelajcy w obszarze danego okna czerwone koo o niebieskim
konturze. Najpierw wersja wykorzystujca wywoania Windows API:
  !" #
$%&  ' ! &
 ' $"())*+*+#
 ,- !   &.&/**$"+*+*())#
$%& ' !& /0   *  ' #
 ,- !& /0   * #
,
'  *(+*(+*(+*(+#
& /0   * ' #
& /0   * #
 /0  #
 /0   ' #
$'*  #

Powyszy kod wyglda jeszcze do prosto, ale atwo tutaj zapomnie np. o usuniciu
utworzonych uprzednio obiektw, czego rezultatem bdzie pochanianie zasobw systemowych przez nasz aplikacj. Porwnajmy powyszy fragment z jego VCL-owym
odpowiednikiem:
1' ' ! $#
1' !  #
1',
'(+*(+*(+*(+#

Kod ten jest nie tylko czytelniejszy, ale take bardziej odporny na bdy klasa 
sama dba o usunicie przydzielonych sobie zasobw, zwalniajc z tego obowizku
programist. Uycie klas biblioteki VCL jest wic nie tylko prostsze, ale i bezpieczniejsze ni wykorzystanie wywoa Windows API.
Klasa , reprezentujca obszar, na ktrym tworzony jest rysunek (inaczej ptno),
posiada sporo waciwoci i metod. Kilka z nich omwimy dokadniej w dalszej czci
rozdziau. Podstawowe waciwoci klasy  zestawiono w tabeli 13.1, natomiast
metody w tabeli 13.2.
Tabela 13.1. Podstawowe waciwoci klasy TCanvas
Waciwo

Przeznaczenie

 '

Okrela kolor i wzr wypenienia krelonych figur


$

Okrela prostokt ograniczajcy obszar rysowania. Wszystkie rysowane figury


bd obcinane na granicach tego obszaru. Waciwo ta moe by wycznie
odczytywana

23

Definiuje operacje bitowe wykorzystywane w trakcie rysowania


(kopiowanie, inwersja bitw, suma modulo 2 itd.)



Okrela krj i parametry czcionki uywanej do wyprowadzania tekstu



Zawiera uchwyt kontekstu urzdzenia zwizanego z ptnem



Definiuje kolor i styl linii krelonych na ptnie

 '

Zawiera wsprzdne aktualnego pooenia pira krelcego rysunek


4'

Oznacza tablic pikseli tworzcych ptno

492

Cz III

Tabela 13.2. Podstawowe metody klasy TCanvas


Metoda

Przeznaczenie

5

Kreli uk okrgu, uywajc aktualnie wybranego pira

 ' 2

Wywietla map bitow o przezroczystym tle

2$

Kopiuje fragment innego ptna na ptno z ktrym pracujemy

6

Kopiuje fragment mapy bitowej na ptno

,
'

Kreli elips, uywajc aktualnie wybranego pira i pdzla (wzoru wypenienia)




Wypenia obszar ptna zawierajcy piksel o podanych wsprzdnych i ograniczony


podanym kolorem. Do wypenienia takiego obszaru jest uywany aktualnie
wybrany pdzel


7

Kreli odcinek od biecego punktu do punktu o zadanych wsprzdnych

317

Ustala wsprzdne aktualnego pooenia pira

Kreli wycinek koa

2

Wykorzystujc aktualnie wybrane piro i pdzel, kreli wielobok o wsprzdnych


wierzchokw zadanych w postaci tablicy punktw

2


Wykorzystujc aktualnie wybrane piro, kreli lini aman o wsprzdnych


wierzchokw zadanych tablic punktw Linia nie jest automatycznie domykana

$ 

Kreli prostokt, uywajc aktualnie wybranego pira i pdzla

$ $

Kreli prostokt o zaokrglonych rogach, wypeniony wybranym wzorem

&  6

Kopiuje wybrany obszar mapy bitowej na ptno, skalujc jej zawarto tak,
by wypeni ni wybrany obszar docelowy

74 ,4 

Zwraca szeroko i wysoko (w pikselach) acucha przekazanego jej jako parametr.


Wielko pola tekstu jest obliczana na podstawie biecych ustawie czcionki

74 


Zwraca wysoko (w pikselach) acucha przekazanego jej jako parametr.


Wysoko tekstu jest obliczana na bazie biecych ustawie czcionki

74 /

Wypisuje na ptnie zadany tekst, wykorzystujc aktualnie wybran czcionk

74 $

Wypisuje tekst w obrbie prostoktnego obszaru ograniczajcego

Wymienione wyej waciwoci i metody reprezentuj zaledwie ma czstk (tak!)


moliwoci funkcjonalnych kontekstu urzdzenia w Windows. Na cae szczcie przytoczony zestaw metodzapewnia obsug mniej wicej 80 procent wszystkich czynnoci
zwizanych z programowaniem operacji graficznych. Zanim jednak przejdziemy do
szczegw zwizanych z klas , wypada powiedzie kilka sw o obiektach
wykorzystywanych w programowaniu grafiki w Windows.

Obiekty GDI
W skad interfejsu GDI (ang. Graphics Device Interface) systemu Windows wchodzi
cay szereg obiektw kontrolujcych dziaanie kontekstw urzdze. Do najczciej
uywanych obiektw GDI nale pira, pdzle i czcionki; z pozostaych obiektw
warto tu wspomnie o paletach, mapach bitowych i obszarach ograniczajcych. Na
pocztek przyjrzymy si pirom, pdzlom i czcionkom, natomiast w nastpnej kolejnoci omwimy bardziej zoone obiekty.

Rozdzia 13. Programowanie operacji graficznych

493

Pira, pdzle i czcionki


Obiekty te nie s szczeglnie skomplikowane. Ich krtki opis i sposb wykorzystania
w klasie  zosta przedstawiony poniej.

Pira
Piro (ang. pen) definiuje obiekt uywany do krelenia linii, przy czym pod pojciem
linia rozumiemy zarwno odcinek czcy dwa punkty, jak i krawd (fragment
obrysu) figury (prostokta, elipsy, wieloboku itp.). Ustawienia pira moemy kontrolowa, korzystajc z obiektu klasy , dostpnego we waciwoci  klasy .
Waciwoci klasy  zostay opisane w tabeli 13.3; klasa ta nie posiada adnych
zdarze ani metod godnych wzmianki.
Tabela 13.3. Waciwoci klasy TPen
Waciwo

Przeznaczenie



Definiuje kolor linii



Okrela uchwyt pira (). Waciwo ta uywana jest podczas bezporednich


wywoa funkcji GDI

3

Okrela rodzaj operacji bitowej wykonywanej podczas krelenia linii (kopiowanie,


inwersja bitw, suma modulo 2 itp.)

& 2

Okrela styl linii (ciga, przerywana, kropkowa, niewidoczna itp.)

8


Okrela szeroko linii w pikselach

Wykorzystanie wymienionych waciwoci nie wymaga w zasadzie komentarza. Za


pomoc poniszych instrukcji na ekranie zostanie nakrelona linia przerywana w kolorze czerwonym:
1' ! $#
1' & 2!'' #
1'317(+*(+#
1'
7(+*(+#

Aby sprawdzi dziaanie tych instrukcji, najprociej jest wstawi do formularza przycisk
i wpisa powyszy kod w funkcji obsugi zdarzenia . Kliknicie przycisku spowoduje wykonanie instrukcji, czyli wykrelenie linii w formularzu.
Opisana wyej metoda moe by rwnie uyta dla innych przedstawionych w tym
rozdziale przykadw. Zauwa jednak, e przysonicie okienka formularza i jego
ponowne wywietlenie powoduje usunicie utworzonego rysunku. Dzieje si tak
dlatego, i wykrelony rysunek jest tymczasowy i znika w chwili ponownego wyrysowania okienka formularza. Aby utrwali rysunek, powiniene umieci tworzce
go instrukcje w funkcji obsugi zdarzenia  formularza. W takim przypadku
kade danie ponownego wyrysowania formularza bdzie powodowao odtworzenie
rysunku.

494

Cz III

Warto zwrci uwag, e linie kropkowane i przerywane mog by krelone wycznie pirem o szerokoci 1 piksela. Z kolei styl , definiujcy lini niewidoczn,
pozwala na krelenie figur pozbawionych konturw.
Aby zbada waciwoci klasy , moesz umieci w formularzu komponent  
i odpowiednio zmodyfikowa jego waciwo . Trik ten pozwala m.in. na atwe
zbadanie efektw zmiany waciwoci  .

Pdzle
Pdzel (ang. brush) odpowiada za wypenienie wntrza wykrelonej figury. Kady krelony prostokt, elipsa czy te wielobok bdzie automatycznie wypeniany wzorem
i kolorem zdefiniowanym przez biecy pdzel. Warto tu podkreli, e wypenienie
wcale nie musi by jednolite. Chocia w wielu przypadkach tak wanie jest, odpowiednie zdefiniowanie pdzla umoliwia wypenienie wntrza figury regularnym wzorem
lub map bitow.
Do kontrolowania ustawie biecego pdzla suy waciwo  klasy ,
bdca obiektem klasy  . Podobnie jak w przypadku klasy , z naszego punktu
widzenia interesujce s jedynie waciwoci klasy, wyszczeglnione w tabeli 13.4;
metody i zdarzenia tej klasy nie maj wikszego zastosowania.
Tabela 13.4. Waciwoci klasy TBrush
Waciwo

Przeznaczenie




Definiuje map bitow uywan jako wzr wypenienia. W systemie Windows 95


maksymalny rozmiar mapy wynosi 88 pikseli



Definiuje kolor wypenienia



Okrela uchwyt pdzla ($%&). Waciwo ta uywana jest podczas


bezporednich wywoa funkcji GDI

& 2

Okrela styl pdzla. Predefiniowane style obejmuj m.in. wypenienie jednolite,


brak wypenienia oraz kilka uytecznych wzorw

Waciwo ! przyjmuje domylnie warto "  , co oznacza wypenienie jednolitym kolorem. Uycie wypenienia wymaga zmiany waciwoci ! na warto
okrelajc jeden z predefiniowanych wzorw (" , "# , "$,
" i "$, czyli kreskowanie poziome, pionowe i ukone oraz kratkowanie
i kratkowanie ukone). Za pomoc trzech przedstawionych poniej instrukcji mona
wykreli w formularzu koo wypenione wzorem kratkowanym pod ktem 45 stopni.
Wynik wykonania tych instrukcji przedstawia rysunek 13.1.
1' ' !  #
1' ' & 2!'
''#
1',
'(+*(+*((+*((+#

W przypadku wypenienia figury wzorem, waciwo  pdzla definiuje kolor


rysowanych przez niego linii. Z niezbyt jasnych powodw VCL automatycznie uywa
w takiej sytuacji przezroczystego ta, tak wic to wypenienia bdzie miao taki sam

Rozdzia 13. Programowanie operacji graficznych

495

Rysunek 13.1.
Koo wypenione
wzorem
kratkowanym

kolor, jak to okienka, w ktrym krelona jest wypeniana figura. Aby si o tym przekona, rzu okiem na rysunek 13.1 (zadanie to nieco utrudnia fakt, i rysunek prezentowany jest w tonacji szaroci, jednak uruchomienie programu powinno rozwia
Twoje wtpliwoci). Jeli chcesz jawnie wymusi kolor ta wypenienia, musisz niestety obej funkcj VCL przez bezporednie odwoanie do funkcji graficznych API.
Aby np. wypeni koo niebiesk kratk na biaym tle, powiniene uy nastpujcych
instrukcji:
1' ' !  #
1' ' & 2!'
''#
& 31'*/ 59%,#
& 1'* 8
#
1',
'(+*(+*((+*((+#

Wykonanie tych instrukcji spowoduje pojawienie si koa wypenionego niebiesk


kratk na biaym tle, co zilustrowano na rysunku 13.2.
Inn ciekaw funkcj pdzlajest moliwo zdefiniowania wzoru wypenienia za pomoc
mapy bitowej. Zanim to zagadnienie zostanie omwione, przyjrzyjmy si przykadowi:
1' ' 
!6"
'::7
#
1' ' 

; ;#
1',
'(+*(+*((+*((+#
 1' ' 
#

Rysunek 13.2.
Tym razem
wzr wypenienia
ma biae to

496

Cz III

Pierwsza instrukcja tworzy obiekt klasy 


 i przypisuje go do waciwoci 

pdzla. Musisz pamita, e ta ostatnia nie posiada adnej wartoci domylnej, tote
chcc j wykorzysta, musisz jawnie utworzy obiekt klasy 
 i wykona odpowiednie przypisanie. W drugim wierszu przykadu odczytujemy map bitow z pliku.
Mapa taka musi mie rozmiary 88 pikseli (moliwe jest uycie wikszej mapy, jednak
zostanie ona obcita do rozmiarw 88). Samo wykrelenie koa (elipsy) realizowane
jest w wierszu trzecim, natomiast ostatnia instrukcja usuwa zawarto waciwoci

 . Poniewa VCL nie zapewnia automatycznego usunicia bloku pamici, wskazywanego przez waciwo 
 pdzla, operacj t musisz wykona jawnie, w przeciwnym przypadku bowiem program bdzie nieodwracalnie zawaszcza pami. Efekt
wykonania naszego przykadu ilustruje rysunek 13.3.
Rysunek 13.3.
Uycie wzorca
wypenienia
zdefiniowanego
za pomoc
mapy bitowej

W niektrych przypadkach konieczne okazuje si uycie wypenienia pustego (przezroczystego), nie przesaniajcego ta, na ktrym krelona jest figura (rysunek 13.4).
W takiej sytuacji musisz ustawi waciwo ! pdzla na ". W ramach ilustracji dodajmy do rysunku, utworzonego w poprzednim przykadzie, jeszcze jedno koo,
umieszczone w rodku pierwszego i wypenione z uyciem stylu ":
1' 8
 !#
1' ' 
!6"
'::7
#
1' ' 

; ;#
1',
'(+*(+*((+*((+#
1' ' & 2!'#
1' 8
 !)#
1',
'<+*<+*<+*<+#
 1' ' 
#

Rysunek 13.4.
Koo o wypenieniu
przezroczystym

Rozdzia 13. Programowanie operacji graficznych

497

Bezporednie odwoania do funkcji Windows API umoliwiaj realizacj bardziej


wymylnych trikw, jednake moliwoci udostpniane przez VCL-ow klas 
okazuj si wystarczajce w wikszoci typowych zastosowa.

Czcionki
Pojcie czcionki (ang. font) jest Ci doskonale znane na kartach tej ksiki pojawiao
si wielokrotnie. Czcionki uywane przez klas  nie rni si niczym od czcionek wykorzystywanych na normalnych formularzach, natomiast waciwo % tej
klasy jest identyczna, jak w przypadku innych klas. Zmiana kroju lub parametrw
czcionki uywanej w operacjach graficznych moe wyglda np. tak:
1' -!; 
-6,;#
1' &
=!>#
1' & 2!1' & 2??@'#
1'74 / (+*(+*;36

;#

I to praktycznie wszystko. Wykorzystaniem czcionek zajmiemy si wkrtce, w podrozdziale pt. Rysowanie tekstu.

Mapy bitowe i palety


Pojcia map bitowych i palet jeszcze kilka lat temu byy zwizane ze sob do cile
i z reguy wystpoway cznie. Obiekty klasy 
 w systemie C++Builder pozwalaj na proste korzystanie z map bitowych (ang. bitmap) i atw realizacj zwizanych
z nimi operacji, takich jak np. odczyt z dysku i wywietlanie. Klas 
 miae
ju okazj zastosowa w programie Jumping Jack, o ktrym wspominano w rozdziale 9.
Zastosowanie klasy 
 jest bardzo szerokie i w pewnym stopniu zostanie omwione
w dalszej czci rozdziau, przy okazji dyskusji rysowania map bitowych i uycia map
przechowywanych w pamici. Ze wzgldu na spor zoono klasy 
 nie bdziemy w tym miejscu zajmowa si szczegowo jej waciwociami i metodami.
Palety (ang. palette) s urzdzeniami do kopotliwymi w uyciu i zrozumieniu.
Na szczcie dziki szybkiemu postpowi technologii w dziedzinie budowy ukadw
kart graficznych i dziki spadkowi cen, w typowych, najczciej dzi spotykanych
konfiguracjach komputerw palety s praktycznie niewykorzystywane.
Nawet jeli bdziecie musieli uwzgldni palety w swojej aplikacji, w wikszoci
przypadkw bdziecie mogli skorzysta z moliwoci klasy 
 , ktra zazwyczaj
potrafi obsugiwa palety w peni automatycznie. Zamiast wdawa si w rozwaania
teoretyczne, sprbujemy zademonstrowa rol palety na przykadzie. W tym celu utwrz
now aplikacj i wpisz w funkcji obsugi zdarzenia  formularza (lub 
przycisku) kod przytoczony poniej. Pamitaj, by w razie potrzeby poda waciw
ciek dostpu do pliku obrazka HANDSHAK.BMP (powinien on znajdowa si
w katalogu Borland Shared\Images\Splash\256Color). A oto i sam przykad:
"
'::7
A
!6"
'::7
#
BB
  !  #


; ' ;#
1'6+*+*
#
 
#

498

Cz III

Po uruchomieniu programu w 256-kolorowym trybie graficznym powiniene zobaczy


w formularzu adny obrazek. Zwr jednak uwag, e druga z kolei instrukcja zostaa
zamieniona w komentarz; jeli usuniesz znaki komentarza i uruchomisz program ponownie, okae si, e kolory wywietlonej mapy bitowej w niczym nie przypominaj oryginau. Efekt ten jest wynikiem zignorowania informacji zawartych w palecie kolorw
podczas wywietlania mapy bitowej. Dopiero uycie tych informacji gwarantuje poprawne odwzorowanie kolorw, zdefiniowanych w pliku, na palet systemow.
Mapy bitowe s bardzo istotnymi elementami programowania operacji graficznych,
tym niemniej zrozumienie ich funkcjonowania nie jest spraw atw i nie powiniene
si przejmowa, jeli pewne pojcia wydadz Ci si z pocztku niejasne. Wicej informacji na temat dziaania map bitowych i przykadw, wykorzystujcych takie mapy,
znajdziesz w dalszej czci rozdziau.

Ograniczanie obszaru rysowania


W celu ograniczenia obszaru przeznaczonego do rysowania moesz zdefiniowa odpowiedni obszar ograniczajcy (ang. clipping region). Niestety, waciwo & klasy
 daje si wycznie odczytywa, tote definiujc obszar ograniczajcy musisz
odwoa si bezporednio do funkcji Windows API. Aby zademonstrowa opisywan
technik, wykorzystamy poprzedni przykad, nieco zmodyfikowany:
"
'::7
A
!6"
'::7
#


; ' ;#
$"- $! $ $)+*)+*(++*(++#
& 
$1'* $#
1'6+*+*
#
 
#

Po uruchomieniu programu zawierajcego (w metodzie obsugi odpowiedniego zdarzenia) powyszy kod powiniene ujrze w okienku tylko fragment mapy bitowej.
Wywoanie funkcji   &'( tworzy i aktywuje na rysunku prostoktny obszar
ograniczajcy miejsce dostpne dla operacji rysowania obiektw graficznych o wsprzdnych wierzchokw (50, 50) i (200, 200). Co prawda, mapa bitowa jest nadal
wywietlana tam, gdzie poprzednio, jednak w wyniku naoenia na ni obszaru ograniczajcego, zewntrzne jej fragmenty zostaj obcite, a widoczna pozostaje wycznie
cz rodkowa.
Obszar ograniczajcy wcale nie musi mie ksztatu prostokta. Aby uatrakcyjni poprzedni przykad, zastp wywoanie funkcji  & &'( wierszem o nastpujcej treci:
$"- $! ,

$C+*C+*<+*<+#

Po uruchomieniu programu wywietlany w okienku fragment mapy bitowej powinien


mie ksztat koa (rysunek 13.5).
Sprbujmy jeszcze czego innego. Zastp definicj obszaru kolistego (eliptycznego)
nastpujc par instrukcji:
7 
 
 'D>E!FFG+*+H*F+*G+H*FG+*I+H*FI+*G+HH#
$"- $!  2$
 '*>*57,$-57,#

Rozdzia 13. Programowanie operacji graficznych

499

Rysunek 13.5.
Efekt uycia
eliptycznego obszaru
ograniczajcego

W tym przypadku definiowany obszar bdzie mia ksztat wieloboku, ktrego wierzchoki opisane s przez wsprzdne zawarte w tablicy  . Sam obszar tworzony
bdzie na podstawie zawartych w tablicy danych przez funkcj  !&'(.
Liczba wierzchokw moe by dowolna, a okrelanie punktu zamykajcego wielobok
jest zbdne (domknicie obrysu dokonywane jest automatycznie). Po uruchomieniu
programu powiniene uzyska efekt zilustrowany na rysunku 13.6.
Rysunek 13.6.
Obszar ograniczajcy
o ksztacie wieloboku

Obszary ograniczajce bywaj bardzo przydatne w realizacji niektrych operacji


graficznych. Co prawda nie uywa si ich zbyt czsto, jednak czasami okazuj si
niezastpione.

Podstawowe operacje graficzne


Z kilkoma procedurami krelenia elementarnych figur geometrycznych miae ju okazj
si spotka w poprzednich rozdziaach tej ksiki. Funkcje, z ktrymi do tej pory miae
do czynienia, realizuj krelenie prostoktw i kwadratw (& '(), k i elips
( '() oraz linii ('(, )'(). Z pozostaych, najczciej wykorzystywanych funkcji mona jeszcze wymieni '( oraz '(, rysujce odpowiednio uk
okrgu oraz wycinek koa. Krelenie prostych figur geometrycznych jest spraw elementarn, tote darujemy sobie tutaj szczegowe omawianie odpowiednich metod
klasy , prezentujc w zamian inne, nieco bardziej zoone (a czasem nawet
kopotliwe) operacje, z ktrymi moesz mie do czynienia podczas projektowania
aplikacji graficznych.

500

Cz III

Rysowanie tekstu
Zagadnienie to wyglda na pozr banalnie, jednak z pisaniem tekstu wie si kilka
trikw i haczykw, ktrych nieznajomo moe powanie skomplikowa ycie programisty. Na szczcie funkcje suce do rysowania tekstu mog Ci znacznie uatwi
t prac.

Metody TextOut() i TextRect()


Metoda   '( jest najprostszym narzdziem do krelenia napisw w okienku.
W zasadzie nie wymaga ona specjalnego omawiania argumentami jej wywoania
s wsprzdne X i Y rysowanego tekstu oraz, oczywicie, on sam. Wyglda to tak:
1'74 / (+*(+*"J 6"@@

"#

Powysza instrukcja wywietla zadany acuch, poczynajc od punktu o wsprzdnych


(*+, *+), przy czym wartoci te okrelaj pooenie lewego grnego (a nie dolnego)
wierzchoka obszaru zajtego przez tekst. Aby zilustrowa wykorzystanie wsprzdnych, wprowad i wykonaj nastpujce instrukcje:
1'74 / (+*(+*"7 00' "#
1'317(+*(+#
1'
7++*(+#

Po napisaniu zadanego tekstu w punkcie o wsprzdnych (*+, *+), w naszym programiku narysowany zostanie poziomy odcinek, rozpoczynajcy si w tym samym punkcie.
Jak przedstawiono na rysunku 13.7, efektem wykonania przykadu bdzie umieszczenie
poziomej kreski nad wypisanym w okienku tekstem.
Rysunek 13.7.
Tekst utworzony
za pomoc funkcji
TextOut()

Metoda   '( sprawdza si w sytuacjach, gdy wielko obszaru zajmowanego


przez tekst nie jest spraw krytyczn. Jeli tekst musi zmieci si w okrelonym
obszarze, lepiej jest wykorzysta metod  & '(, pozwalajc na zdefiniowanie
prostokta ograniczajcego obszar napisu. W takiej sytuacji fragment tekstu, wykraczajcy poza zdefiniowany obszar, zostanie obcity. Dziaanie metody  & '(
ilustruje poniszy przykad, w ktrym obszar, zajty przez tekst, ograniczono do szerokoci 100 pikseli:
1'74 $ $ (+*)+*(+*<+*(+*)+*;& 
'  0
 26;#

Rozdzia 13. Programowanie operacji graficznych

501

Metoda   '(, podobnie jak  & '(, pozwala na tworzenie pojedynczych
wierszy tekstu. Zbyt dugie wiersze nie s automatycznie amane.
Tekst, zawierajcy znaki tabulacji, rysuje si za pomoc funkcji Windows API
""   '(.

To napisu
Jeli rzucisz okiem na rysunek 13.7, przekonasz si, e tekst napisany zosta na tle, ktre
ma kolor taki, jak kolor ta okna. Kolor ta tekstu ustalany jest na podstawie biecych
ustawie pdzla (domylnie specyfikujcych to w kolorze okna). Aby wpyn na kolor
ta dla rysowanych tekstw, naley zmieni kolor zdefiniowany dla pdzla (mona te
uczyni to tekstu przezroczystym).
Aby wykorzysta to przezroczyste, naley posuy si wasnoci ! komponentu
 ilustruj to ponisze instrukcje:
7 ' & 2& 2#
& 2!1' ' & 2#
1' ' & 2!'#
1'74 / (+*)*;-
'K6
=2;#
1' ' & 2!& 2#

Po zachowaniu biecego ustawienia stylu pdzla moemy nada mu warto ",


definiujc to przezroczyste. Po wywietleniu napisu naley oczywicie przywrci
pierwotne ustawienie ta (stylu pdzla). Zachowanie oryginalnego ustawienia stylu
przed jego zmian i przywracanie go po napisaniu tekstu jest rutynow czynnoci,
ktr powiniene sobie szybko przyswoi. Uycie przezroczystego ta w kolejnych
operacjach graficznych jest raczej mao prawdopodobne, tote najlepiej przywrci
pierwotny styl pdzla niezalenie od dalszych jego modyfikacji.
Wykorzystanie przezroczystego ta ma jeszcze jedn zalet. Wyobra sobie, e chcesz
wywietli tekst naoony na map bitow. W takim przypadku z powodw estetycznych jednolite to tekstu raczej nie jest stosowane, mona natomiast wykorzysta to
przezroczyste. Opisywan sytuacj ilustruje poniszy przykad (plik FACTORY.BMP
znajdziesz w katalogu Borland Shared\Images\Splash\256Color).
"
'::7
A
!6"
'::7
#


;@ 2;#
1'6+*+*
#
1' -!;5
,;#
1' &
=!C#
7 ' & 2& 2#
& 2!1' ' & 2#
1' ' & 2!'#
1'74 / (+*)*;7L== =2' ;#
1' ' & 2!& 2#
1' ' ! 8
#
1'74 / (+*C+*;7L
== =2' ;#
 
#

502

Cz III

Pierwsza grupa instrukcji w powyszym przykadzie umieszcza w okienku map bitow,


natomiast kolejne wiersze su do utworzenia na jej tle tekstu, najpierw z wykorzystaniem ta przezroczystego, a nastpnie ta standardowego o kolorze ta okna. Efekt
wykonania powyszego programu zilustrowano na rysunku 13.8. Nie trzeba chyba nikogo
przekonywa, e tekst umieszczony na przezroczystym tle wyglda o wiele lepiej.
Rysunek 13.8.
Tekst naoony
na map bitow
z uyciem ta
przezroczystegoi
nieprzezroczystego

Inne zastosowanie przezroczystego ta podczas tworzenia tekstu opisano w rozdziale 13.


(w punkcie pt. Panele rysowane przez waciciela). By moe pamitasz, e trjwymiarowy efekt wywietlania tekstu na pasku statusowym zosta osignity przez
narysowanie napisu w kolorze biaym, a nastpnie z lekkim przesuniciem szarym.
Uzyskanie zamierzonego wygldu nie byoby przy tym moliwe bez uycia przezroczystego ta. Wynika z tego, e omwiony mechanizm okazuje si czasem niezbdnym
i jedynym sposobem uzyskania planowanego efektu wizualnego.

Funkcja DrawText()
Dostpna w zestawie Windows API funkcja $, '( oferuje programicie znacznie
wiksze moliwoci wykrelania tekstu w okienku, anieli omwiona wczeniej metoda
  '(. Z niewiadomych przyczyn klasa  nie implementuje metody bdcej
odpowiednikiem $, '(, tote aby wykorzysta wszystkie zalety tej ostatniej, musisz
odwoa si bezporednio do API systemu Windows. Nie jest to specjalnie trudne, ale
wie si z kilkoma niedogodnociami, z ktrymi, niestety, trzeba si pogodzi. Zanim
jednak przejdziemy do szczegowego omwienia moliwoci funkcji $, '(,
zaprezentujmy may przykad:
$,7 !$ (+*(+*((+*G+#
1' ' ! 8
#
1'$ (+*(+*((+*G+#
674 1'*; =2L M2
@  0
674 ;*
*N *7.&-",-,O7.P,-7,$O7.,-7,$#

Wynik wykonania powyszych instrukcji (wraz z instrukcjami z dwch kolejnych


przykadw) przedstawiony zosta na rysunku 13.9.
Pierwsza, instrukcja z przedstawionego wyej przykadutworzy struktur typu &,
i inicjalizuje j wartoci zwracan przez funkcj & '( Windows API. Zdefiniowany
w ten sposb prostokt jest nastpnie rysowany, co pozwala na wizualizacj obszaru,
w ktrym zostanie umieszczony tekst. Ta ostatnia czynno realizowana jest za pomoc
wywoania funkcji $, '(, ktrej obecnie powicimy kilka sw.

Rozdzia 13. Programowanie operacji graficznych

503

Rysunek 13.9.
Kilka zastosowa
funkcji DrawText()

Pierwszy parametr funkcji $, '( okrela kontekst urzdzenia, na ktrym zostanie
narysowany tekst. W przypadku obiektu klasy  uchwyt odpowiadajcego mu
kontekstu okrela waciwo  , tote wanie jej zawarto przekazujemy jako
pierwszy parametr wywoania $, '(. Drugim parametrem jest wywietlany acuch, natomiast liczba wywietlanych znakw okrelana jest przez trzeci parametr
(nadanie mu wartoci 1 powoduje wywietlenie wszystkich znakw acucha). Czwarty
parametr funkcji $, '( jest wskanikiem struktury typu &; przekazywanie tego
parametru przez wskanik jest konieczne, gdy w niektrych przypadkach moe on
zosta zmodyfikowany w wyniku wywoania funkcji.
Istot programu stanowi ostatni parametr funkcji, przeznaczony do przekazywania
znacznikw kontrolujcych sposb rysowania tekstu. W cytowanym wyej przykadzie
uylimy opcji $- .)), $-#& i $-&, nakazujc w ten sposb systemowi narysowanie pojedynczego wiersza tekstu wyrodkowanego w pionie i w poziomie. czna liczba opcji, ktrych mona uywa dla funkcji $, '( wynosi okoo 20;
nie bdziemy omawia ich wszystkich, odsyajc zainteresowanych Czytelnikw do
systemu pomocy Win32 API.
Przytoczony wyej przykad ilustruje najbardziej typowe zastosowanie funkcji $/
, '(, sprowadzajce si do rysownaia odpowiednio wyrodkowanego tekstu. Moliwo taka jest niezwykle przydatna podczas tworzenia komponentw rysowanych przez
waciciela, szczeglnie przy tworzeniu list zwykych, rozwijanych i menu, w ktrych
nader czsto wykorzystywane jest rodkowanie tekstu w jednej lub obu osiach. By
moe wszystko to brzmi w tej chwili do goosownie, ale gdy tylko zaczniesz posugiwa si komponentami rysowanymi przez waciciela, z pewnoci docenisz zalety
funkcji $, '(.
Innym godnym uwagi znacznikiem uywanym przez funkcj $, '( jest $-$))  . Jeli wywietlany tekst jest zbyt dugi, by mg si w caoci zmieci w zadanym prostokcie, jego kocwka jest obcinana i zastpowana znakiem wielokropka.
Przykadowo, wykonanie poniszych instrukcji:
 !$ (+*++*(+*)+#
674 1'*;70' =L 

';*
*N *7.,-., &&O7.3/Q&7$-"#

spowoduje wywietlenie tekstu


70' =

504

Cz III

Jeli przewidujesz, e tekst moe nie zmieci si w przeznaczonym dla niego polu,
moesz uy znacznika $-$-))  , aby unikn obcicia tekstu w poowie wyrazu.
Kolejnym bardzo uytecznym znacznikiem jest $-)&, ktrego uycie nakazuje
funkcji $, '( okrelenie wielkoci prostoktnego obszaru potrzebnego do wywietlenia caoci tekstu. W przypadku uycia znacznika $-)& wywoanie naszej
funkcji nie spowoduje wywietlenia tekstu, a jedynie modyfikacj wsprzdnych,
przekazanych w czwartym parametrze. Efektem takiego wywoania bdzie modyfikacja pl " 
i  struktury typu & przekazywanej jako parametr. Rozwizanie
takie pozwala na narysowanie tekstu z podziaem na wiersze, czego przykad zosta
zademonstrowany poniej. Dziaanie przedstawionych instrukcji sprowadza si do
ustalenia wysokoci pola tekstu (szeroko jest ustalona), wyrysowania prostokta
o wsprzdnych ustalonych przez funkcj $, '( i narysowania tekstu wewntrz
prostokta. A oto i sam kod:
 !$ (+*)+*)+*(++#
& 
&!;5 0' 0'= =L M'=2
'* R2=' 
=
26
'=;#
674 1'*& .' *
*N *7.5$,7O7.8/$$,5J#
1' ' & 2!'&
#
1'$  @ *  * 
 *  #
1' ' & 2!'#
674 1'*& .' **N *7.8/$$,5J#

Zwr uwag na sposb przekazywania tekstu do funkcji $, '(: konieczno


uycia formy 0- '( wynika z faktu, i drugim parametrem funkcji musi by
wskanik tablicy znakw (obiekt typu  1), natomiast w naszym przykadzie tekst
przechowywany jest w obiekcie typu  . Konwersja zawartoci obiektu na
wskanik znakowy  1 dokonywana jest wanie za pomoc metody - '( klasy
 .
Sprbuj teraz umieci powyszy fragment kodu w funkcji obsugi zdarzenia  '(
formularza i dokona kilku dowiadcze z tak utworzonym programem, zmieniajc zawarto (czyli dugo) pisanego tekstu. Jak si przekonasz, wielko prostoktnego pola,
zawierajcego napis, bdzie za kadym razem dokadnie dostosowywana do aktualnej
dugoci napisu. Wynik wykonania naszego przykadu znajdziesz na rysunku 13.9.
Jeli moliwoci funkcji $, '( oka si dla Ciebie niewystarczajce, moesz
odwoa si do funkcji $, '(, ktrej omwienie znajdziesz w pliku pomocy
opisujcym funkcje Win32 API.

Rysowanie tekstu z uyciem funkcji $, '( jest nieco wolniejsze, ni w przypadku uycia metody   '(. Jeli zaley Ci na czasie wykonania programu,
powiniene odwoywa si raczej do metody   '(; co prawda bdziesz musia
zaprogramowa nieco wicej operacji samodzielnie, jednak z punktu widzenia optymalizacji algorytmu rozwizanie takie powinno by korzystniejsze. W wikszoci typowych przypadkw rnice czasowe pomidzy obiema funkcjami s do pominicia.

Rozdzia 13. Programowanie operacji graficznych

505

Funkcja $, '( jest bez wtpienia narzdziem uniwersalnym, a tym samym bardzo uytecznym, tote prawdopodobnie bdziesz j czsto wykorzystywa w swoich
programach.

Rysowanie map bitowych


Temat wyglda gronie, ale na szczcie jak miae ju okazj kilkakrotnie si przekona rysowanie map bitowych nie jest wcale zadaniem trudnym. Klasa 
oferuje Ci szereg zwizanych z tym zagadnieniem funkcji, z ktrych najczciej uywan jest metoda $,'(. Jej dziaanie sprowadza si do umieszczenia zawartoci mapy
bitowej (reprezentowanej przez obiekt klasy 
 , pochodnej od . ) w zadanym miejscu ptna. Na poprzednich stronach widziae ju kilka przykadw tej operacji,
ale jeden wicej nie zaszkodzi:
"
'::7
A
!6"
'::7
#


; :SS6
6'SS@' ;#
1'6+*+*
#
 
#

Cytowane wyej instrukcje tworz obiekt klasy 


 , umieszczaj w nim map
bitow odczytan z pliku FOREST.BMP i wywietla w okienku aplikacji (cilej
w jego lewym grnym rogu).
O ile metoda $,'( uywana jest do rysowania map bitowych bez dodatkowych modyfikacji, uycie metody   $,'( umoliwia przeskalowanie wywietlanej mapy
do zadanych wymiarw. Jeli prostokt definiujcy obszar docelowy jest wikszy od
oryginalnego rozmiaru mapy, ta ostatnia zostanie powikszona (rozcignita); jeli jest
on mniejszy mapa zostanie pomniejszona tak, by dopasowa si do zadanej wielkoci obszaru docelowego. Oto przykad:
"
'::7
A
!6"
'::7
#


; :SS6
6'SS@' ;#
7$  !$ +*+*++*)+#
1'&  6 *
#
 
#

Skalujc map bitow metoda   $,'( nie zachowuje oryginalnych proporcji.


W razie potrzeby musisz zadba o to sam.

Kolejn funkcj obsugujc wywietlanie map bitowych jest  !& '(, umoliwiajca zdefiniowanie zarwno obszaru docelowego, jak i rdowego, tj. fragmentu mapy,
ktry zostanie skopiowany. Pozwala to np. na podzia wywietlanego obrazka na mniejsze
prostoktne fragmenty, czego odzwierciedlenie znajdziemy w poniszym przykadzie:
"
'::7
A
!6"
'::7
#


;@ 2;#
' 
 ' 
'!G#

 ' 
&
=!

 B' 
'#
@
 
!+#
?' 
'#
TT

506

Cz III
F
7$ ' !$ +*
A' 
&
=*
8
 *
A' 
&
=T' 
&
=#

 4!8
 
8
 #

 2!
 ' 
&
=#
7$ ' !$ 4*2*4T
8
 *2T' 
&
=#
1'2$ ' *
1'*' #
H
 
#

Przedstawione wyej instrukcje odczytuj map bitow z pliku i dziel j na podune


pasy, ktre nastpnie zostaj rozmieszczone w losowo wybranych miejscach okienka.
Przykadowy wynik wykonania programu pokazano na rysunku 13.10. Jeli umiecisz
powyszy blok instrukcji w funkcji obsugi zdarzenia  '( formularza, zauwaysz,
e ukad paskw zmienia si kadorazowo po przesoniciu okienka pracujcej aplikacji i jego ponownym odsoniciu. Wynika to z faktu, e caa procedura wykonywana
jest kadorazowo w chwili powstania koniecznoci ponownego wyrysowania zawartoci okienka.
Rysunek 13.10.
Fragmenty mapy
bitowej rozoone
w przypadkowych
miejscach okienka
za pomoc funkcji
CopyRect()

Ostatni godn wzmianki metod rysowania mapy bitowej jest   !'(. Metoda
ta umoliwia zdefiniowanie prostoktnego obszaru rdowego i docelowego kopiowanej mapy bitowej oraz wybranie koloru, ktry bdzie traktowany jako przezroczysty.
Co prawda, zawarty w pliku pomocy opis metody   !'( zaleca uycie zamiast
niej komponentu typu 
) , jednak w wielu przypadkach okazuje si to przesad
  !'( spenia swoje zadanie rwnie dobrze, a jej wykorzystanie jest znacznie
atwiejsze. O metodzie tej powiniene pamita zwaszcza podczas operowania na
mapach bitowych uywajcych przezroczystego ta. W czci rozdziau, powiconej
bitmapom typu DIB, przyjrzymy si dokadniej funkcjonalnoci klasy 
 , pozwalajcej na stosowanie bitmap przezroczystych.

You might also like