You are on page 1of 18

Aplikacje w Visual C++

2005. Przykady
Autor: Mariusz Owczarek
ISBN: 978-83-246-0875-1
Format: B5, stron: 216

Bogaty zbir rozwiza czsto spotykanych


problemw programistycznych jzyka Visual C++
Poznaj rodowisko tworzenia programw w Visual C++ 2005
Naucz si skadni jzyka Visual C++
Wykorzystaj moliwoci platformy .NET w programach w Visual C++
W kontekcie programowania przy uyciu platformy .NET zwykle mwi si o jzykach
Visual Basic i C#. Wikszo stron internetowych, artykuw i ksiek dotyczcych
.NET zawiera kod napisany wanie w nich. Co maj zrobi programici, ktrzy od lat
uywaj C++ i wcale nie chc rezygnowa z jego licznych zalet? Czy jedynym wyborem
jest nauka nowego jzyka lub pozostanie poza wiatem programowania dla .NET?
Ksika Aplikacje w Visual C++ 2005. Przykady zawiera dziesitki krtkich zada
wraz z rozwizaniami, dziki ktrym byskawicznie zaczniesz wykorzystywa moliwoci
platformy .NET w programach pisanych w jzyku C++. Poznasz rodowisko Visual C++
2005 Express Edition oraz podstawowe skadniki aplikacji pisanych w Visual C++.
Nauczysz si midzy innymi obsugiwa dane, przetwarza pliki, korzysta z wtkw
oraz czy aplikacje z internetem. Dowiesz si take, jak wykona wiele innych
operacji niezbdnych w codziennej pracy programisty.

Wydawnictwo Helion
ul. Kociuszki 1c
44-100 Gliwice
tel. 032 230 98 63
e-mail: helion@helion.pl

rodowisko Visual C++ 2005 Express Edition


Elementy aplikacji jzyka Visual C++
Przetwarzanie i wywietlanie danych
Praca z plikami
Uywanie okien dialogowych
Programy wielowtkowe
Stosowanie grafiki w aplikacjach
Tworzenie programw uywajcych sieci
Skadnia jzyka Visual C++ w piguce
Przyspiesz wykonywanie codziennych zada programistycznych,
stosujc sprawdzone rozwizania

Rozdzia 1. rodowisko Visual C++ 2005 Express Edition ................................... 7


Jzyk C++ a .NET Framework .......................................................................................... 7
Od czego zacz? ............................................................................................................... 8
Podstawy obsugi rodowiska ............................................................................................ 8
Wygld rodowiska w trybie budowy aplikacji .............................................................. 11
Struktura projektu ............................................................................................................ 11
Klasa okna gwnego ....................................................................................................... 12

Rozdzia 2. Podstawowe elementy aplikacji ...................................................... 15


Gwne okno .................................................................................................................... 15
Przyciski .......................................................................................................................... 20
Etykiety ............................................................................................................................ 21
Pola tekstowe ................................................................................................................... 23
Wprowadzanie danych do aplikacji za pomoc pl tekstowych ..................................... 25
Wprowadzanie danych z konwersj typu ........................................................................ 26
Wywietlanie wartoci zmiennych .................................................................................. 28
Pole tekstowe z mask formatu danych ........................................................................... 28
Pola wyboru i przyciski opcji .......................................................................................... 31

Rozdzia 3. Menu i paski narzdzi ..................................................................... 39


Rodzaje menu .................................................................................................................. 39
Komponent MenuStrip .................................................................................................... 39
Menu podrczne .............................................................................................................. 45
Skrty klawiaturowe w menu .......................................................................................... 46
Paski narzdzi .................................................................................................................. 48

Rozdzia 4. Wprowadzanie i konwersja danych .................................................. 51


Wprowadzanie danych do aplikacji ................................................................................. 51
Prosta konwersja typw klasa Convert ....................................................................... 51
Konwersja ze zmian formatu danych ............................................................................. 52
Konwersja liczby na acuch znakowy ........................................................................... 55

Rozdzia 5. Tablice, uchwyty i dynamiczne tworzenie obiektw .......................... 57


Tablice ............................................................................................................................. 57
Uchwyty ........................................................................................................................... 62
Dynamiczne tworzenie obiektw operator gcnew ...................................................... 62
Dynamiczna deklaracja tablic .......................................................................................... 63

Aplikacje w Visual C++ 2005. Przykady

Rozdzia 6. Komunikacja aplikacji z plikami ...................................................... 65


Pliki jako rdo danych .................................................................................................. 65
Wyszukiwanie plikw ..................................................................................................... 66
Odczyt wasnoci plikw i folderw ............................................................................... 67
Odczyt danych z plikw tekstowych ............................................................................... 68
Zapisywanie tekstu do pliku ............................................................................................ 71
Zapis danych do plikw binarnych .................................................................................. 72
Odczyt z plikw binarnych .............................................................................................. 73

Rozdzia 7. Okna dialogowe ............................................................................. 75


Okno typu MessageBox ................................................................................................... 75
Okno dialogowe otwarcia pliku ....................................................................................... 77
Okno zapisu pliku ............................................................................................................ 79
Okno wyboru koloru ........................................................................................................ 80
Wybr czcionki ................................................................................................................ 81

Rozdzia 8. Moliwoci edycji tekstu w komponencie TextBox .......................... 83


Waciwoci pola TextBox .............................................................................................. 83
Kopiowanie i wklejanie tekstu ze schowka ..................................................................... 85
Wyszukiwanie znakw w tekcie .................................................................................... 85
Wstawianie tekstu midzy istniejce linie ....................................................................... 86
Elementy grafiki w polu tekstowym ................................................................................ 87

Rozdzia 9. Komponent tabeli DataGridView ...................................................... 89


Podstawowe waciwoci komponentu DataGridView ................................................... 89
Zmiana wygldu tabeli .................................................................................................... 92
Dopasowanie wymiarw komrek tabeli do wywietlanego tekstu ................................ 94
Odczytywanie danych z komrek tabeli .......................................................................... 96
Zmiana liczby komrek podczas dziaania aplikacji ..................................................... 100
Tabela DataGridView z komrkami rnych typw ..................................................... 103
Przyciski w komrkach DataGridViewButtonCell .................................................. 106
Komrki z polami wyboru DataGridViewCheckBoxCell ........................................ 108
Grafika w tabeli komrka DataGridViewImageCell ................................................ 109
Komrka z list rozwijan DataGridViewComboBoxCell ...................................... 110
Odnoniki internetowe w komrkach DataGridViewLinkCell ................................ 112

Rozdzia 10. Metody zwizane z czasem komponent Timer ........................... 115


Czas systemowy ............................................................................................................ 115
Komponent Timer .......................................................................................................... 117

Rozdzia 11. Grafika w aplikacjach Visual C++ .................................................. 119


Obiekt Graphics kartka do rysowania ...................................................................... 119
Piro Pen ........................................................................................................................ 124
Pdzle zwyke i teksturowane ........................................................................................ 126
Rysowanie pojedynczych punktw obiekt Bitmap .................................................. 129
Rysowanie trwae odwieanie rysunku ................................................................... 129
Animacje ........................................................................................................................ 131

Rozdzia 12. Podstawy aplikacji wielowtkowych ............................................. 133


Wtki ............................................................................................................................. 133
Komunikacja z komponentami z innych wtkw przekazywanie parametrw ....... 135
Przekazywanie parametrw do metody wtku .............................................................. 137
Klasa wtku przekazywanie parametrw z kontrol typu ........................................ 138
Komponent BackgroundWorker .................................................................................... 140

Spis treci

Rozdzia 13. Poczenie aplikacji z sieci internet ............................................. 145


Komponent WebBrowser .............................................................................................. 145
Przetwarzanie stron Web obiekt HtmlDocument ..................................................... 148
Protok FTP .................................................................................................................. 151
Pobieranie zawartoci katalogu z serwera FTP ............................................................. 153
Pobieranie plikw przez FTP ........................................................................................ 154
Wysyanie pliku na serwer FTP ..................................................................................... 155
Klasa do wysyania i odbierania plikw z FTP korzystajca z wtkw ........................ 157

Rozdzia 14. Dynamiczne tworzenie okien i komponentw ................................. 161


Wywietlanie okien klasa Form ............................................................................... 161
Komponenty w oknie tworzonym dynamicznie ............................................................ 162
Przesyanie danych z okien dialogowych ...................................................................... 163
Okno tytuowe aplikacji ................................................................................................. 164
Obsuga zdarze dla komponentw tworzonych dynamicznie ..................................... 165
Aplikacja zabezpieczona hasem ................................................................................... 167

Dodatek A Skondensowane C++ .................................................................... 169


Skorowidz .................................................................................... 201

Rozdzia 11.

Obiekt Graphics
kartka do rysowania
Wikszoci komponentw wizualnych VC++ zawiera waciwo Graphics, dziki ktrej
mona rysowa, wypisywa teksty i umieszcza na nich grafiki w postaci bitmapy.
Moesz pomyle o waciwoci Graphics jako o kartce czy ptnie, na ktrym mona
tworzy grafik.
Na pocztku po utworzeniu komponentu jego waciwo Graphics jest pusta. Przed
rozpoczciem rysowania trzeba stworzy obiekt typu Graphics i podpi do tej waciwoci. Dopiero na tym obiekcie mona rysowa. Do tworzenia obiektu Graphics suy
metoda CreateGraphics() wywoywana na komponencie, na ktrym chcemy rysowa.
Oprcz podoa do rysowania niezbdne s take obiekty klasy Pen i Brush, a do wywietlania tekstu take obiekt opisujcy czcionk typu Font.
Pen piro, jakim rysujemy.
Brush (pdzel) rodzaj wypenienia rysowanych obiektw (kolor, dese). Mamy dwa
rodzaje pdzli: SolidBrush to pdzel jednokolorowy, TextureBrush za wypenia obiekty

deseniem z podanej bitmapy.


Font okrela czcionk do rysowania napisw.

Zasad rysowania najlepiej wyjani prosty przykad.

120

Aplikacje w Visual C++ 2005. Przykady

Przykad 11.1.
Po naciniciu przycisku narysuj ukon niebiesk lini na oknie aplikacji.
Rozwizanie
Do nowego projektu aplikacji wstaw przycisk Button.
Po naciniciu przycisku naley utworzy obiekt typu Graphics dla gwnego okna
aplikacji, a nastpnie obiekt pira Pen. Poniewa metoda button1_Click() jest metod
klasy reprezentujcej gwne okno, odwoujemy si do tego okna za pomoc wskanika
this. Teraz mona ju rysowa po oknie, korzystajc z metody obiektu Graphics rysujcej linie. Oto kod metody, ktr naley przypisa do zdarzenia Click:
private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) {
Graphics^ g1=this->CreateGraphics();
Pen^ pioro = gcnew Pen(System::Drawing::Color::Aqua);
g1->DrawLine(pioro,10,10,100,100);
}

Po naciniciu przycisku na oknie pojawi si linia jak na rysunku 11.1.


Rysunek 11.1.
Rysowanie
na oknie aplikacji

Zauwa, e piro Pen i pdzel Brush nie s waciwociami obiektu Graphics, ale oddzielnymi obiektami.

Obiekt Graphics posiada wiele metod sucych do rysowania punktw, linii, figur,
a nawet wywietlania caych bitmap z plikw. Zestawienie metod klasy Graphics
podaje tabela 11.1.
Tabela 11.1. Wybrane metody rysujce obiektu Graphics
Metoda

Dziaanie

DrawLine(Pen^ pi,int x1,int y1,int x2,int y2)

Rysuje linie o pocztku w x1, y1 i kocu w x2, y2,


uywajc pira pi.

DrawArc(Pen^ pi,float x,float y,float szer,


float wys,float kt_start,float kt)

Wycinek okrgu lub elipsy rysowany pirem pi,


rodek w (x, y), uk mieci si w prostokcie
o wymiarach szer i wys, zaczyna si od kta
kt_start i biegnie przez kt stopni.

Rozdzia 11. Grafika w aplikacjach Visual C++

121

Tabela 11.1. Wybrane metody rysujce obiektu Graphics (ciag dalszy)


Metoda

Dziaanie

DrawBezier(Pen^ pi,float x1,float y1,float x2,


float y2,float x3,float y3,float x4,float y4)

Rysuje krzyw sklejan Beziera przez cztery


podane punkty.

DrawBeziers(Pen^ pi, array<System::Drawing:


:PointF>^ punkty)

Rysuje seri krzywych Beziera zgodnie z podan


tablic punktw.

DrawClosedCurve(Pen^ pi, array<System::Drawing:


:PointF>^ punkty)

Rysuje zamknit krzyw sklejan zgodnie


z podan tablic punktw.

DrawCurve(Pen^ pi, array<System::Drawing:


:PointF>^ punkty)

Rysuje krzyw sklejan (spline) midzy


punktami podanymi w tabeli.

DrawEllipse(Pen^ pi,float x, float y,


float szer, float wys)

Rysuje elips mieszczc si w prostokcie


okrelonym wsprzdnymi oraz wysokoci
i szerokoci.

DrawIcon(Icon^ ikona, int x, int y)

Rysuje ikon w podanych wsprzdnych.

DrawImage(Image^ obraz,int x,int y)

Rysuje bitmap obraz we wsprzdnych (x, y).

DrawPie(Pen^ pi,float x,float y,float szer,


float wys,float kt_start,float kt)

Rysuje wycinek koa pirem pi, rodek w (x, y),


wycinek mieci si w prostokcie o wymiarach
szer i wys, zaczyna si od kta kt_start
i biegnie przez kt stopni.

DrawPolygon(Pen^ pi, array<System::Drawing:


:PointF>^ punkty)

Tworzy zamknity wielobok o wierzchokach


okrelonych w tabeli punkty.

DrawRectangle(Pen^ pi,float x,float y,


float szer,float wys)

Rysuje prostokt o lewym grnym rogu


w punkcie (x, y) i bokach o dugoci szer i wys.

DrawString(String^ tekst,Font^ czcionka,


Brush^ pdzel, float x,float y)

Wypisuje tekst tekst z lewym grnym rogiem


w punkcie (x, y), uywajc podanej czcionki
i pdzla.

FillClosedCurve(Brush^ pdzel, array<System:


:Drawing::PointF>^ punkty)

Tworzy wypenion pdzlem pdzel zamknit


krzyw sklejan (spline) okrelona punktami
punkty.

FillEllipse(Brush^ pdzel, float x, float y,


float szer, float wys)

Rysuje elips w prostokcie okrelonym


wsprzdnymi (x, y) oraz wysokoci
i szerokoci wypeniona pdzlem pdzel.

FillPie(Brush^ pdzel, float x,float y,


float szer,float wys,float kt_start,float kt)

Maluje wypeniony pdzlem pdzel wycinek


koa, rodek w (x, y), wycinek mieci si
w prostokcie o wymiarach szer i wys, zaczyna
si od kta kt_start i biegnie przez kt stopni.

FillPolygon(Brush^ pdzel, array<System:


:Drawing::PointF>^ punkty)

Tworzy wypeniony pdzlem pdzel wielokt


o wierzchokach w tabeli punkty.

FillRectangle(Brush^ pdzel, float x,float y,


float szer,float wys)

Rysuje wypeniony pdzlem pdzel prostokt


o lewym grnym rogu w punkcie (x, y)
oraz podanej szerokoci i wysokoci.

Clear(Color kolor)

Czyci ca powierzchni rysunku i wypenia


j kolorem kolor.

Poniewa metod jest duo i kada ma kilka postaci, tabela 11.1 podaje tylko po jednej
postaci kadej metody, aby moliwe byo zestawienie wszystkich.

122

Aplikacje w Visual C++ 2005. Przykady

Przykad 11.2.
Wywietl w oknie programu tekst podany w polu tekstowym. Nie uywaj komponentu
Label.
Rozwizanie
Utwrz nowy projekt aplikacji i wstaw do okna pole tekstowe TextBox oraz przycisk

Button.

Po naciniciu przycisku zostanie utworzony pdzel typu SolidBrush (jednokolorowy)


i wypisany tekst z pola.
private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) {
Graphics^ g1=this->CreateGraphics();
g1->Clear(System::Drawing::Color::FromName("Control"));
SolidBrush^ pedzel = gcnew SolidBrush(System::Drawing::Color::DarkGreen);
System::Drawing::Font^ czcionka =
gcnew System::Drawing::Font(System::Drawing::FontFamily::GenericSansSerif,
14, FontStyle::Regular);
g1->DrawString(textBox1-> ext,czcionka,pedzel,10,i0);
}

Wynik dziaania aplikacji przedstawia rysunek 11.2.


Rysunek 11.2.
Rysowanie tekstu
w oknie aplikacji

Przykad 11.3.
Po naciniciu przycisku wywietl na formularzu wykres ze wsprzdnych podanych
w polach tekstowych.
Rozwizanie
Wstaw do okna aplikacji dziesi pl tekstowych TextBox, dwie etykiety Label i przycisk Button.
Powiksz wymiary okna, a pod waciwoci Text etykiet i przycisku podstaw odpowiednie teksty, tak aby cao wygldaa jak na rysunku 11.3 (na razie bez wykresu
i wpisanych wsprzdnych).

Rozdzia 11. Grafika w aplikacjach Visual C++

123

Rysunek 11.3.
Aplikacja
do rysowania
wykresw

Po naciniciu przycisku Rysuj wsprzdne bd pobierane z pl tekstowych i przekazywane do tablicy obiektw System::Drawing::PointF, ktre reprezentuj punkty
na paszczynie. Nastpnie narysujemy wykres za pomoc metody DrawCurve(). Pod
zdarzenie Click przycisku podepnij podan metod:
private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) {
Graphics^ g1=this->CreateGraphics();
g1->Clear(System::Drawing::Color::FromName("Control"));
array<System::Drawing::PointF>^ punkty = gcnew array
<System::Drawing::PointF>(i);
punkty[0].X=Convert:: oSingle(textBox1-> ext);
punkty[0].Y=(this->Height-30)-Convert:: oSingle(textBox2-> ext);
punkty[1].X=Convert:: oSingle(textBox3-> ext);
punkty[1].Y=(this->Height-30)-Convert:: oSingle(textBox4-> ext);
punkty[2].X=Convert:: oSingle(textBoxi-> ext);
punkty[2].Y=(this->Height-30)-Convert:: oSingle(textBox6-> ext);
punkty[3].X=Convert:: oSingle(textBox7-> ext);
punkty[3].Y=(this->Height-30)-Convert:: oSingle(textBox8-> ext);
punkty[4].X=Convert:: oSingle(textBox9-> ext);
punkty[4].Y=(this->Height-30)-Convert:: oSingle(textBox10-> ext);
Pen^ pioro1 = gcnew Pen(System::Drawing::Color::DarkGreen);
g1->DrawCurve(pioro1,punkty);
}

Przykad 11.4.
Po kadym naciniciu przycisku wywietl w oknie prostokt o losowych wsprzdnych, losowych wymiarach i losowym kolorze.
Rozwizanie
Do nowego projektu aplikacji wstaw przycisk Button.
Aby wygenerowa wsprzdne i kolor prostoktw, bdziemy potrzebowa generatora
liczb losowych. Jest to obiekt typu Random, ktry trzeba utworzy, a nastpnie mona
pobiera z niego liczby, uywajc metody Next() tego obiektu. Po wygenerowaniu
liczb prostokt rysujemy za pomoc metody FillRectangle(). Kolor pdzla definiujemy za pomoc trzech liczb losowych okrelajcych skadowe RGB. Oto metoda zdarzenia Click przycisku:

124

Aplikacje w Visual C++ 2005. Przykady


private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) {
Graphics^ g1=this->CreateGraphics();
Random^ liczba_los = gcnew Random();
System::Int32 x=liczba_los->Next(this->Width);
System::Int32 y=liczba_los->Next(this->Height);
System::Int32 wys=liczba_los->Next(this->Height);
System::Int32 szer=liczba_los->Next(this->Width);

SolidBrush^ pedzel = gcnew SolidBrush(


System::Drawing::Color::FromArgb(liczba_los->Next(2ii),
liczba_los->Next(2ii), liczba_los->Next(2ii)));
g1->FillRectangle(pedzel,x,y,wys,szer);

Przykad 11.5.
Wywietl w oknie plik rysunek.jpg z lewym grnym rogiem w punkcie (100, 100).
Rozwizanie
Wstaw do aplikacji przycisk Button.
Aby wywietli obrazek, najpierw utworzymy obiekt Image zawierajcy plik rysunek.jpg
(plik o takiej nazwie trzeba wczeniej umieci w folderze programu), a nastpnie wywietlimy go w oknie, uywajc metody DrawImage().
private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) {
Graphics^ g1=this->CreateGraphics();
Image^ obrazek = Image::FromFile("rysunek.jpg");
g1->DrawImage(obrazek,100,100);
}

Piro Pen
Uywany ju przez nas obiekt Pen, czyli piro, daje wiele moliwoci. Za porednictwem waciwoci tego obiektu mona sterowa zarwno gruboci linii, jak i rysowa
linie przerywane, wybiera styl rozpoczcia i zakoczenia linii itp. Najwaniejsze waciwoci przedstawia tabela 11.2.

Przykad 11.6.
Wywietl w oknie kilka linii rysowanych rnymi stylami.
Rozwizanie
Utwrz nowy projekt aplikacji i wstaw do niego przycisk Button.
Po naciniciu przycisku bdziemy zmienia parametry pira i rysowa nim kolejne
linie. Oto metoda dla zdarzenia Click przycisku:

Rozdzia 11. Grafika w aplikacjach Visual C++

125

Tabela 11.2. Niektre waciwoci obiektu Pen


Waciwo

Znaczenie

Width

Szeroko pira w punktach.

Brush

Pdzel, jakim rysowana jest linia.

Color

Kolor linii.

StartCap

Rodzaj znaczka dodawanego na rozpoczcie linii. Wartoci tej waciwoci s typu


System::Drawing::Drawing2D::LineCap, oto kilka z nich:
System::Drawing::Drawing2D::LineCap::Square linia z kwadratowym
zakoczeniem,
System::Drawing::Drawing2D::LineCap::ArrowAnchor linia ze strzak,
System::Drawing::Drawing2D::LineCap:: riangle linia z trjktem.

EndCap

Rodzaj zakoczenia linii, wartoci takie, jak w StartCap.

DashStyle

Ustawia lini przerywan. Wartoci to:


System::Drawing::Drawing2D::DashStyle::Dash linia z kresek,
System::Drawing::Drawing2D::DashStyle::DashDot linia skadajca si

z kresek i kropek,
System::Drawing::Drawing2D::DashStyle::DashDotDot linia z kreski i dwch

kropek,
System::Drawing::Drawing2D::DashStyle::Dot linia z kropek,
System::Drawing::Drawing2D::DashStyle::Solid linia ciga.
DashCap

Ustawia rodzaj zakoczenia elementw linii przerywanej. Wartoci to:


System::Drawing::Drawing2D::DashCap::Flat zakoczenie prostoktne,
System::Drawing::Drawing2D::DashCap:: riangle zakoczenie trjktne,
System::Drawing::Drawing2D::DashCap::Round zakoczenie zaokrglone.

DashOffset

Przesunicie wzoru kreskowanej linii wzgldem pocztku linii.


private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) {
Graphics^ g1=this->CreateGraphics();
Pen^ pioro1 = gcnew Pen(System::Drawing::Color::DarkGreen);
pioro1->StartCap = System::Drawing::Drawing2D::LineCap::RoundAnchor;
pioro1->EndCap = System::Drawing::Drawing2D::LineCap::ArrowAnchor;
pioro1->Width=4;
g1->DrawLine(pioro1,10,10,2i0,10);
pioro1->StartCap = System::Drawing::Drawing2D::LineCap::Square;
pioro1->EndCap = System::Drawing::Drawing2D::LineCap::Square;
pioro1->DashStyle = System::Drawing::Drawing2D::DashStyle::DashDotDot;
pioro1->DashStyle = System::Drawing::Drawing2D::DashStyle::DashDotDot;
pioro1->Color=System::Drawing::Color::DarkRed;
pioro1->Width=1;
g1->DrawLine(pioro1,10,30,2i0,30);
pioro1->DashStyle = System::Drawing::Drawing2D::DashStyle::Dash;
pioro1->Width=6;
pioro1->DashCap = System::Drawing::Drawing2D::DashCap:: riangle;
g1->DrawLine(pioro1,10,i0,2i0,i0);

126

Aplikacje w Visual C++ 2005. Przykady


pioro1->DashStyle = System::Drawing::Drawing2D::DashStyle::DashDot;
pioro1->Width=10;
pioro1->Color=System::Drawing::Color::Blue;
pioro1->DashCap = System::Drawing::Drawing2D::DashCap:: riangle;
g1->DrawLine(pioro1,10,70,2i0,70);
pioro1->DashOffset = 1;
g1->DrawLine(pioro1,10,90,2i0,90);

pioro1->DashOffset = 2;
g1->DrawLine(pioro1,10,110,2i0,110);

Efekt po naciniciu przycisku przedstawia rysunek 11.4.


Rysunek 11.4.
Dziaanie rnych
rodzajw pir

Pdzle zwyke i teksturowane


Pdzle s obiektami dwch klas potomnych klasy Brush, mianowicie SolidBrush
i TextureBrush. Pierwszy z nich to pdzel jednokolorowy, natomiast drugi maluje za
pomoc podanych bitmap (tekstur) i daje znacznie wiksze moliwoci.
Kolor pdzla SolidBrush ustawiamy, uywajc waciwoci Color tego obiektu.
Waciwoci pdzla TextureBrush przedstawia tabela 11.3.

Przykad 11.7.
Narysuj na oknie aplikacji dwa wycinki k, jeden wypeniony jednym kolorem i drugi
wypeniony tekstur pobran z pliku rysunek.jpg w uoeniu kafelkowym.
Rozwizanie
Utwrz nowy projekt aplikacji i wstaw do niego przycisk Button.
Po naciniciu tego przycisku utworzymy dwa pdzle: jednokolorowy i teksturowany,
a nastpnie wywietlimy wycinki k za pomoc metody FillPie(). Aby program dziaa, potrzebny jest rysunek rysunek.jpg w folderze programu.

Rozdzia 11. Grafika w aplikacjach Visual C++

127

Tabela 11.3. Waciwoci pdzla TextureBrush


Waciwo

Znaczenie

Image

Okrela bitmap (tekstur) pdzla.

WrapMode

Sposb wywietlania tekstury:


System::Drawing::Drawing2D::WrapMode:: ile tekstura wywietlana jest

ssiadujco (jak kafelki),


System::Drawing::Drawing2D::WrapMode::Clamp tekstura wywietlana jest

jako pojedyncza,
System::Drawing::Drawing2D::WrapMode:: ileFlipX wywietlanie ssiadujco

tekstury obrconej wzgldem osi X,


System::Drawing::Drawing2D::WrapMode:: ileFlipY jak wyej,

ale wzgldem osi Y,


System::Drawing::Drawing2D::WrapMode:: ileFlipXY jak wyej,

ale obrcenie wzgldem obu osi.


ransform

Okrela transformacje, jakim moe zosta poddana tekstura przed wywietleniem.


Moe to by skalowanie, obracanie lub pochylanie obrazu.
private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) {
Graphics^ g1=this->CreateGraphics();
Image^ obrazek = Image::FromFile("rysunek.jpg");
SolidBrush^ pedz = gcnew SolidBrush(System::Drawing::Color::DarkGreen);
extureBrush^ pedz_text = gcnew extureBrush(obrazek);
pedz_text->WrapMode=System::Drawing::Drawing2D::WrapMode:: ile;
g1->FillPie(pedz,i0,20,100,100,0,2i0);
g1->FillPie(pedz_text,180,20,100,100,0,2i0);
}

Po uruchomieniu i naciniciu przycisku aplikacja moe wyglda tak, jak na rysunku 11.5 (efekt jest zaleny od zawartoci rysunku uytego do teksturowania).
Rysunek 11.5.
Malowanie
pdzlem zwykym
i teksturowanym

Kafelkowe ukadanie tekstury jest opcj domyln, dlatego lini


pedz_text->WrapMode=System::Drawing::Drawing2D::WrapMode:: ile;

mona pomin i nie zmieni to efektu dziaania programu.

128

Aplikacje w Visual C++ 2005. Przykady

Zajmiemy si teraz waciwoci Transform umoliwiajc transformacje tekstury przed


jej wywietleniem. Waciwo ta moe przybiera wartoci typu System::Drawing:
:Drawing2D::Matrix, ktre s macierzami transformacji. Obiekt Matrix jest macierz 33,
a kada liczba w macierzy oznacza rodzaj transformacji obiektu. Struktur macierzy
nie bdziemy si tu zajmowa, poniewa do podstawowych operacji na tekturach jej
znajomo nie jest potrzebna. Operacje na macierzy mona wykonywa za pomoc
metod klasy Matrix. Tabela 11.4 przedstawia niektre z nich.
Tabela 11.4. Metody transformujce obiektu Matrix (macierzy transformacji)
Metoda

Znaczenie

Rotate(Single kt)

Obraca tekstur o kt stopni w prawo.

RotateAt(Single kt, PointF punkt)

Obraca tekstur o kt stopni, przy czym rodek obrotu


znajduje si w punkcie punkt.

Scale(Single skalaX, Single skalaY)

Skaluje tekstur; skalaX i skalaY to skale w kierunkach osi


X i Y. Warto 1 oznacza oryginalny rozmiar.

Shear(Single wspX, Single wspY)

Transformacja polegajca na obrocie paszczyzny rysunku


wok osi X lub Y.

ranslate(Single odlX, Single odlY)

Przesuwa tekstur o odlX i odlY punktw w kierunku


odpowiednich osi.

Przykad 11.8.
Narysuj kwadrat wypeniony tekstur z pliku rysunek.jpg w uoeniu kafelkowym,
tekstura ma by obrcona o 20 stopni i przesunita o 10 punktw w kierunku osi Y.
Rozwizanie
Do nowego projektu aplikacji wstaw przycisk Button.
Do zdarzenia Click przycisku przypiszemy metod, w ktrej utworzymy macierz
transformacji, w tej macierzy zapiszemy odpowiednie transformacje za pomoc metod
Rotate() i Translate(). Nastpnie podstawimy t macierz do waciwoci Transform
pdzla, ktrym pomalujemy kwadrat.
private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) {
Graphics^ g1=this->CreateGraphics();
Image^ obrazek = Image::FromFile("rysunek.jpg");
System::Drawing::Drawing2D::Matrix^ macierz =
gcnew System::Drawing::Drawing2D::Matrix();
macierz->Rotate(20);
macierz-> ranslate(0,10);
SolidBrush^ pedz =
gcnew SolidBrush(System::Drawing::Color::DarkGreen);
extureBrush^ pedz_text = gcnew extureBrush(obrazek);
pedz_text->WrapMode=System::Drawing::Drawing2D::WrapMode:: ile;
pedz_text-> ransform=macierz;
g1->FillRectangle(pedz_text,180,20,100,100);
}

Rozdzia 11. Grafika w aplikacjach Visual C++

129

Rysowanie pojedynczych punktw


obiekt Bitmap
Jak moe zauwaye, na obiekcie Graphics nie da si wykonywa operacji na pojedynczych punktach obrazu. Aby rysowa pojedyncze piksele, naley stworzy obiekt
typu Bitmap, na nim rysowa piksele za pomoc dostpnej w nim metody SetPixel(),
a nastpnie wywietli cay obiekt Bitmap na obiekcie Graphics za pomoc metody
DrawImage().

Przykad 11.9.
Narysuj na oknie aplikacji dwiecie punktw o losowych wsprzdnych i w losowych
kolorach.
Rozwizanie
W oknie aplikacji umie przycisk Button.
Po klikniciu przycisku utworzymy obiekt Bitmap, na ktrym w ptli for zostanie
umieszczonych dwiecie punktw. Nastpnie ten obiekt zostanie wywietlony na obiekcie Graphics okna aplikacji, czyli punkty pojawi si na tym oknie. Metoda DrawImage()
wymaga argumentu typu Image, a poniewa obiekt bitmapa jest typu Bitmap, trzeba zastosowa konwersj typw. Oto odpowiedni kod:
private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) {
System::Int32 wspx;
System::Int32 wspy;
System::Drawing::Color kolor;
Graphics^ g1=this->CreateGraphics();
Random^ liczba_los = gcnew Random();
Bitmap^ bitmapa = gcnew Bitmap(this->Width,this->Height);
for (System::Int32 i=0;i<200;i++) {
wspx=liczba_los->Next(this->Width);
wspy=liczba_los->Next(this->Height);
kolor=System::Drawing::Color::FromArgb(liczba_los->Next(2ii),
liczba_los->Next(2ii), liczba_los->Next(2ii));
bitmapa->SetPixel(wspx,wspy,kolor);
}
g1->DrawImage(dynamic_cast<Image^>(bitmapa),10,10);
}

Rysowanie trwae
odwieanie rysunku
System Windows nie zapamituje zawartoci okien po ich narysowaniu. Zwizane
jest to z oszczdnoci pamici dlatego narysowane obiekty znikaj na przykad po
przykryciu okna rysunku przez inne okno. Kiedy okno jest wywietlane, powtrnie

130

Aplikacje w Visual C++ 2005. Przykady

jest odwieane i wszystkie kontrolki s malowane jeszcze raz. Generowane jest wtedy
zdarzenie Paint. Aby rysunek by w dalszym cigu widoczny w oknie, naley go rwnie odwiey. W praktyce oznacza to, e metoda obsugujca zdarzenie Paint powinna rysowa rysunek jeszcze raz.

Przykad 11.10.
Stwrz aplikacj z dwoma polami wyboru CheckBox, niech pierwsze pole wcza i wycza rysunek kwadratu w oknie, a drugie rysunek koa. Rysunek ma by zachowywany po przykryciu okna przez inne okno.
Rozwizanie
Utwrz aplikacj z dwoma polami wyboru. We waciwo Text pierwszego pola wyboru wpisz Kwadrat, a drugiego Koo.
Najpierw napisz metod rysujc koo i kwadrat podanego koloru. Metod umie
w klasie Form1, podobnie jak metody obsugujce zdarzenia.
private: System::Void rysuj_kwadrat(System::Drawing::Color kolor) {
Graphics^ g1=this->CreateGraphics();
Pen^ pioro = gcnew Pen(kolor);
g1->DrawRectangle(pioro,10,10,1i0,1i0);
delete g1;
delete pioro;
}
private: System::Void rysuj_kolo(System::Drawing::Color kolor) {
Graphics^ g1=this->CreateGraphics();
Pen^ pioro = gcnew Pen(kolor);
g1->DrawEllipse(pioro,20,20,130,130);
delete g1;
delete pioro;
}

Teraz czas na obsug zdarzenia Paint. W widoku budowy okna aplikacji (zakadka
Form1.h [Design]) kliknij budowane okno aplikacji, a nastpnie w prawym panelu
przecz si na widok zdarze (ikona byskawicy). Teraz znajd zdarzenie Paint i kliknij je dwukrotnie. Zostaniesz przeniesiony do kodu aplikacji, gdzie utworzy si metoda
Form1_Paint(). Metoda ta bdzie rysowaa figury, gdy bd zaznaczone odpowiednie
pola. Uzupenij j jak niej.
private: System::Void Form1_Paint(System::Object^ sender,
System::Windows::Forms::PaintEventArgs^ e) {
if (checkBox1->Checked)
rysuj_kwadrat(System::Drawing::Color::DarkBlue);
if (checkBox2->Checked)
rysuj_kolo(System::Drawing::Color::DarkBlue);
}

Na kocu zaprogramuj reakcj na zaznaczenie lub wyczyszczenie pl wyboru. Kliknij


pole Kwadrat dwukrotnie i uzupenij powsta metod, ktra bdzie obsugiwaa
zmian stanu zaznaczenia pola pierwszego:

Rozdzia 11. Grafika w aplikacjach Visual C++

131

private: System::Void checkBox1_CheckedChanged(System::Object^ sender,


System::EventArgs^ e) {
if (checkBox1->Checked)
rysuj_kwadrat(System::Drawing::Color::DarkBlue);
else
rysuj_kwadrat(System::Drawing::Color::FromName("Control"));
}

Tak samo dla pola drugiego Koo:


private: System::Void checkBox2_CheckedChanged(System::Object^ sender,
System::EventArgs^ e) {
if (checkBox2->Checked)
rysuj_kolo(System::Drawing::Color::DarkBlue);
else
rysuj_kolo(System::Drawing::Color::FromName("Control"));
}

Uruchom i wyprbuj dziaanie programu. Zaznaczenie pl powoduje wywietlenie figur,


ktre nie znikaj po zakryciu innym oknem. Wygld aplikacji przedstawia rysunek 11.6.
Rysunek 11.6.
Aplikacja z trwaym
rysowaniem

Animacje
Animacje najatwiej uzyska, wykorzystujc komponent Timer. Jednym ze sposobw
jest wycieranie rysunku z poprzedniego kroku animacji i rysowanie nowego za kadym
razem, kiedy generowane jest zdarzenie Tick komponentu Timer.

Przykad 11.11.
Napisz program wywietlajcy animowany prostokt w oknie. Prostokt powinien si
porusza w gr i w d przez ca wysoko okna.
Rozwizanie
Utwrz nowy projekt aplikacji i wstaw do niego komponent Timer oraz dwa przyciski.
Przyciski bd suyy do rozpoczcia i zatrzymania ruchu prostokta. We waciwo
Text pierwszego przycisku wstaw Start, a drugiego Stop.

132

Aplikacje w Visual C++ 2005. Przykady

Najpierw musimy utworzy dwa pola klasy, ktre bd okrelay aktualn wsprzdn y prostokta i krok jego przesunicia. Pola te zadeklaruj w klasie Form1, tak jak
deklarujemy metody:
private: System::Int16 krok;
private: System::Int16 y;

Na pasku niewidocznych komponentw na dole zakadki projektowania aplikacji zaznacz komponent Timer i przejd do jego zdarze w prawym panelu. Kliknij dwukrotnie
zdarzenie Tick, tworzc metod uruchamian czasomierzem. W tej metodzie bd
rysowane dwa prostokty; jeden w kolorze formularza spowoduje wytarcie prostokta
z poprzedniego kroku, nastpnie bdzie zmieniana wsprzdna i rysowany nowy
przesunity prostokt. Metod zmodyfikuj jak niej.
private: System::Void timer1_ ick(System::Object^ sender, System::EventArgs^ e) {
Graphics^ g1 = this->CreateGraphics();
SolidBrush^ pedzel = gcnew SolidBrush(System::Drawing::Color::Aquamarine);
SolidBrush^ pedz_kas =
gcnew SolidBrush(System::Drawing::Color::FromName("Control"));
g1->FillRectangle(pedz_kas,10,y,100,10);
y=y+krok;
g1->FillRectangle(pedzel,10,y,100,10);
if ((y>100)||(y<1))
krok=-krok;
delete g1;
}

Zmienn krok, ktra okrela przesunicie prostokta w jednej klatce animacji, zainicjalizuj w chwili tworzenia okna. Wykorzystamy do tego zdarzenie FormLoad.
private: System::Void Form1_Load(System::Object^ sender, System::EventArgs^ e) {
krok=2;
}

Pozostao jeszcze zaprogramowanie metod wywoywanych przy naciniciu przyciskw. Pierwszy przycisk bdzie uruchamia Timer, a drugi zatrzymywa.
private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) {
krok=4;
timer1->Start();
}
private: System::Void button2_Click(System::Object^ sender, System::EventArgs^ e) {
timer1->Stop();
}

Po uruchomieniu programu i naciniciu przycisku Start prostokt bdzie si porusza


w gr i w d okna. Szybko jego poruszania si zaley od waciwoci Interval
komponentu Timer.

You might also like