SlideShare a Scribd company logo
1 of 18
Download to read offline
Aplikacje w Visual C++
                           2005. Przyk³ady
                           Autor: Mariusz Owczarek
                           ISBN: 978-83-246-0875-1
                           Format: B5, stron: 216




                                                Bogaty zbiór rozwi¹zañ czêsto spotykanych
                                              problemów programistycznych jêzyka Visual C++
                               • Poznaj œrodowisko tworzenia programów w Visual C++ 2005
                               • Naucz siê sk³adni jêzyka Visual C++
                               • Wykorzystaj mo¿liwoœci platformy .NET w programach w Visual C++
                           W kontekœcie programowania przy u¿yciu platformy .NET zwykle mówi siê o jêzykach
                           Visual Basic i C#. Wiêkszoœæ stron internetowych, artyku³ów i ksi¹¿ek dotycz¹cych
                           .NET zawiera kod napisany w³aœnie w nich. Co maj¹ zrobiæ programiœci, którzy od lat
                           u¿ywaj¹ C++ i wcale nie chc¹ rezygnowaæ z jego licznych zalet? Czy jedynym wyborem
                           jest nauka nowego jêzyka lub pozostanie poza œwiatem programowania dla .NET?
                           Ksi¹¿ka „Aplikacje w Visual C++ 2005. Przyk³ady” zawiera dziesi¹tki krótkich zadañ
                           wraz z rozwi¹zaniami, dziêki którym b³yskawicznie zaczniesz wykorzystywaæ mo¿liwoœci
                           platformy .NET w programach pisanych w jêzyku C++. Poznasz œrodowisko Visual C++
                           2005 Express Edition oraz podstawowe sk³adniki aplikacji pisanych w Visual C++.
                           Nauczysz siê miêdzy innymi obs³ugiwaæ dane, przetwarzaæ pliki, korzystaæ z w¹tków
                           oraz ³¹czyæ aplikacje z internetem. Dowiesz siê tak¿e, jak wykonaæ wiele innych
                           operacji niezbêdnych w codziennej pracy programisty.
                               • Œrodowisko Visual C++ 2005 Express Edition
                               • Elementy aplikacji jêzyka Visual C++
                               • Przetwarzanie i wyœwietlanie danych
                               • Praca z plikami
                               • U¿ywanie okien dialogowych
                               • Programy wielow¹tkowe
                               • Stosowanie grafiki w aplikacjach
                               • Tworzenie programów u¿ywaj¹cych sieci
Wydawnictwo Helion             • Sk³adnia jêzyka Visual C++ w pigu³ce
ul. Koœciuszki 1c                      Przyspiesz wykonywanie codziennych zadañ programistycznych,
44-100 Gliwice                                       stosuj¹c sprawdzone rozwi¹zania
tel. 032 230 98 63
e-mail: helion@helion.pl
Rozdział 1. Środowisko Visual C++ 2005 Express Edition ................................... 7
               Język C++ a .NET Framework .......................................................................................... 7
               Od czego zacząć? ............................................................................................................... 8
               Podstawy obsługi środowiska ............................................................................................ 8
               Wygląd środowiska w trybie budowy aplikacji .............................................................. 11
               Struktura projektu ............................................................................................................ 11
               Klasa okna głównego ....................................................................................................... 12
Rozdział 2. Podstawowe elementy aplikacji ...................................................... 15
               Główne okno .................................................................................................................... 15
               Przyciski .......................................................................................................................... 20
               Etykiety ............................................................................................................................ 21
               Pola tekstowe ................................................................................................................... 23
               Wprowadzanie danych do aplikacji za pomocą pól tekstowych ..................................... 25
               Wprowadzanie danych z konwersją typu ........................................................................ 26
               Wyświetlanie wartości zmiennych .................................................................................. 28
               Pole tekstowe z maską formatu danych ........................................................................... 28
               Pola wyboru i przyciski opcji .......................................................................................... 31
Rozdział 3. Menu i paski narzędzi ..................................................................... 39
               Rodzaje menu .................................................................................................................. 39
               Komponent MenuStrip .................................................................................................... 39
               Menu podręczne .............................................................................................................. 45
               Skróty klawiaturowe w menu .......................................................................................... 46
               Paski narzędzi .................................................................................................................. 48
Rozdział 4. Wprowadzanie i konwersja danych .................................................. 51
               Wprowadzanie danych do aplikacji ................................................................................. 51
               Prosta konwersja typów — klasa Convert ....................................................................... 51
               Konwersja ze zmianą formatu danych ............................................................................. 52
               Konwersja liczby na łańcuch znakowy ........................................................................... 55
Rozdział 5. Tablice, uchwyty i dynamiczne tworzenie obiektów .......................... 57
               Tablice ............................................................................................................................. 57
               Uchwyty ........................................................................................................................... 62
               Dynamiczne tworzenie obiektów — operator gcnew ...................................................... 62
               Dynamiczna deklaracja tablic .......................................................................................... 63
4                                                                                 Aplikacje w Visual C++ 2005. Przykłady


Rozdział 6. Komunikacja aplikacji z plikami ...................................................... 65
               Pliki jako źródło danych .................................................................................................. 65
               Wyszukiwanie plików ..................................................................................................... 66
               Odczyt własności plików i folderów ............................................................................... 67
               Odczyt danych z plików tekstowych ............................................................................... 68
               Zapisywanie tekstu do pliku ............................................................................................ 71
               Zapis danych do plików binarnych .................................................................................. 72
               Odczyt z plików binarnych .............................................................................................. 73
Rozdział 7. Okna dialogowe ............................................................................. 75
               Okno typu MessageBox ................................................................................................... 75
               Okno dialogowe otwarcia pliku ....................................................................................... 77
               Okno zapisu pliku ............................................................................................................ 79
               Okno wyboru koloru ........................................................................................................ 80
               Wybór czcionki ................................................................................................................ 81
Rozdział 8. Możliwości edycji tekstu w komponencie TextBox .......................... 83
               Właściwości pola TextBox .............................................................................................. 83
               Kopiowanie i wklejanie tekstu ze schowka ..................................................................... 85
               Wyszukiwanie znaków w tekście .................................................................................... 85
               Wstawianie tekstu między istniejące linie ....................................................................... 86
               Elementy grafiki w polu tekstowym ................................................................................ 87
Rozdział 9. Komponent tabeli DataGridView ...................................................... 89
               Podstawowe właściwości komponentu DataGridView ................................................... 89
               Zmiana wyglądu tabeli .................................................................................................... 92
               Dopasowanie wymiarów komórek tabeli do wyświetlanego tekstu ................................ 94
               Odczytywanie danych z komórek tabeli .......................................................................... 96
               Zmiana liczby komórek podczas działania aplikacji ..................................................... 100
               Tabela DataGridView z komórkami różnych typów ..................................................... 103
               Przyciski w komórkach — DataGridViewButtonCell .................................................. 106
               Komórki z polami wyboru — DataGridViewCheckBoxCell ........................................ 108
               Grafika w tabeli — komórka DataGridViewImageCell ................................................ 109
               Komórka z listą rozwijaną — DataGridViewComboBoxCell ...................................... 110
               Odnośniki internetowe w komórkach — DataGridViewLinkCell ................................ 112
Rozdział 10. Metody związane 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
               Pióro Pen ........................................................................................................................ 124
               Pędzle zwykłe i teksturowane ........................................................................................ 126
               Rysowanie pojedynczych punktów — obiekt Bitmap .................................................. 129
               Rysowanie trwałe — odświeżanie rysunku ................................................................... 129
               Animacje ........................................................................................................................ 131
Rozdział 12. Podstawy aplikacji wielowątkowych ............................................. 133
               Wątki ............................................................................................................................. 133
               Komunikacja z komponentami z innych wątków — przekazywanie parametrów ....... 135
               Przekazywanie parametrów do metody wątku .............................................................. 137
               Klasa wątku — przekazywanie parametrów z kontrolą typu ........................................ 138
               Komponent BackgroundWorker .................................................................................... 140
Spis treści                                                                                                                                    5


Rozdział 13. Połączenie aplikacji z siecią internet ............................................. 145
               Komponent WebBrowser .............................................................................................. 145
               Przetwarzanie stron Web — obiekt HtmlDocument ..................................................... 148
               Protokół FTP .................................................................................................................. 151
               Pobieranie zawartości katalogu z serwera FTP ............................................................. 153
               Pobieranie plików przez FTP ........................................................................................ 154
               Wysyłanie pliku na serwer FTP ..................................................................................... 155
               Klasa do wysyłania i odbierania plików z FTP korzystająca z wątków ........................ 157
Rozdział 14. Dynamiczne tworzenie okien i komponentów ................................. 161
               Wyświetlanie okien — klasa Form ............................................................................... 161
               Komponenty w oknie tworzonym dynamicznie ............................................................ 162
               Przesyłanie danych z okien dialogowych ...................................................................... 163
               Okno tytułowe aplikacji ................................................................................................. 164
               Obsługa zdarzeń dla komponentów tworzonych dynamicznie ..................................... 165
               Aplikacja zabezpieczona hasłem ................................................................................... 167
Dodatek A Skondensowane C++ .................................................................... 169
               Skorowidz .................................................................................... 201
Rozdział 11.




Obiekt Graphics
— kartka do rysowania
   Większości komponentów wizualnych VC++ zawiera właściwość Graphics, dzięki której
   można rysować, wypisywać teksty i umieszczać na nich grafiki w postaci bitmapy.
   Możesz pomyśleć o właściwości Graphics jako o kartce czy płótnie, na którym można
   tworzyć grafikę.

   Na początku po utworzeniu komponentu jego właściwość Graphics jest „pusta”. Przed
   rozpoczęciem rysowania trzeba stworzyć obiekt typu Graphics i „podpiąć” do tej właści-
   wości. Dopiero na tym obiekcie można rysować. Do tworzenia obiektu Graphics służy
   metoda CreateGraphics() wywoływana na komponencie, na którym chcemy rysować.

   Oprócz podłoża do rysowania niezbędne są także obiekty klasy Pen i Brush, a do wy-
   świetlania tekstu także obiekt opisujący czcionkę typu Font.

   Pen — pióro, jakim rysujemy.

   Brush — (pędzel) rodzaj wypełnienia rysowanych obiektów (kolor, deseń). Mamy dwa
   rodzaje pędzli: SolidBrush to pędzel jednokolorowy, TextureBrush zaś wypełnia obiekty
   deseniem z podanej bitmapy.

   Font — określa czcionkę do rysowania napisów.

   Zasadę rysowania najlepiej wyjaśni prosty przykład.
120                                                     Aplikacje w Visual C++ 2005. Przykłady


         Przykład 11.1.
         Po naciśnięciu przycisku narysuj ukośną niebieską linię na oknie aplikacji.

         Rozwiązanie
         Do nowego projektu aplikacji wstaw przycisk Button.

         Po naciśnięciu przycisku należy utworzyć obiekt typu Graphics dla głównego okna
         aplikacji, a następnie obiekt pióra Pen. Ponieważ metoda button1_Click() jest metodą
         klasy reprezentującej główne okno, odwołujemy się do tego okna za pomocą wskaźnika
         this. Teraz można już rysować po oknie, korzystając z metody obiektu Graphics ry-
         sującej linie. Oto kod metody, którą należy 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 naciśnięciu przycisku na oknie pojawi się linia jak na rysunku 11.1.
Rysunek 11.1.
Rysowanie
na oknie aplikacji




            Zauważ, że pióro Pen i pędzel Brush nie są właściwościami obiektu Graphics, ale od-
            dzielnymi obiektami.


         Obiekt Graphics posiada wiele metod służących do rysowania punktów, linii, figur,
         a nawet wyświetlania całych bitmap z plików. Zestawienie metod klasy Graphics
         podaje tabela 11.1.
Tabela 11.1. Wybrane metody rysujące obiektu Graphics
 Metoda                                           Działanie
 DrawLine(Pen^ pi,int x1,int y1,int x2,int y2)    Rysuje linie o początku w x1, y1 i końcu w x2, y2,
                                                  używając pióra pi.
 DrawArc(Pen^ pi,float x,float y,float szer,      Wycinek okręgu lub elipsy rysowany piórem pi,
 float wys,float kąt_start,float kąt)             środek w (x, y), łuk mieści się w prostokącie
                                                  o wymiarach szer i wys, zaczyna się od kąta
                                                  kąt_start i biegnie przez kąt stopni.
Rozdział 11. ¨ Grafika w aplikacjach Visual C++                                                   121


Tabela 11.1. Wybrane metody rysujące obiektu Graphics (ciag dalszy)
 Metoda                                            Działanie
 DrawBezier(Pen^ pi,float x1,float y1,float x2,    Rysuje krzywą sklejaną Beziera przez cztery
 float y2,float x3,float y3,float x4,float y4)     podane punkty.
 DrawBeziers(Pen^ pi, array<System::Drawing:       Rysuje serię krzywych Beziera zgodnie z podaną
 :PointF>^ punkty)                                 tablicą punktów.
 DrawClosedCurve(Pen^ pi, array<System::Drawing:   Rysuje zamkniętą krzywą sklejaną zgodnie
 :PointF>^ punkty)                                 z podaną tablicą punktów.
 DrawCurve(Pen^ pi, array<System::Drawing:         Rysuje krzywą sklejaną (spline) między
 :PointF>^ punkty)                                 punktami podanymi w tabeli.
 DrawEllipse(Pen^ pi,float x, float y,             Rysuje elipsę mieszczącą się w prostokącie
 float szer, float wys)                            określonym współrzędnymi oraz wysokością
                                                   i szerokością.
 DrawIcon(Icon^ ikona, int x, int y)               Rysuje ikonę w podanych współrzędnych.
 DrawImage(Image^ obraz,int x,int y)               Rysuje bitmapę obraz we współrzędnych (x, y).
 DrawPie(Pen^ pi,float x,float y,float szer,       Rysuje wycinek koła piórem pi, środek w (x, y),
 float wys,float kąt_start,float kąt)              wycinek mieści się w prostokącie o wymiarach
                                                   szer i wys, zaczyna się od kąta kąt_start
                                                   i biegnie przez kąt stopni.
 DrawPolygon(Pen^ pi, array<System::Drawing:       Tworzy zamknięty wielobok o wierzchołkach
 :PointF>^ punkty)                                 określonych w tabeli punkty.
 DrawRectangle(Pen^ pi,float x,float y,            Rysuje prostokąt o lewym górnym rogu
 float szer,float wys)                             w punkcie (x, y) i bokach o długości szer i wys.
 DrawString(String^ tekst,Font^ czcionka,          Wypisuje tekst tekst z lewym górnym rogiem
 Brush^ pędzel, float x,float y)                   w punkcie (x, y), używając podanej czcionki
                                                   i pędzla.
 FillClosedCurve(Brush^ pędzel, array<System:      Tworzy wypełnioną pędzlem pędzel zamkniętą
 :Drawing::PointF>^ punkty)                        krzywą sklejaną (spline) określona punktami
                                                   punkty.
 FillEllipse(Brush^ pędzel, float x, float y,      Rysuje elipsę w prostokącie określonym
 float szer, float wys)                            współrzędnymi (x, y) oraz wysokością
                                                   i szerokością wypełniona pędzlem pędzel.
 FillPie(Brush^ pędzel, float x,float y,           Maluje wypełniony pędzlem pędzel wycinek
 float szer,float wys,float kąt_start,float kąt)   koła, środek w (x, y), wycinek mieści się
                                                   w prostokącie o wymiarach szer i wys, zaczyna
                                                   się od kąta kąt_start i biegnie przez kąt stopni.
 FillPolygon(Brush^ pędzel, array<System:          Tworzy wypełniony pędzlem pędzel wielokąt
 :Drawing::PointF>^ punkty)                        o wierzchołkach w tabeli punkty.
 FillRectangle(Brush^ pędzel, float x,float y,     Rysuje wypełniony pędzlem pędzel prostokąt
 float szer,float wys)                             o lewym górnym rogu w punkcie (x, y)
                                                   oraz podanej szerokości i wysokości.
 Clear(Color kolor)                                Czyści całą powierzchnię rysunku i wypełnia
                                                   ją kolorem kolor.

        Ponieważ metod jest dużo i każda ma kilka postaci, tabela 11.1 podaje tylko po jednej
        postaci każdej metody, aby możliwe było zestawienie wszystkich.
122                                                      Aplikacje w Visual C++ 2005. Przykłady


         Przykład 11.2.
         Wyświetl w oknie programu tekst podany w polu tekstowym. Nie używaj komponentu
         Label.

         Rozwiązanie
         Utwórz nowy projekt aplikacji i wstaw do okna pole tekstowe TextBox oraz przycisk
         Button.

         Po naciśnięciu przycisku zostanie utworzony pędzel 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 działania aplikacji przedstawia rysunek 11.2.

Rysunek 11.2.
Rysowanie tekstu
w oknie aplikacji




         Przykład 11.3.
         Po naciśnięciu przycisku wyświetl na formularzu wykres ze współrzędnych podanych
         w polach tekstowych.

         Rozwiązanie
         Wstaw do okna aplikacji dziesięć pól tekstowych TextBox, dwie etykiety Label i przy-
         cisk Button.

         Powiększ wymiary okna, a pod właściwości Text etykiet i przycisku podstaw odpo-
         wiednie teksty, tak aby całość wyglądała jak na rysunku 11.3 (na razie bez wykresu
         i wpisanych współrzędnych).
Rozdział 11. ¨ Grafika w aplikacjach Visual C++                                          123


Rysunek 11.3.
Aplikacja
do rysowania
wykresów




        Po naciśnięciu przycisku Rysuj współrzędne będą pobierane z pól tekstowych i prze-
        kazywane do tablicy obiektów System::Drawing::PointF, które reprezentują punkty
        na płaszczyźnie. Następnie 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);
                   }


        Przykład 11.4.
        Po każdym naciśnięciu przycisku wyświetl w oknie prostokąt o losowych współrzęd-
        nych, losowych wymiarach i losowym kolorze.

        Rozwiązanie
        Do nowego projektu aplikacji wstaw przycisk Button.

        Aby wygenerować współrzędne i kolor prostokątów, będziemy potrzebować generatora
        liczb losowych. Jest to obiekt typu Random, który trzeba utworzyć, a następnie można
        pobierać z niego liczby, używając metody Next() tego obiektu. Po wygenerowaniu
        liczb prostokąt rysujemy za pomocą metody FillRectangle(). Kolor pędzla definiu-
        jemy za pomocą trzech liczb losowych określających składowe RGB. Oto metoda zda-
        rzenia Click przycisku:
124                                                 Aplikacje w Visual C++ 2005. Przykłady


        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);
                 }


      Przykład 11.5.
      Wyświetl w oknie plik rysunek.jpg z lewym górnym rogiem w punkcie (100, 100).

      Rozwiązanie
      Wstaw do aplikacji przycisk Button.

      Aby wyświetlić obrazek, najpierw utworzymy obiekt Image zawierający plik rysunek.jpg
      (plik o takiej nazwie trzeba wcześniej umieścić w folderze programu), a następnie wy-
      świetlimy go w oknie, używając 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);
                 }




Pióro Pen
      Używany już przez nas obiekt Pen, czyli pióro, daje wiele możliwości. Za pośrednic-
      twem właściwości tego obiektu można sterować zarówno grubością linii, jak i rysować
      linie przerywane, wybierać styl rozpoczęcia i zakończenia linii itp. Najważniejsze wła-
      ściwości przedstawia tabela 11.2.

      Przykład 11.6.
      Wyświetl w oknie kilka linii rysowanych różnymi stylami.

      Rozwiązanie
      Utwórz nowy projekt aplikacji i wstaw do niego przycisk Button.

      Po naciśnięciu przycisku będziemy zmieniać parametry pióra i rysować nim kolejne
      linie. Oto metoda dla zdarzenia Click przycisku:
Rozdział 11. ¨ Grafika w aplikacjach Visual C++                                                  125


Tabela 11.2. Niektóre właściwości obiektu Pen
 Właściwość        Znaczenie
 Width             Szerokość pióra w punktach.
 Brush             Pędzel, jakim rysowana jest linia.
 Color             Kolor linii.
 StartCap          Rodzaj znaczka dodawanego na rozpoczęcie linii. Wartości tej właściwości są typu
                   System::Drawing::Drawing2D::LineCap, oto kilka z nich:
                     System::Drawing::Drawing2D::LineCap::Square — linia z kwadratowym
                     zakończeniem,
                     System::Drawing::Drawing2D::LineCap::ArrowAnchor — linia ze strzałką,
                     System::Drawing::Drawing2D::LineCap:: riangle — linia z trójkątem.
 EndCap            Rodzaj zakończenia linii, wartości takie, jak w StartCap.
 DashStyle         Ustawia linię przerywaną. Wartości to:
                      System::Drawing::Drawing2D::DashStyle::Dash — linia z kresek,
                      System::Drawing::Drawing2D::DashStyle::DashDot — linia składająca się
                      z kresek i kropek,
                      System::Drawing::Drawing2D::DashStyle::DashDotDot — linia z kreski i dwóch
                      kropek,
                      System::Drawing::Drawing2D::DashStyle::Dot — linia z kropek,
                      System::Drawing::Drawing2D::DashStyle::Solid — linia ciągła.
 DashCap           Ustawia rodzaj zakończenia elementów linii przerywanej. Wartości to:
                     System::Drawing::Drawing2D::DashCap::Flat — zakończenie prostokątne,
                     System::Drawing::Drawing2D::DashCap:: riangle — zakończenie trójkątne,
                     System::Drawing::Drawing2D::DashCap::Round — zakończenie zaokrąglone.
 DashOffset        Przesunięcie wzoru kreskowanej linii względem początku 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. Przykłady


                        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 naciśnięciu przycisku przedstawia rysunek 11.4.

Rysunek 11.4.
Działanie różnych
rodzajów piór




Pędzle zwykłe i teksturowane
        Pędzle są obiektami dwóch klas potomnych klasy Brush, mianowicie SolidBrush
        i TextureBrush. Pierwszy z nich to pędzel jednokolorowy, natomiast drugi maluje za
        pomocą podanych bitmap (tekstur) i daje znacznie większe możliwości.

        Kolor pędzla SolidBrush ustawiamy, używając właściwości Color tego obiektu.

        Właściwości pędzla TextureBrush przedstawia tabela 11.3.

        Przykład 11.7.
        Narysuj na oknie aplikacji dwa wycinki kół, jeden wypełniony jednym kolorem i drugi
        wypełniony teksturą pobraną z pliku rysunek.jpg w ułożeniu kafelkowym.

        Rozwiązanie
        Utwórz nowy projekt aplikacji i wstaw do niego przycisk Button.

        Po naciśnięciu tego przycisku utworzymy dwa pędzle: jednokolorowy i teksturowany,
        a następnie wyświetlimy wycinki kół za pomocą metody FillPie(). Aby program dzia-
        łał, potrzebny jest rysunek rysunek.jpg w folderze programu.
Rozdział 11. ¨ Grafika w aplikacjach Visual C++                                                  127


Tabela 11.3. Właściwości pędzla TextureBrush
 Właściwość         Znaczenie
 Image              Określa bitmapę (teksturę) pędzla.
 WrapMode           Sposób wyświetlania tekstury:
                       System::Drawing::Drawing2D::WrapMode:: ile — tekstura wyświetlana jest
                       sąsiadująco (jak kafelki),
                       System::Drawing::Drawing2D::WrapMode::Clamp — tekstura wyświetlana jest
                       jako pojedyncza,
                       System::Drawing::Drawing2D::WrapMode:: ileFlipX — wyświetlanie sąsiadująco
                       tekstury obróconej względem osi X,
                       System::Drawing::Drawing2D::WrapMode:: ileFlipY — jak wyżej,
                       ale względem osi Y,
                       System::Drawing::Drawing2D::WrapMode:: ileFlipXY — jak wyżej,
                       ale obrócenie względem obu osi.
  ransform          Określa transformacje, jakim może zostać poddana tekstura przed wyświetleniem.
                    Może 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 naciśnięciu przycisku aplikacja może wyglądać tak, jak na ry-
         sunku 11.5 (efekt jest zależny od zawartości rysunku użytego do teksturowania).

Rysunek 11.5.
Malowanie
pędzlem zwykłym
i teksturowanym




         Kafelkowe układanie tekstury jest opcją domyślną, dlatego linię
             pedz_text->WrapMode=System::Drawing::Drawing2D::WrapMode:: ile;

         można pominąć i nie zmieni to efektu działania programu.
128                                                      Aplikacje w Visual C++ 2005. Przykłady


        Zajmiemy się teraz właściwością Transform umożliwiającą transformacje tekstury przed
        jej wyświetleniem. Właściwość ta może przybierać wartości typu System::Drawing:
        :Drawing2D::Matrix, które są macierzami transformacji. Obiekt Matrix jest macierzą 3´3,
        a każda liczba w macierzy oznacza rodzaj transformacji obiektu. Strukturą macierzy
        nie będziemy się tu zajmować, ponieważ do podstawowych operacji na tekturach jej
        znajomość nie jest potrzebna. Operacje na macierzy można wykonywać za pomocą
        metod klasy Matrix. Tabela 11.4 przedstawia niektóre z nich.

Tabela 11.4. Metody transformujące obiektu Matrix (macierzy transformacji)
 Metoda                                  Znaczenie
 Rotate(Single kąt)                      Obraca teksturę o kąt stopni w prawo.
 RotateAt(Single kąt, PointF punkt)      Obraca teksturę o kąt 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 polegająca na obrocie płaszczyzny rysunku
                                         wokół osi X lub Y.
  ranslate(Single odlX, Single odlY)     Przesuwa teksturę o odlX i odlY punktów w kierunku
                                         odpowiednich osi.

        Przykład 11.8.
        Narysuj kwadrat wypełniony teksturą z pliku rysunek.jpg w ułożeniu kafelkowym,
        tekstura ma być obrócona o 20 stopni i przesunięta o 10 punktów w kierunku osi Y.

        Rozwiązanie
        Do nowego projektu aplikacji wstaw przycisk Button.

        Do zdarzenia Click przycisku przypiszemy metodę, w której utworzymy macierz
        transformacji, w tej macierzy zapiszemy odpowiednie transformacje za pomocą metod
        Rotate() i Translate(). Następnie podstawimy tę macierz do właściwości Transform
        pędzla, którym 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 punktów
— obiekt Bitmap
        Jak może zauważyłeś, na obiekcie Graphics nie da się wykonywać operacji na poje-
        dynczych punktach obrazu. Aby rysować pojedyncze piksele, należy stworzyć obiekt
        typu Bitmap, na nim rysować piksele za pomocą dostępnej w nim metody SetPixel(),
        a następnie wyświetlić cały obiekt Bitmap na obiekcie Graphics za pomocą metody
        DrawImage().

        Przykład 11.9.
        Narysuj na oknie aplikacji dwieście punktów o losowych współrzędnych i w losowych
        kolorach.

        Rozwiązanie
        W oknie aplikacji umieść przycisk Button.

        Po kliknięciu przycisku utworzymy obiekt Bitmap, na którym w pętli for zostanie
        umieszczonych dwieście punktów. Następnie ten obiekt zostanie wyświetlony na obiek-
        cie Graphics okna aplikacji, czyli punkty pojawią się na tym oknie. Metoda DrawImage()
        wymaga argumentu typu Image, a ponieważ obiekt bitmapa jest typu Bitmap, trzeba za-
        stosować konwersję typów. 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 trwałe
— odświeżanie rysunku
        System Windows nie zapamiętuje zawartości okien po ich narysowaniu. Związane
        jest to z oszczędnością pamięci — dlatego narysowane obiekty znikają na przykład po
        przykryciu okna rysunku przez inne okno. Kiedy okno jest wyświetlane, powtórnie
130                                                Aplikacje w Visual C++ 2005. Przykłady


      jest odświeżane i wszystkie kontrolki są malowane jeszcze raz. Generowane jest wtedy
      zdarzenie Paint. Aby rysunek był w dalszym ciągu widoczny w oknie, należy go rów-
      nież odświeżyć. W praktyce oznacza to, że metoda obsługująca zdarzenie Paint po-
      winna rysować rysunek jeszcze raz.

      Przykład 11.10.
      Stwórz aplikację z dwoma polami wyboru CheckBox, niech pierwsze pole włącza i wyłą-
      cza rysunek kwadratu w oknie, a drugie — rysunek koła. Rysunek ma być zachowy-
      wany po przykryciu okna przez inne okno.

      Rozwiązanie
      Utwórz aplikację z dwoma polami wyboru. We właściwość Text pierwszego pola wy-
      boru wpisz „Kwadrat”, a drugiego — „Koło”.

      Najpierw napisz metodę rysującą koło i kwadrat podanego koloru. Metodę umieść
      w klasie Form1, podobnie jak metody obsługujące 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 obsługę zdarzenia Paint. W widoku budowy okna aplikacji (zakładka
      Form1.h [Design]) kliknij budowane okno aplikacji, a następnie w prawym panelu
      przełącz się na widok zdarzeń (ikona błyskawicy). Teraz znajdź zdarzenie Paint i klik-
      nij je dwukrotnie. Zostaniesz przeniesiony do kodu aplikacji, gdzie utworzy się metoda
      Form1_Paint(). Metoda ta będzie rysowała figury, gdy będą zaznaczone odpowiednie
      pola. Uzupełnij ją jak niżej.
        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 końcu zaprogramuj reakcję na zaznaczenie lub wyczyszczenie pól wyboru. Kliknij
      pole „Kwadrat” dwukrotnie i uzupełnij powstałą metodę, która będzie obsługiwała
      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 — „Koło”:
           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 wypróbuj działanie programu. Zaznaczenie pól powoduje wyświetlenie figur,
        które nie znikają po zakryciu innym oknem. Wygląd aplikacji przedstawia rysunek 11.6.

Rysunek 11.6.
Aplikacja z trwałym
rysowaniem




Animacje
        Animacje najłatwiej uzyskać, wykorzystując komponent Timer. Jednym ze sposobów
        jest wycieranie rysunku z poprzedniego kroku animacji i rysowanie nowego za każdym
        razem, kiedy generowane jest zdarzenie Tick komponentu Timer.

        Przykład 11.11.
        Napisz program wyświetlający animowany prostokąt w oknie. Prostokąt powinien się
        poruszać w górę i w dół przez całą wysokość okna.

        Rozwiązanie
        Utwórz nowy projekt aplikacji i wstaw do niego komponent Timer oraz dwa przyciski.
        Przyciski będą służyły do rozpoczęcia i zatrzymania ruchu prostokąta. We właściwość
        Text pierwszego przycisku wstaw „Start”, a drugiego — „Stop”.
132                                                  Aplikacje w Visual C++ 2005. Przykłady


      Najpierw musimy utworzyć dwa pola klasy, które będą określały aktualną współ-
      rzędną y prostokąta i krok jego przesunięcia. Pola te zadeklaruj w klasie Form1, tak jak
      deklarujemy metody:
        private: System::Int16 krok;
        private: System::Int16 y;

      Na pasku niewidocznych komponentów na dole zakładki projektowania aplikacji za-
      znacz komponent Timer i przejdź do jego zdarzeń w prawym panelu. Kliknij dwukrotnie
      zdarzenie Tick, tworząc metodę uruchamianą czasomierzem. W tej metodzie będą
      rysowane dwa prostokąty; jeden w kolorze formularza spowoduje wytarcie prostokąta
      z poprzedniego kroku, następnie będzie zmieniana współrzędna i rysowany nowy
      przesunięty prostokąt. Metodę zmodyfikuj jak niżej.
        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, która określa przesunięcie prostokąta w jednej klatce animacji, zainicja-
      lizuj w chwili tworzenia okna. Wykorzystamy do tego zdarzenie FormLoad.
        private: System::Void Form1_Load(System::Object^ sender, System::EventArgs^ e) {
                          krok=2;
                  }

      Pozostało jeszcze zaprogramowanie metod wywoływanych przy naciśnięciu przyci-
      sków. Pierwszy przycisk będzie 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 naciśnięciu przycisku Start prostokąt będzie się poruszał
      w górę i w dół okna. Szybkość jego poruszania się zależy od właściwości Interval
      komponentu Timer.

More Related Content

What's hot

C++Builder Borland Developer Studio 2006. Kompendium programisty
C++Builder Borland Developer Studio 2006. Kompendium programistyC++Builder Borland Developer Studio 2006. Kompendium programisty
C++Builder Borland Developer Studio 2006. Kompendium programistyWydawnictwo Helion
 
C++. Wykorzystaj potęgę aplikacji graficznych
C++. Wykorzystaj potęgę aplikacji graficznychC++. Wykorzystaj potęgę aplikacji graficznych
C++. Wykorzystaj potęgę aplikacji graficznychWydawnictwo Helion
 
C++. Programowanie zorientowane obiektowo. Vademecum profesjonalisty
C++. Programowanie zorientowane obiektowo. Vademecum profesjonalistyC++. Programowanie zorientowane obiektowo. Vademecum profesjonalisty
C++. Programowanie zorientowane obiektowo. Vademecum profesjonalistyWydawnictwo Helion
 
C++. Inżynieria programowania
C++. Inżynieria programowaniaC++. Inżynieria programowania
C++. Inżynieria programowaniaWydawnictwo Helion
 
Visual Basic 2005. Programowanie
Visual Basic 2005. ProgramowanieVisual Basic 2005. Programowanie
Visual Basic 2005. ProgramowanieWydawnictwo Helion
 
Visual C# 2005. Zapiski programisty
Visual C# 2005. Zapiski programistyVisual C# 2005. Zapiski programisty
Visual C# 2005. Zapiski programistyWydawnictwo Helion
 
Visual Basic .NET. Księga eksperta
Visual Basic .NET. Księga ekspertaVisual Basic .NET. Księga eksperta
Visual Basic .NET. Księga ekspertaWydawnictwo Helion
 
Język C++. Koncepcje i techniki programowania
Język C++. Koncepcje i techniki programowaniaJęzyk C++. Koncepcje i techniki programowania
Język C++. Koncepcje i techniki programowaniaWydawnictwo Helion
 
CorelDRAW 11. Vademecum profesjonalisty. Tom 1
CorelDRAW 11. Vademecum profesjonalisty. Tom 1CorelDRAW 11. Vademecum profesjonalisty. Tom 1
CorelDRAW 11. Vademecum profesjonalisty. Tom 1Wydawnictwo Helion
 
.NET Framework 2.0. Zaawansowane programowanie
.NET Framework 2.0. Zaawansowane programowanie.NET Framework 2.0. Zaawansowane programowanie
.NET Framework 2.0. Zaawansowane programowanieWydawnictwo Helion
 
Język C++. Gotowe rozwiązania dla programistów
Język C++. Gotowe rozwiązania dla programistówJęzyk C++. Gotowe rozwiązania dla programistów
Język C++. Gotowe rozwiązania dla programistówWydawnictwo Helion
 
Delphi 2007 dla WIN32 i bazy danych
Delphi 2007 dla WIN32 i bazy danychDelphi 2007 dla WIN32 i bazy danych
Delphi 2007 dla WIN32 i bazy danychWydawnictwo Helion
 
Adobe Dreamweaver CS3/CS3 PL. Oficjalny podręcznik
Adobe Dreamweaver CS3/CS3 PL. Oficjalny podręcznikAdobe Dreamweaver CS3/CS3 PL. Oficjalny podręcznik
Adobe Dreamweaver CS3/CS3 PL. Oficjalny podręcznikWydawnictwo Helion
 

What's hot (20)

ABC Delphi 2006
ABC Delphi 2006ABC Delphi 2006
ABC Delphi 2006
 
C++Builder 6 i bazy danych
C++Builder 6 i bazy danychC++Builder 6 i bazy danych
C++Builder 6 i bazy danych
 
C++BuilderX. Ćwiczenia
C++BuilderX. ĆwiczeniaC++BuilderX. Ćwiczenia
C++BuilderX. Ćwiczenia
 
C++Builder Borland Developer Studio 2006. Kompendium programisty
C++Builder Borland Developer Studio 2006. Kompendium programistyC++Builder Borland Developer Studio 2006. Kompendium programisty
C++Builder Borland Developer Studio 2006. Kompendium programisty
 
C++. Wykorzystaj potęgę aplikacji graficznych
C++. Wykorzystaj potęgę aplikacji graficznychC++. Wykorzystaj potęgę aplikacji graficznych
C++. Wykorzystaj potęgę aplikacji graficznych
 
C++. Programowanie zorientowane obiektowo. Vademecum profesjonalisty
C++. Programowanie zorientowane obiektowo. Vademecum profesjonalistyC++. Programowanie zorientowane obiektowo. Vademecum profesjonalisty
C++. Programowanie zorientowane obiektowo. Vademecum profesjonalisty
 
Delphi 2005
Delphi 2005Delphi 2005
Delphi 2005
 
C++. Inżynieria programowania
C++. Inżynieria programowaniaC++. Inżynieria programowania
C++. Inżynieria programowania
 
Visual Basic 2005. Programowanie
Visual Basic 2005. ProgramowanieVisual Basic 2005. Programowanie
Visual Basic 2005. Programowanie
 
Visual C# 2005. Zapiski programisty
Visual C# 2005. Zapiski programistyVisual C# 2005. Zapiski programisty
Visual C# 2005. Zapiski programisty
 
C# i ASP.NET. Szybki start
C# i ASP.NET. Szybki startC# i ASP.NET. Szybki start
C# i ASP.NET. Szybki start
 
C# i .NET
C# i .NETC# i .NET
C# i .NET
 
Visual Basic .NET. Księga eksperta
Visual Basic .NET. Księga ekspertaVisual Basic .NET. Księga eksperta
Visual Basic .NET. Księga eksperta
 
Język C++. Koncepcje i techniki programowania
Język C++. Koncepcje i techniki programowaniaJęzyk C++. Koncepcje i techniki programowania
Język C++. Koncepcje i techniki programowania
 
CorelDRAW 11. Vademecum profesjonalisty. Tom 1
CorelDRAW 11. Vademecum profesjonalisty. Tom 1CorelDRAW 11. Vademecum profesjonalisty. Tom 1
CorelDRAW 11. Vademecum profesjonalisty. Tom 1
 
.NET Framework 2.0. Zaawansowane programowanie
.NET Framework 2.0. Zaawansowane programowanie.NET Framework 2.0. Zaawansowane programowanie
.NET Framework 2.0. Zaawansowane programowanie
 
Język C++. Gotowe rozwiązania dla programistów
Język C++. Gotowe rozwiązania dla programistówJęzyk C++. Gotowe rozwiązania dla programistów
Język C++. Gotowe rozwiązania dla programistów
 
Delphi 2007 dla WIN32 i bazy danych
Delphi 2007 dla WIN32 i bazy danychDelphi 2007 dla WIN32 i bazy danych
Delphi 2007 dla WIN32 i bazy danych
 
Adobe Dreamweaver CS3/CS3 PL. Oficjalny podręcznik
Adobe Dreamweaver CS3/CS3 PL. Oficjalny podręcznikAdobe Dreamweaver CS3/CS3 PL. Oficjalny podręcznik
Adobe Dreamweaver CS3/CS3 PL. Oficjalny podręcznik
 
C#. Programowanie
C#. ProgramowanieC#. Programowanie
C#. Programowanie
 

Viewers also liked

Viewers also liked (7)

2. Obliczanie i pomiary parametrów obwodu prądu stałego
2. Obliczanie i pomiary parametrów obwodu prądu stałego2. Obliczanie i pomiary parametrów obwodu prądu stałego
2. Obliczanie i pomiary parametrów obwodu prądu stałego
 
15
1515
15
 
10 sposobów na zwiększenie sprzedaży
10 sposobów na zwiększenie sprzedaży10 sposobów na zwiększenie sprzedaży
10 sposobów na zwiększenie sprzedaży
 
Agile - metodyki zwinne (ver. 2014-04-29)
Agile - metodyki zwinne (ver. 2014-04-29)Agile - metodyki zwinne (ver. 2014-04-29)
Agile - metodyki zwinne (ver. 2014-04-29)
 
2
22
2
 
Cz.1 wprowadzeni do motywacji
Cz.1 wprowadzeni do motywacjiCz.1 wprowadzeni do motywacji
Cz.1 wprowadzeni do motywacji
 
Metodologia badań
Metodologia badańMetodologia badań
Metodologia badań
 

Similar to Aplikacje w Visual C++ 2005. Przykłady

Visual Basic 2005. Wprowadzenie do programowania w .NET
Visual Basic 2005. Wprowadzenie do programowania w .NETVisual Basic 2005. Wprowadzenie do programowania w .NET
Visual Basic 2005. Wprowadzenie do programowania w .NETWydawnictwo Helion
 
Microsoft Visual Basic .NET 2003. Księga eksperta
Microsoft Visual Basic .NET 2003. Księga ekspertaMicrosoft Visual Basic .NET 2003. Księga eksperta
Microsoft Visual Basic .NET 2003. Księga ekspertaWydawnictwo Helion
 
Delphi 2005. 303 gotowe rozwiązania
Delphi 2005. 303 gotowe rozwiązaniaDelphi 2005. 303 gotowe rozwiązania
Delphi 2005. 303 gotowe rozwiązaniaWydawnictwo Helion
 
C++. 50 efektywnych sposobów na udoskonalenie Twoich programów
C++. 50 efektywnych sposobów na udoskonalenie Twoich programówC++. 50 efektywnych sposobów na udoskonalenie Twoich programów
C++. 50 efektywnych sposobów na udoskonalenie Twoich programówWydawnictwo Helion
 
C++. Styl i technika zaawansowanego programowania
C++. Styl i technika zaawansowanego programowaniaC++. Styl i technika zaawansowanego programowania
C++. Styl i technika zaawansowanego programowaniaWydawnictwo Helion
 
C++. Zaawansowane programowanie
C++. Zaawansowane programowanieC++. Zaawansowane programowanie
C++. Zaawansowane programowanieWydawnictwo Helion
 
Programowanie obiektowe w Visual Basic .NET dla każdego
Programowanie obiektowe w Visual Basic .NET dla każdegoProgramowanie obiektowe w Visual Basic .NET dla każdego
Programowanie obiektowe w Visual Basic .NET dla każdegoWydawnictwo Helion
 
C++Builder. Kompendium programisty
C++Builder. Kompendium programistyC++Builder. Kompendium programisty
C++Builder. Kompendium programistyWydawnictwo Helion
 
Microsoft SQL Server 2005. Podręcznik programisty
Microsoft SQL Server 2005. Podręcznik programistyMicrosoft SQL Server 2005. Podręcznik programisty
Microsoft SQL Server 2005. Podręcznik programistyWydawnictwo Helion
 
Aplikacje w Delphi. Przykłady. Wydanie II
Aplikacje w Delphi. Przykłady. Wydanie IIAplikacje w Delphi. Przykłady. Wydanie II
Aplikacje w Delphi. Przykłady. Wydanie IIWydawnictwo Helion
 

Similar to Aplikacje w Visual C++ 2005. Przykłady (14)

Visual Basic 2005. Wprowadzenie do programowania w .NET
Visual Basic 2005. Wprowadzenie do programowania w .NETVisual Basic 2005. Wprowadzenie do programowania w .NET
Visual Basic 2005. Wprowadzenie do programowania w .NET
 
Microsoft Visual Basic .NET 2003. Księga eksperta
Microsoft Visual Basic .NET 2003. Księga ekspertaMicrosoft Visual Basic .NET 2003. Księga eksperta
Microsoft Visual Basic .NET 2003. Księga eksperta
 
Delphi 2005. 303 gotowe rozwiązania
Delphi 2005. 303 gotowe rozwiązaniaDelphi 2005. 303 gotowe rozwiązania
Delphi 2005. 303 gotowe rozwiązania
 
C++. 50 efektywnych sposobów na udoskonalenie Twoich programów
C++. 50 efektywnych sposobów na udoskonalenie Twoich programówC++. 50 efektywnych sposobów na udoskonalenie Twoich programów
C++. 50 efektywnych sposobów na udoskonalenie Twoich programów
 
C++. Styl i technika zaawansowanego programowania
C++. Styl i technika zaawansowanego programowaniaC++. Styl i technika zaawansowanego programowania
C++. Styl i technika zaawansowanego programowania
 
Visual Basic .NET. Ćwiczenia
Visual Basic .NET. ĆwiczeniaVisual Basic .NET. Ćwiczenia
Visual Basic .NET. Ćwiczenia
 
C++. Zaawansowane programowanie
C++. Zaawansowane programowanieC++. Zaawansowane programowanie
C++. Zaawansowane programowanie
 
Visual Basic 2005. Od podstaw
Visual Basic 2005. Od podstawVisual Basic 2005. Od podstaw
Visual Basic 2005. Od podstaw
 
Programowanie obiektowe w Visual Basic .NET dla każdego
Programowanie obiektowe w Visual Basic .NET dla każdegoProgramowanie obiektowe w Visual Basic .NET dla każdego
Programowanie obiektowe w Visual Basic .NET dla każdego
 
C++Builder. Kompendium programisty
C++Builder. Kompendium programistyC++Builder. Kompendium programisty
C++Builder. Kompendium programisty
 
Microsoft SQL Server 2005. Podręcznik programisty
Microsoft SQL Server 2005. Podręcznik programistyMicrosoft SQL Server 2005. Podręcznik programisty
Microsoft SQL Server 2005. Podręcznik programisty
 
Visual C# .NET. Encyklopedia
Visual C# .NET. EncyklopediaVisual C# .NET. Encyklopedia
Visual C# .NET. Encyklopedia
 
ArchiCAD 10
ArchiCAD 10ArchiCAD 10
ArchiCAD 10
 
Aplikacje w Delphi. Przykłady. Wydanie II
Aplikacje w Delphi. Przykłady. Wydanie IIAplikacje w Delphi. Przykłady. Wydanie II
Aplikacje w Delphi. Przykłady. Wydanie II
 

More from Wydawnictwo Helion

Tworzenie filmów w Windows XP. Projekty
Tworzenie filmów w Windows XP. ProjektyTworzenie filmów w Windows XP. Projekty
Tworzenie filmów w Windows XP. ProjektyWydawnictwo Helion
 
Blog, więcej niż internetowy pamiętnik
Blog, więcej niż internetowy pamiętnikBlog, więcej niż internetowy pamiętnik
Blog, więcej niż internetowy pamiętnikWydawnictwo Helion
 
Pozycjonowanie i optymalizacja stron WWW. Ćwiczenia praktyczne
Pozycjonowanie i optymalizacja stron WWW. Ćwiczenia praktycznePozycjonowanie i optymalizacja stron WWW. Ćwiczenia praktyczne
Pozycjonowanie i optymalizacja stron WWW. Ćwiczenia praktyczneWydawnictwo Helion
 
E-wizerunek. Internet jako narzędzie kreowania image&#39;u w biznesie
E-wizerunek. Internet jako narzędzie kreowania image&#39;u w biznesieE-wizerunek. Internet jako narzędzie kreowania image&#39;u w biznesie
E-wizerunek. Internet jako narzędzie kreowania image&#39;u w biznesieWydawnictwo Helion
 
Microsoft Visual C++ 2008. Tworzenie aplikacji dla Windows
Microsoft Visual C++ 2008. Tworzenie aplikacji dla WindowsMicrosoft Visual C++ 2008. Tworzenie aplikacji dla Windows
Microsoft Visual C++ 2008. Tworzenie aplikacji dla WindowsWydawnictwo Helion
 
Co potrafi Twój iPhone? Podręcznik użytkownika. Wydanie II
Co potrafi Twój iPhone? Podręcznik użytkownika. Wydanie IICo potrafi Twój iPhone? Podręcznik użytkownika. Wydanie II
Co potrafi Twój iPhone? Podręcznik użytkownika. Wydanie IIWydawnictwo Helion
 
Makrofotografia. Magia szczegółu
Makrofotografia. Magia szczegółuMakrofotografia. Magia szczegółu
Makrofotografia. Magia szczegółuWydawnictwo Helion
 
Java. Efektywne programowanie. Wydanie II
Java. Efektywne programowanie. Wydanie IIJava. Efektywne programowanie. Wydanie II
Java. Efektywne programowanie. Wydanie IIWydawnictwo Helion
 
Ajax, JavaScript i PHP. Intensywny trening
Ajax, JavaScript i PHP. Intensywny treningAjax, JavaScript i PHP. Intensywny trening
Ajax, JavaScript i PHP. Intensywny treningWydawnictwo Helion
 
PowerPoint 2007 PL. Seria praktyk
PowerPoint 2007 PL. Seria praktykPowerPoint 2007 PL. Seria praktyk
PowerPoint 2007 PL. Seria praktykWydawnictwo Helion
 
Serwisy społecznościowe. Budowa, administracja i moderacja
Serwisy społecznościowe. Budowa, administracja i moderacjaSerwisy społecznościowe. Budowa, administracja i moderacja
Serwisy społecznościowe. Budowa, administracja i moderacjaWydawnictwo Helion
 

More from Wydawnictwo Helion (20)

Tworzenie filmów w Windows XP. Projekty
Tworzenie filmów w Windows XP. ProjektyTworzenie filmów w Windows XP. Projekty
Tworzenie filmów w Windows XP. Projekty
 
Blog, więcej niż internetowy pamiętnik
Blog, więcej niż internetowy pamiętnikBlog, więcej niż internetowy pamiętnik
Blog, więcej niż internetowy pamiętnik
 
Access w biurze i nie tylko
Access w biurze i nie tylkoAccess w biurze i nie tylko
Access w biurze i nie tylko
 
Pozycjonowanie i optymalizacja stron WWW. Ćwiczenia praktyczne
Pozycjonowanie i optymalizacja stron WWW. Ćwiczenia praktycznePozycjonowanie i optymalizacja stron WWW. Ćwiczenia praktyczne
Pozycjonowanie i optymalizacja stron WWW. Ćwiczenia praktyczne
 
E-wizerunek. Internet jako narzędzie kreowania image&#39;u w biznesie
E-wizerunek. Internet jako narzędzie kreowania image&#39;u w biznesieE-wizerunek. Internet jako narzędzie kreowania image&#39;u w biznesie
E-wizerunek. Internet jako narzędzie kreowania image&#39;u w biznesie
 
Microsoft Visual C++ 2008. Tworzenie aplikacji dla Windows
Microsoft Visual C++ 2008. Tworzenie aplikacji dla WindowsMicrosoft Visual C++ 2008. Tworzenie aplikacji dla Windows
Microsoft Visual C++ 2008. Tworzenie aplikacji dla Windows
 
Co potrafi Twój iPhone? Podręcznik użytkownika. Wydanie II
Co potrafi Twój iPhone? Podręcznik użytkownika. Wydanie IICo potrafi Twój iPhone? Podręcznik użytkownika. Wydanie II
Co potrafi Twój iPhone? Podręcznik użytkownika. Wydanie II
 
Makrofotografia. Magia szczegółu
Makrofotografia. Magia szczegółuMakrofotografia. Magia szczegółu
Makrofotografia. Magia szczegółu
 
Windows PowerShell. Podstawy
Windows PowerShell. PodstawyWindows PowerShell. Podstawy
Windows PowerShell. Podstawy
 
Java. Efektywne programowanie. Wydanie II
Java. Efektywne programowanie. Wydanie IIJava. Efektywne programowanie. Wydanie II
Java. Efektywne programowanie. Wydanie II
 
JavaScript. Pierwsze starcie
JavaScript. Pierwsze starcieJavaScript. Pierwsze starcie
JavaScript. Pierwsze starcie
 
Ajax, JavaScript i PHP. Intensywny trening
Ajax, JavaScript i PHP. Intensywny treningAjax, JavaScript i PHP. Intensywny trening
Ajax, JavaScript i PHP. Intensywny trening
 
PowerPoint 2007 PL. Seria praktyk
PowerPoint 2007 PL. Seria praktykPowerPoint 2007 PL. Seria praktyk
PowerPoint 2007 PL. Seria praktyk
 
Excel 2007 PL. Seria praktyk
Excel 2007 PL. Seria praktykExcel 2007 PL. Seria praktyk
Excel 2007 PL. Seria praktyk
 
Access 2007 PL. Seria praktyk
Access 2007 PL. Seria praktykAccess 2007 PL. Seria praktyk
Access 2007 PL. Seria praktyk
 
Word 2007 PL. Seria praktyk
Word 2007 PL. Seria praktykWord 2007 PL. Seria praktyk
Word 2007 PL. Seria praktyk
 
Serwisy społecznościowe. Budowa, administracja i moderacja
Serwisy społecznościowe. Budowa, administracja i moderacjaSerwisy społecznościowe. Budowa, administracja i moderacja
Serwisy społecznościowe. Budowa, administracja i moderacja
 
AutoCAD 2008 i 2008 PL
AutoCAD 2008 i 2008 PLAutoCAD 2008 i 2008 PL
AutoCAD 2008 i 2008 PL
 
Bazy danych. Pierwsze starcie
Bazy danych. Pierwsze starcieBazy danych. Pierwsze starcie
Bazy danych. Pierwsze starcie
 
Inventor. Pierwsze kroki
Inventor. Pierwsze krokiInventor. Pierwsze kroki
Inventor. Pierwsze kroki
 

Aplikacje w Visual C++ 2005. Przykłady

  • 1. Aplikacje w Visual C++ 2005. Przyk³ady Autor: Mariusz Owczarek ISBN: 978-83-246-0875-1 Format: B5, stron: 216 Bogaty zbiór rozwi¹zañ czêsto spotykanych problemów programistycznych jêzyka Visual C++ • Poznaj œrodowisko tworzenia programów w Visual C++ 2005 • Naucz siê sk³adni jêzyka Visual C++ • Wykorzystaj mo¿liwoœci platformy .NET w programach w Visual C++ W kontekœcie programowania przy u¿yciu platformy .NET zwykle mówi siê o jêzykach Visual Basic i C#. Wiêkszoœæ stron internetowych, artyku³ów i ksi¹¿ek dotycz¹cych .NET zawiera kod napisany w³aœnie w nich. Co maj¹ zrobiæ programiœci, którzy od lat u¿ywaj¹ C++ i wcale nie chc¹ rezygnowaæ z jego licznych zalet? Czy jedynym wyborem jest nauka nowego jêzyka lub pozostanie poza œwiatem programowania dla .NET? Ksi¹¿ka „Aplikacje w Visual C++ 2005. Przyk³ady” zawiera dziesi¹tki krótkich zadañ wraz z rozwi¹zaniami, dziêki którym b³yskawicznie zaczniesz wykorzystywaæ mo¿liwoœci platformy .NET w programach pisanych w jêzyku C++. Poznasz œrodowisko Visual C++ 2005 Express Edition oraz podstawowe sk³adniki aplikacji pisanych w Visual C++. Nauczysz siê miêdzy innymi obs³ugiwaæ dane, przetwarzaæ pliki, korzystaæ z w¹tków oraz ³¹czyæ aplikacje z internetem. Dowiesz siê tak¿e, jak wykonaæ wiele innych operacji niezbêdnych w codziennej pracy programisty. • Œrodowisko Visual C++ 2005 Express Edition • Elementy aplikacji jêzyka Visual C++ • Przetwarzanie i wyœwietlanie danych • Praca z plikami • U¿ywanie okien dialogowych • Programy wielow¹tkowe • Stosowanie grafiki w aplikacjach • Tworzenie programów u¿ywaj¹cych sieci Wydawnictwo Helion • Sk³adnia jêzyka Visual C++ w pigu³ce ul. Koœciuszki 1c Przyspiesz wykonywanie codziennych zadañ programistycznych, 44-100 Gliwice stosuj¹c sprawdzone rozwi¹zania tel. 032 230 98 63 e-mail: helion@helion.pl
  • 2. Rozdział 1. Środowisko Visual C++ 2005 Express Edition ................................... 7 Język C++ a .NET Framework .......................................................................................... 7 Od czego zacząć? ............................................................................................................... 8 Podstawy obsługi środowiska ............................................................................................ 8 Wygląd środowiska w trybie budowy aplikacji .............................................................. 11 Struktura projektu ............................................................................................................ 11 Klasa okna głównego ....................................................................................................... 12 Rozdział 2. Podstawowe elementy aplikacji ...................................................... 15 Główne okno .................................................................................................................... 15 Przyciski .......................................................................................................................... 20 Etykiety ............................................................................................................................ 21 Pola tekstowe ................................................................................................................... 23 Wprowadzanie danych do aplikacji za pomocą pól tekstowych ..................................... 25 Wprowadzanie danych z konwersją typu ........................................................................ 26 Wyświetlanie wartości zmiennych .................................................................................. 28 Pole tekstowe z maską formatu danych ........................................................................... 28 Pola wyboru i przyciski opcji .......................................................................................... 31 Rozdział 3. Menu i paski narzędzi ..................................................................... 39 Rodzaje menu .................................................................................................................. 39 Komponent MenuStrip .................................................................................................... 39 Menu podręczne .............................................................................................................. 45 Skróty klawiaturowe w menu .......................................................................................... 46 Paski narzędzi .................................................................................................................. 48 Rozdział 4. Wprowadzanie i konwersja danych .................................................. 51 Wprowadzanie danych do aplikacji ................................................................................. 51 Prosta konwersja typów — klasa Convert ....................................................................... 51 Konwersja ze zmianą formatu danych ............................................................................. 52 Konwersja liczby na łańcuch znakowy ........................................................................... 55 Rozdział 5. Tablice, uchwyty i dynamiczne tworzenie obiektów .......................... 57 Tablice ............................................................................................................................. 57 Uchwyty ........................................................................................................................... 62 Dynamiczne tworzenie obiektów — operator gcnew ...................................................... 62 Dynamiczna deklaracja tablic .......................................................................................... 63
  • 3. 4 Aplikacje w Visual C++ 2005. Przykłady Rozdział 6. Komunikacja aplikacji z plikami ...................................................... 65 Pliki jako źródło danych .................................................................................................. 65 Wyszukiwanie plików ..................................................................................................... 66 Odczyt własności plików i folderów ............................................................................... 67 Odczyt danych z plików tekstowych ............................................................................... 68 Zapisywanie tekstu do pliku ............................................................................................ 71 Zapis danych do plików binarnych .................................................................................. 72 Odczyt z plików binarnych .............................................................................................. 73 Rozdział 7. Okna dialogowe ............................................................................. 75 Okno typu MessageBox ................................................................................................... 75 Okno dialogowe otwarcia pliku ....................................................................................... 77 Okno zapisu pliku ............................................................................................................ 79 Okno wyboru koloru ........................................................................................................ 80 Wybór czcionki ................................................................................................................ 81 Rozdział 8. Możliwości edycji tekstu w komponencie TextBox .......................... 83 Właściwości pola TextBox .............................................................................................. 83 Kopiowanie i wklejanie tekstu ze schowka ..................................................................... 85 Wyszukiwanie znaków w tekście .................................................................................... 85 Wstawianie tekstu między istniejące linie ....................................................................... 86 Elementy grafiki w polu tekstowym ................................................................................ 87 Rozdział 9. Komponent tabeli DataGridView ...................................................... 89 Podstawowe właściwości komponentu DataGridView ................................................... 89 Zmiana wyglądu tabeli .................................................................................................... 92 Dopasowanie wymiarów komórek tabeli do wyświetlanego tekstu ................................ 94 Odczytywanie danych z komórek tabeli .......................................................................... 96 Zmiana liczby komórek podczas działania aplikacji ..................................................... 100 Tabela DataGridView z komórkami różnych typów ..................................................... 103 Przyciski w komórkach — DataGridViewButtonCell .................................................. 106 Komórki z polami wyboru — DataGridViewCheckBoxCell ........................................ 108 Grafika w tabeli — komórka DataGridViewImageCell ................................................ 109 Komórka z listą rozwijaną — DataGridViewComboBoxCell ...................................... 110 Odnośniki internetowe w komórkach — DataGridViewLinkCell ................................ 112 Rozdział 10. Metody związane 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 Pióro Pen ........................................................................................................................ 124 Pędzle zwykłe i teksturowane ........................................................................................ 126 Rysowanie pojedynczych punktów — obiekt Bitmap .................................................. 129 Rysowanie trwałe — odświeżanie rysunku ................................................................... 129 Animacje ........................................................................................................................ 131 Rozdział 12. Podstawy aplikacji wielowątkowych ............................................. 133 Wątki ............................................................................................................................. 133 Komunikacja z komponentami z innych wątków — przekazywanie parametrów ....... 135 Przekazywanie parametrów do metody wątku .............................................................. 137 Klasa wątku — przekazywanie parametrów z kontrolą typu ........................................ 138 Komponent BackgroundWorker .................................................................................... 140
  • 4. Spis treści 5 Rozdział 13. Połączenie aplikacji z siecią internet ............................................. 145 Komponent WebBrowser .............................................................................................. 145 Przetwarzanie stron Web — obiekt HtmlDocument ..................................................... 148 Protokół FTP .................................................................................................................. 151 Pobieranie zawartości katalogu z serwera FTP ............................................................. 153 Pobieranie plików przez FTP ........................................................................................ 154 Wysyłanie pliku na serwer FTP ..................................................................................... 155 Klasa do wysyłania i odbierania plików z FTP korzystająca z wątków ........................ 157 Rozdział 14. Dynamiczne tworzenie okien i komponentów ................................. 161 Wyświetlanie okien — klasa Form ............................................................................... 161 Komponenty w oknie tworzonym dynamicznie ............................................................ 162 Przesyłanie danych z okien dialogowych ...................................................................... 163 Okno tytułowe aplikacji ................................................................................................. 164 Obsługa zdarzeń dla komponentów tworzonych dynamicznie ..................................... 165 Aplikacja zabezpieczona hasłem ................................................................................... 167 Dodatek A Skondensowane C++ .................................................................... 169 Skorowidz .................................................................................... 201
  • 5. Rozdział 11. Obiekt Graphics — kartka do rysowania Większości komponentów wizualnych VC++ zawiera właściwość Graphics, dzięki której można rysować, wypisywać teksty i umieszczać na nich grafiki w postaci bitmapy. Możesz pomyśleć o właściwości Graphics jako o kartce czy płótnie, na którym można tworzyć grafikę. Na początku po utworzeniu komponentu jego właściwość Graphics jest „pusta”. Przed rozpoczęciem rysowania trzeba stworzyć obiekt typu Graphics i „podpiąć” do tej właści- wości. Dopiero na tym obiekcie można rysować. Do tworzenia obiektu Graphics służy metoda CreateGraphics() wywoływana na komponencie, na którym chcemy rysować. Oprócz podłoża do rysowania niezbędne są także obiekty klasy Pen i Brush, a do wy- świetlania tekstu także obiekt opisujący czcionkę typu Font. Pen — pióro, jakim rysujemy. Brush — (pędzel) rodzaj wypełnienia rysowanych obiektów (kolor, deseń). Mamy dwa rodzaje pędzli: SolidBrush to pędzel jednokolorowy, TextureBrush zaś wypełnia obiekty deseniem z podanej bitmapy. Font — określa czcionkę do rysowania napisów. Zasadę rysowania najlepiej wyjaśni prosty przykład.
  • 6. 120 Aplikacje w Visual C++ 2005. Przykłady Przykład 11.1. Po naciśnięciu przycisku narysuj ukośną niebieską linię na oknie aplikacji. Rozwiązanie Do nowego projektu aplikacji wstaw przycisk Button. Po naciśnięciu przycisku należy utworzyć obiekt typu Graphics dla głównego okna aplikacji, a następnie obiekt pióra Pen. Ponieważ metoda button1_Click() jest metodą klasy reprezentującej główne okno, odwołujemy się do tego okna za pomocą wskaźnika this. Teraz można już rysować po oknie, korzystając z metody obiektu Graphics ry- sującej linie. Oto kod metody, którą należy 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 naciśnięciu przycisku na oknie pojawi się linia jak na rysunku 11.1. Rysunek 11.1. Rysowanie na oknie aplikacji Zauważ, że pióro Pen i pędzel Brush nie są właściwościami obiektu Graphics, ale od- dzielnymi obiektami. Obiekt Graphics posiada wiele metod służących do rysowania punktów, linii, figur, a nawet wyświetlania całych bitmap z plików. Zestawienie metod klasy Graphics podaje tabela 11.1. Tabela 11.1. Wybrane metody rysujące obiektu Graphics Metoda Działanie DrawLine(Pen^ pi,int x1,int y1,int x2,int y2) Rysuje linie o początku w x1, y1 i końcu w x2, y2, używając pióra pi. DrawArc(Pen^ pi,float x,float y,float szer, Wycinek okręgu lub elipsy rysowany piórem pi, float wys,float kąt_start,float kąt) środek w (x, y), łuk mieści się w prostokącie o wymiarach szer i wys, zaczyna się od kąta kąt_start i biegnie przez kąt stopni.
  • 7. Rozdział 11. ¨ Grafika w aplikacjach Visual C++ 121 Tabela 11.1. Wybrane metody rysujące obiektu Graphics (ciag dalszy) Metoda Działanie DrawBezier(Pen^ pi,float x1,float y1,float x2, Rysuje krzywą sklejaną Beziera przez cztery float y2,float x3,float y3,float x4,float y4) podane punkty. DrawBeziers(Pen^ pi, array<System::Drawing: Rysuje serię krzywych Beziera zgodnie z podaną :PointF>^ punkty) tablicą punktów. DrawClosedCurve(Pen^ pi, array<System::Drawing: Rysuje zamkniętą krzywą sklejaną zgodnie :PointF>^ punkty) z podaną tablicą punktów. DrawCurve(Pen^ pi, array<System::Drawing: Rysuje krzywą sklejaną (spline) między :PointF>^ punkty) punktami podanymi w tabeli. DrawEllipse(Pen^ pi,float x, float y, Rysuje elipsę mieszczącą się w prostokącie float szer, float wys) określonym współrzędnymi oraz wysokością i szerokością. DrawIcon(Icon^ ikona, int x, int y) Rysuje ikonę w podanych współrzędnych. DrawImage(Image^ obraz,int x,int y) Rysuje bitmapę obraz we współrzędnych (x, y). DrawPie(Pen^ pi,float x,float y,float szer, Rysuje wycinek koła piórem pi, środek w (x, y), float wys,float kąt_start,float kąt) wycinek mieści się w prostokącie o wymiarach szer i wys, zaczyna się od kąta kąt_start i biegnie przez kąt stopni. DrawPolygon(Pen^ pi, array<System::Drawing: Tworzy zamknięty wielobok o wierzchołkach :PointF>^ punkty) określonych w tabeli punkty. DrawRectangle(Pen^ pi,float x,float y, Rysuje prostokąt o lewym górnym rogu float szer,float wys) w punkcie (x, y) i bokach o długości szer i wys. DrawString(String^ tekst,Font^ czcionka, Wypisuje tekst tekst z lewym górnym rogiem Brush^ pędzel, float x,float y) w punkcie (x, y), używając podanej czcionki i pędzla. FillClosedCurve(Brush^ pędzel, array<System: Tworzy wypełnioną pędzlem pędzel zamkniętą :Drawing::PointF>^ punkty) krzywą sklejaną (spline) określona punktami punkty. FillEllipse(Brush^ pędzel, float x, float y, Rysuje elipsę w prostokącie określonym float szer, float wys) współrzędnymi (x, y) oraz wysokością i szerokością wypełniona pędzlem pędzel. FillPie(Brush^ pędzel, float x,float y, Maluje wypełniony pędzlem pędzel wycinek float szer,float wys,float kąt_start,float kąt) koła, środek w (x, y), wycinek mieści się w prostokącie o wymiarach szer i wys, zaczyna się od kąta kąt_start i biegnie przez kąt stopni. FillPolygon(Brush^ pędzel, array<System: Tworzy wypełniony pędzlem pędzel wielokąt :Drawing::PointF>^ punkty) o wierzchołkach w tabeli punkty. FillRectangle(Brush^ pędzel, float x,float y, Rysuje wypełniony pędzlem pędzel prostokąt float szer,float wys) o lewym górnym rogu w punkcie (x, y) oraz podanej szerokości i wysokości. Clear(Color kolor) Czyści całą powierzchnię rysunku i wypełnia ją kolorem kolor. Ponieważ metod jest dużo i każda ma kilka postaci, tabela 11.1 podaje tylko po jednej postaci każdej metody, aby możliwe było zestawienie wszystkich.
  • 8. 122 Aplikacje w Visual C++ 2005. Przykłady Przykład 11.2. Wyświetl w oknie programu tekst podany w polu tekstowym. Nie używaj komponentu Label. Rozwiązanie Utwórz nowy projekt aplikacji i wstaw do okna pole tekstowe TextBox oraz przycisk Button. Po naciśnięciu przycisku zostanie utworzony pędzel 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 działania aplikacji przedstawia rysunek 11.2. Rysunek 11.2. Rysowanie tekstu w oknie aplikacji Przykład 11.3. Po naciśnięciu przycisku wyświetl na formularzu wykres ze współrzędnych podanych w polach tekstowych. Rozwiązanie Wstaw do okna aplikacji dziesięć pól tekstowych TextBox, dwie etykiety Label i przy- cisk Button. Powiększ wymiary okna, a pod właściwości Text etykiet i przycisku podstaw odpo- wiednie teksty, tak aby całość wyglądała jak na rysunku 11.3 (na razie bez wykresu i wpisanych współrzędnych).
  • 9. Rozdział 11. ¨ Grafika w aplikacjach Visual C++ 123 Rysunek 11.3. Aplikacja do rysowania wykresów Po naciśnięciu przycisku Rysuj współrzędne będą pobierane z pól tekstowych i prze- kazywane do tablicy obiektów System::Drawing::PointF, które reprezentują punkty na płaszczyźnie. Następnie 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); } Przykład 11.4. Po każdym naciśnięciu przycisku wyświetl w oknie prostokąt o losowych współrzęd- nych, losowych wymiarach i losowym kolorze. Rozwiązanie Do nowego projektu aplikacji wstaw przycisk Button. Aby wygenerować współrzędne i kolor prostokątów, będziemy potrzebować generatora liczb losowych. Jest to obiekt typu Random, który trzeba utworzyć, a następnie można pobierać z niego liczby, używając metody Next() tego obiektu. Po wygenerowaniu liczb prostokąt rysujemy za pomocą metody FillRectangle(). Kolor pędzla definiu- jemy za pomocą trzech liczb losowych określających składowe RGB. Oto metoda zda- rzenia Click przycisku:
  • 10. 124 Aplikacje w Visual C++ 2005. Przykłady 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); } Przykład 11.5. Wyświetl w oknie plik rysunek.jpg z lewym górnym rogiem w punkcie (100, 100). Rozwiązanie Wstaw do aplikacji przycisk Button. Aby wyświetlić obrazek, najpierw utworzymy obiekt Image zawierający plik rysunek.jpg (plik o takiej nazwie trzeba wcześniej umieścić w folderze programu), a następnie wy- świetlimy go w oknie, używając 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); } Pióro Pen Używany już przez nas obiekt Pen, czyli pióro, daje wiele możliwości. Za pośrednic- twem właściwości tego obiektu można sterować zarówno grubością linii, jak i rysować linie przerywane, wybierać styl rozpoczęcia i zakończenia linii itp. Najważniejsze wła- ściwości przedstawia tabela 11.2. Przykład 11.6. Wyświetl w oknie kilka linii rysowanych różnymi stylami. Rozwiązanie Utwórz nowy projekt aplikacji i wstaw do niego przycisk Button. Po naciśnięciu przycisku będziemy zmieniać parametry pióra i rysować nim kolejne linie. Oto metoda dla zdarzenia Click przycisku:
  • 11. Rozdział 11. ¨ Grafika w aplikacjach Visual C++ 125 Tabela 11.2. Niektóre właściwości obiektu Pen Właściwość Znaczenie Width Szerokość pióra w punktach. Brush Pędzel, jakim rysowana jest linia. Color Kolor linii. StartCap Rodzaj znaczka dodawanego na rozpoczęcie linii. Wartości tej właściwości są typu System::Drawing::Drawing2D::LineCap, oto kilka z nich: System::Drawing::Drawing2D::LineCap::Square — linia z kwadratowym zakończeniem, System::Drawing::Drawing2D::LineCap::ArrowAnchor — linia ze strzałką, System::Drawing::Drawing2D::LineCap:: riangle — linia z trójkątem. EndCap Rodzaj zakończenia linii, wartości takie, jak w StartCap. DashStyle Ustawia linię przerywaną. Wartości to: System::Drawing::Drawing2D::DashStyle::Dash — linia z kresek, System::Drawing::Drawing2D::DashStyle::DashDot — linia składająca się z kresek i kropek, System::Drawing::Drawing2D::DashStyle::DashDotDot — linia z kreski i dwóch kropek, System::Drawing::Drawing2D::DashStyle::Dot — linia z kropek, System::Drawing::Drawing2D::DashStyle::Solid — linia ciągła. DashCap Ustawia rodzaj zakończenia elementów linii przerywanej. Wartości to: System::Drawing::Drawing2D::DashCap::Flat — zakończenie prostokątne, System::Drawing::Drawing2D::DashCap:: riangle — zakończenie trójkątne, System::Drawing::Drawing2D::DashCap::Round — zakończenie zaokrąglone. DashOffset Przesunięcie wzoru kreskowanej linii względem początku 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);
  • 12. 126 Aplikacje w Visual C++ 2005. Przykłady 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 naciśnięciu przycisku przedstawia rysunek 11.4. Rysunek 11.4. Działanie różnych rodzajów piór Pędzle zwykłe i teksturowane Pędzle są obiektami dwóch klas potomnych klasy Brush, mianowicie SolidBrush i TextureBrush. Pierwszy z nich to pędzel jednokolorowy, natomiast drugi maluje za pomocą podanych bitmap (tekstur) i daje znacznie większe możliwości. Kolor pędzla SolidBrush ustawiamy, używając właściwości Color tego obiektu. Właściwości pędzla TextureBrush przedstawia tabela 11.3. Przykład 11.7. Narysuj na oknie aplikacji dwa wycinki kół, jeden wypełniony jednym kolorem i drugi wypełniony teksturą pobraną z pliku rysunek.jpg w ułożeniu kafelkowym. Rozwiązanie Utwórz nowy projekt aplikacji i wstaw do niego przycisk Button. Po naciśnięciu tego przycisku utworzymy dwa pędzle: jednokolorowy i teksturowany, a następnie wyświetlimy wycinki kół za pomocą metody FillPie(). Aby program dzia- łał, potrzebny jest rysunek rysunek.jpg w folderze programu.
  • 13. Rozdział 11. ¨ Grafika w aplikacjach Visual C++ 127 Tabela 11.3. Właściwości pędzla TextureBrush Właściwość Znaczenie Image Określa bitmapę (teksturę) pędzla. WrapMode Sposób wyświetlania tekstury: System::Drawing::Drawing2D::WrapMode:: ile — tekstura wyświetlana jest sąsiadująco (jak kafelki), System::Drawing::Drawing2D::WrapMode::Clamp — tekstura wyświetlana jest jako pojedyncza, System::Drawing::Drawing2D::WrapMode:: ileFlipX — wyświetlanie sąsiadująco tekstury obróconej względem osi X, System::Drawing::Drawing2D::WrapMode:: ileFlipY — jak wyżej, ale względem osi Y, System::Drawing::Drawing2D::WrapMode:: ileFlipXY — jak wyżej, ale obrócenie względem obu osi. ransform Określa transformacje, jakim może zostać poddana tekstura przed wyświetleniem. Może 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 naciśnięciu przycisku aplikacja może wyglądać tak, jak na ry- sunku 11.5 (efekt jest zależny od zawartości rysunku użytego do teksturowania). Rysunek 11.5. Malowanie pędzlem zwykłym i teksturowanym Kafelkowe układanie tekstury jest opcją domyślną, dlatego linię pedz_text->WrapMode=System::Drawing::Drawing2D::WrapMode:: ile; można pominąć i nie zmieni to efektu działania programu.
  • 14. 128 Aplikacje w Visual C++ 2005. Przykłady Zajmiemy się teraz właściwością Transform umożliwiającą transformacje tekstury przed jej wyświetleniem. Właściwość ta może przybierać wartości typu System::Drawing: :Drawing2D::Matrix, które są macierzami transformacji. Obiekt Matrix jest macierzą 3´3, a każda liczba w macierzy oznacza rodzaj transformacji obiektu. Strukturą macierzy nie będziemy się tu zajmować, ponieważ do podstawowych operacji na tekturach jej znajomość nie jest potrzebna. Operacje na macierzy można wykonywać za pomocą metod klasy Matrix. Tabela 11.4 przedstawia niektóre z nich. Tabela 11.4. Metody transformujące obiektu Matrix (macierzy transformacji) Metoda Znaczenie Rotate(Single kąt) Obraca teksturę o kąt stopni w prawo. RotateAt(Single kąt, PointF punkt) Obraca teksturę o kąt 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 polegająca na obrocie płaszczyzny rysunku wokół osi X lub Y. ranslate(Single odlX, Single odlY) Przesuwa teksturę o odlX i odlY punktów w kierunku odpowiednich osi. Przykład 11.8. Narysuj kwadrat wypełniony teksturą z pliku rysunek.jpg w ułożeniu kafelkowym, tekstura ma być obrócona o 20 stopni i przesunięta o 10 punktów w kierunku osi Y. Rozwiązanie Do nowego projektu aplikacji wstaw przycisk Button. Do zdarzenia Click przycisku przypiszemy metodę, w której utworzymy macierz transformacji, w tej macierzy zapiszemy odpowiednie transformacje za pomocą metod Rotate() i Translate(). Następnie podstawimy tę macierz do właściwości Transform pędzla, którym 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); }
  • 15. Rozdział 11. ¨ Grafika w aplikacjach Visual C++ 129 Rysowanie pojedynczych punktów — obiekt Bitmap Jak może zauważyłeś, na obiekcie Graphics nie da się wykonywać operacji na poje- dynczych punktach obrazu. Aby rysować pojedyncze piksele, należy stworzyć obiekt typu Bitmap, na nim rysować piksele za pomocą dostępnej w nim metody SetPixel(), a następnie wyświetlić cały obiekt Bitmap na obiekcie Graphics za pomocą metody DrawImage(). Przykład 11.9. Narysuj na oknie aplikacji dwieście punktów o losowych współrzędnych i w losowych kolorach. Rozwiązanie W oknie aplikacji umieść przycisk Button. Po kliknięciu przycisku utworzymy obiekt Bitmap, na którym w pętli for zostanie umieszczonych dwieście punktów. Następnie ten obiekt zostanie wyświetlony na obiek- cie Graphics okna aplikacji, czyli punkty pojawią się na tym oknie. Metoda DrawImage() wymaga argumentu typu Image, a ponieważ obiekt bitmapa jest typu Bitmap, trzeba za- stosować konwersję typów. 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 trwałe — odświeżanie rysunku System Windows nie zapamiętuje zawartości okien po ich narysowaniu. Związane jest to z oszczędnością pamięci — dlatego narysowane obiekty znikają na przykład po przykryciu okna rysunku przez inne okno. Kiedy okno jest wyświetlane, powtórnie
  • 16. 130 Aplikacje w Visual C++ 2005. Przykłady jest odświeżane i wszystkie kontrolki są malowane jeszcze raz. Generowane jest wtedy zdarzenie Paint. Aby rysunek był w dalszym ciągu widoczny w oknie, należy go rów- nież odświeżyć. W praktyce oznacza to, że metoda obsługująca zdarzenie Paint po- winna rysować rysunek jeszcze raz. Przykład 11.10. Stwórz aplikację z dwoma polami wyboru CheckBox, niech pierwsze pole włącza i wyłą- cza rysunek kwadratu w oknie, a drugie — rysunek koła. Rysunek ma być zachowy- wany po przykryciu okna przez inne okno. Rozwiązanie Utwórz aplikację z dwoma polami wyboru. We właściwość Text pierwszego pola wy- boru wpisz „Kwadrat”, a drugiego — „Koło”. Najpierw napisz metodę rysującą koło i kwadrat podanego koloru. Metodę umieść w klasie Form1, podobnie jak metody obsługujące 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 obsługę zdarzenia Paint. W widoku budowy okna aplikacji (zakładka Form1.h [Design]) kliknij budowane okno aplikacji, a następnie w prawym panelu przełącz się na widok zdarzeń (ikona błyskawicy). Teraz znajdź zdarzenie Paint i klik- nij je dwukrotnie. Zostaniesz przeniesiony do kodu aplikacji, gdzie utworzy się metoda Form1_Paint(). Metoda ta będzie rysowała figury, gdy będą zaznaczone odpowiednie pola. Uzupełnij ją jak niżej. 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 końcu zaprogramuj reakcję na zaznaczenie lub wyczyszczenie pól wyboru. Kliknij pole „Kwadrat” dwukrotnie i uzupełnij powstałą metodę, która będzie obsługiwała zmianę stanu zaznaczenia pola pierwszego:
  • 17. 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 — „Koło”: 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 wypróbuj działanie programu. Zaznaczenie pól powoduje wyświetlenie figur, które nie znikają po zakryciu innym oknem. Wygląd aplikacji przedstawia rysunek 11.6. Rysunek 11.6. Aplikacja z trwałym rysowaniem Animacje Animacje najłatwiej uzyskać, wykorzystując komponent Timer. Jednym ze sposobów jest wycieranie rysunku z poprzedniego kroku animacji i rysowanie nowego za każdym razem, kiedy generowane jest zdarzenie Tick komponentu Timer. Przykład 11.11. Napisz program wyświetlający animowany prostokąt w oknie. Prostokąt powinien się poruszać w górę i w dół przez całą wysokość okna. Rozwiązanie Utwórz nowy projekt aplikacji i wstaw do niego komponent Timer oraz dwa przyciski. Przyciski będą służyły do rozpoczęcia i zatrzymania ruchu prostokąta. We właściwość Text pierwszego przycisku wstaw „Start”, a drugiego — „Stop”.
  • 18. 132 Aplikacje w Visual C++ 2005. Przykłady Najpierw musimy utworzyć dwa pola klasy, które będą określały aktualną współ- rzędną y prostokąta i krok jego przesunięcia. Pola te zadeklaruj w klasie Form1, tak jak deklarujemy metody: private: System::Int16 krok; private: System::Int16 y; Na pasku niewidocznych komponentów na dole zakładki projektowania aplikacji za- znacz komponent Timer i przejdź do jego zdarzeń w prawym panelu. Kliknij dwukrotnie zdarzenie Tick, tworząc metodę uruchamianą czasomierzem. W tej metodzie będą rysowane dwa prostokąty; jeden w kolorze formularza spowoduje wytarcie prostokąta z poprzedniego kroku, następnie będzie zmieniana współrzędna i rysowany nowy przesunięty prostokąt. Metodę zmodyfikuj jak niżej. 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, która określa przesunięcie prostokąta w jednej klatce animacji, zainicja- lizuj w chwili tworzenia okna. Wykorzystamy do tego zdarzenie FormLoad. private: System::Void Form1_Load(System::Object^ sender, System::EventArgs^ e) { krok=2; } Pozostało jeszcze zaprogramowanie metod wywoływanych przy naciśnięciu przyci- sków. Pierwszy przycisk będzie 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 naciśnięciu przycisku Start prostokąt będzie się poruszał w górę i w dół okna. Szybkość jego poruszania się zależy od właściwości Interval komponentu Timer.