C++ Builder. Programowanie obiektowe. Ćwiczenie 3. 1
______________________________________________________________________
©2004 Jerzy Kluczewski
PROGRAMOWANIE OBIEKTOWE
ĆWICZENIE 3
C++ BUILDER 6.0 PE
•
Projektowanie prostej grafiki
•
Obiekt TCanvas
•
Obiekt TscrollBar
•
Obiket TLabel
•
Metoda MouseDown
•
Metoda MouseUp
•
Metoda MouseMove
•
Zdarzenie OnMouseDown
•
Zdarzenie OnMouseUp
•
Zdarzenie OnMouseMove
•
Zdarzenie TScrollBar->OnChange
•
Plik nagłówkowy
2
C++ Builder. Programowanie obiektowe. Ćwiczenie 3.
______________________________________________________________________
I.
Wstęp
Naszą przygodę z grafiką w C++ Builderze rozpoczniemy od obiektu Canavas (ang.
płótno).
Nasz projekt plikacji zapiszemy w plikach rozpoczynających się od nazwy Grafika3.
Utwórz projekt aplikacji za pomocą polecenia File
New
Application
Zapisz projekt aplikacji za pomocą polecenia File
Save All ...
C++ Builder. Programowanie obiektowe. Ćwiczenie 3. 3
______________________________________________________________________
©2004 Jerzy Kluczewski
Zapisz projekt do plików:
•
formularza do Grafika3Unit1.cpp,
•
głównego pliku projektu Grafika3.bpr
Zmień tytuł formularza Form1:
Ustaw opcje projektu za pomocą polecenia Project
Options ...
a w oknie zmień następujące opcje:
Polecenie: Project
Options
Application
Load Icon
4
C++ Builder. Programowanie obiektowe. Ćwiczenie 3.
______________________________________________________________________
W polu „Nazwa pliku” ustaw Grafika3.ico.
Po zatwierdzeniu w panelu „Icon” pojawi się właściwa ikona.
Przejdź do zakładki „Linker”
Wyłącz opcję „Use dynamic RTL”.
Przejdź do zakładki „Packeges”
Wyłącz opcję „Build with runtime packages”.
Zatwierdź opcje projektu Grafika3 za pomocą przycisku „OK.” i przejdź do
następnego rozdziału.
C++ Builder. Programowanie obiektowe. Ćwiczenie 3. 5
______________________________________________________________________
©2004 Jerzy Kluczewski
II.
Obiekt Canvas
Za pomocą klawisza F12 przejdź do okna edytora kodu C++:
Oto plik źródłowy Grafika3Unit1.cpp w C++ :
Otwórz plik nagłówkowy Grafika3Unit1.h :
Kliknij na zakładce zawierającej napis „Grafika3Unit1.cpp” prawym przyciskiem
myszy i wybierz pozycję „Open Source/Header File”.
6
C++ Builder. Programowanie obiektowe. Ćwiczenie 3.
______________________________________________________________________
W oknie edytora pojawi się zawartość pliku nagłowkowego:
W sekcji „public:” wstaw deklarację znacznika rysowania:
bool Rysuj;
Projektowanie zdarzenia OnMouseDown
Zdarzenie OnMouseDown określa naciśnięcie myszy.
Teraz zaprojektujemy odpowiedź formularza na naciśnięcie myszy.
Za pomocą klawisza F11 przechodzimy do okna Object Inspector. Wybieramy
zakładkę Events i wyszukujemy zdarzenie „OnMouseDown”.
Klikamy dwa razy na tym napisie OnMouseDown.
C++ Builder. Programowanie obiektowe. Ćwiczenie 3. 7
______________________________________________________________________
©2004 Jerzy Kluczewski
Pojawia się okno kodu C++ i pusta metoda TForm1::FormMouseDown:
W metodzie tej wpisujemy pomiędzy nawiasami klamrowymi { i } nastepujący kod:
// okreslamy obszar rysowania i pozycję początkową
Canvas->FillRect(ClientRect);
Canvas->MoveTo(X,Y);
//ustawiamy znacznik rysowania, aby mysz zostawiła slad
Rysuj = true;
Projektowanie zdarzenia OnMouseUp
Zdarzenie OnMouseUp określa puszczenie myszy.
Teraz zaprojektujemy odpowiedź formularza na puszczenie klawisza myszy.
W oknie Object Inspector wybieramy zakładkę Events i wyszukujemy zdarzenie
„OnMouseUp”.
Klikamy dwa razy na tym napisie OnMouseUp.
8
C++ Builder. Programowanie obiektowe. Ćwiczenie 3.
______________________________________________________________________
Pojawia się okno kodu C++ i pusta metoda TForm1::FormMouseUp:
W metodzie tej wpisujemy pomiędzy nawiasami klamrowymi { i } nastepujący kod:
// puszczono przycisk myszy - koniec rysowania
Rysuj = false;
Projektowanie zdarzenia OnMouseMove
Zdarzenie OnMouseMove określa poruszanie się myszy.
Teraz zaprojektujemy odpowiedź formularza na poruszanie się myszy.
W oknie Object Inspector wybieramy zakładkę Events i wyszukujemy zdarzenie
„OnMouseMove”.
Klikamy dwa razy na tym napisie OnMouseMove.
Pojawia się okno kodu C++ i pusta metoda TForm1::FormMouseMove:
C++ Builder. Programowanie obiektowe. Ćwiczenie 3. 9
______________________________________________________________________
©2004 Jerzy Kluczewski
W metodzie tej wpisujemy pomiędzy nawiasami klamrowymi { i } nastepujący kod:
if (Rysuj) // przesunięto mysz
Canvas->LineTo(X, Y);
Sprawdzamy działanie naszego projektu:
Run
Run (F9)
Projekt działa!!! Dodajmy teraz parę “bajerów”.
Obiekt ScrollBar
Dodajmy możliwość rysowania w dowolnym kolorze. Do naszego formularza
dodajemy trzy komponenty ScrollBar i trzy etytkiety Label. Etykietom nadajemy
kolejno właściwości: „Czerwony”, „Zielony”, „Niebieski”. I ustawiamy je obok
kolejnych obiektów ScrollBar.
10
C++ Builder. Programowanie obiektowe. Ćwiczenie 3.
______________________________________________________________________
Właściwości Max wszystkich obiektów ScrollBar ustawiamy na 255 (0-255 daje 266
odcieni każdego koloru).
W kodzie metody TForm1::FormMouseDown wykasuj linię
Canvas->FillRect(ClientRect);
W pliku nagłówkowym Grafika3Unit1.h w sekcji public dopisz nagłówek funkcji
UstKolor:
__fastcall UstKolor(void);
Przejdź do kodu C++ Grafika3Unit1.cpp i dopisz metodę
__fastcall Form1::UstKolor(void):
__fastcall TForm1::UstKolor(void)
{
int NowyKolor;//w tej zmiennej wyliczymy nowy kolor
NowyKolor=ScrollBar1->Position; // Zaczynamy od koloru czerwonego
NowyKolor+=ScrollBar2->Position<<8;// Zielony przesuwamy o 8 bitów w lewo
NowyKolor+=ScrollBar3->Position<<16;// Niebieski - 16 bitów w lewo
// Tak oto dostaliśmy jeden z 16mln kolorów (256*256*256 kombinacji)
Canvas->Pen->Color=NowyKolor; // ustawiamy kolor pióra
}
C++ Builder. Programowanie obiektowe. Ćwiczenie 3. 11
______________________________________________________________________
©2004 Jerzy Kluczewski
Okno edycji kodu C++ funkcji Form1::UstKolor(void)
Przejdź do widoku formularza (klawisz F12) i zaznacz kolejno trzy komponenty
ScrollBar:
Zmiana koloru kreślenia
Powiązanie zdarzenia zmiany pozycji obiektu ScrollBar z wywołaniem funkcji
UstKolor:
Zaznacz kolejny obiekt ScrollBar
Przejdź do okienka Obiect Inspector i zaznacz zdarzenie OnChange:
Kliknij dwa razy i w oknie kodu C++ wpisz wywołanie funkcji UstKolor().
12
C++ Builder. Programowanie obiektowe. Ćwiczenie 3.
______________________________________________________________________
Okno edycji kodu C++ funkcji Form1:: ScrollBar1Change
Powyższe czynności musisz wykonać dla każdego z trzech komponentów ScrollBar:
Sprawdzamy działanie naszego projektu:
Run
Run (F9)
Możemy dowolnie wybierać kolor kreślonej linii!!!
C++ Builder. Programowanie obiektowe. Ćwiczenie 3. 13
______________________________________________________________________
©2004 Jerzy Kluczewski
III.
Podsumowanie
Nasz projekt zawiera następujące obiekty:
•
Paski przewijania:
TScrollBar *ScrollBar1;
TScrollBar *ScrollBar2;
TScrollBar *ScrollBar3;
•
Etykiety:
TLabel *Label1;
TLabel *Label2;
TLabel *Label3;
•
Metody:
FormMouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift,
int X, int Y);
FormMouseUp(TObject *Sender, TMouseButton Button, TShiftState Shift,
int X, int Y);
FormMouseMove(TObject *Sender, TShiftState Shift,
int X, int Y);
ScrollBar1Change(TObject *Sender);
ScrollBar2Change(TObject *Sender);
ScrollBar3Change(TObject *Sender);
•
Zmienne:
bool Rysuj;
•
Funkcje:
UstKolor(void);
14
C++ Builder. Programowanie obiektowe. Ćwiczenie 3.
______________________________________________________________________
IV.
DODATEK
Klasa TCanvas
Lista wybranych właściwości obiektu Canvas.
Właściwość
Opis
Font
Specyfikuje czcionkę (font) dla tekstu umieszczanego na obrazie.
Obiekt klasy TFont dokładnie określa rodzaj fontu, jego rozmiar,
kolor i styl..
Brush
Określa kolor i wzór używany do wypełnienia figur graficznych
oraz tła.. Właściwości obiektu klasy TBrush specyfikują kolor i
wzór lub mapę bitową używaną do wypełnienia obszaru obiektu
Canvas.
Pen
Specyfikuje rodzaj pióra użytego do rysowania linii lub obrysu
kształtu.. Właściwości klasy TPen określają dokładnie kolor, styl,
szerokość.
PenPos
Aktualna pozycja pióra.
Pixels
Specyfikuje kolor pikseli w obszarze aktualnego obiektu
ClipRect. Jest to prostokątna tablica zadeklarowana jako
__property TColor Pixels[int X][int Y].
Lista wybranych metod obiektu Canvas.
Metoda
Opis
Arc(int X1, int Y1, int X2, int Y2, int X3, int
Y3, int X4, int Y4);
Rysuje linię eliptyczną mieszczącą się w
obszarze prostokątnym określonym przez
punkty (X1,Y1) (X2,Y2); linia jest kreślona
od punktu startowego (X3,Y3) do końcowego
(X4,Y4).
CopyRect(const TRect &Dest, TCanvas*
Canvas, const TRect &Source);
Kopiuje część obrazu z jednego obiektu
Canvas do innego obiektu Canvas.
Draw(int X, int Y, TGraphic* Graphic);
Renderuje obiekt graficzny Graphic w
Canvas na pozycji podanej przez (X, Y).
Ellipse(int X1, int Y1, int X2, int Y2);
Rysuje elipsę lub okrąg wpisany w obszar
prostokątny określony przez punkty (X1,Y1)
(X2,Y2)
FillRect (const TRect &Rect);
Wypełnia obszar prostokątny Rect używając
aktualnego wzoru.
FrameRect (const Types::TRect &Rect);
Rysuje prostokąt – obramowanie używa
aktualnego wzoru.
LineTo(int X, int Y);
Rysuje linie od pozycji PenPos do punktu
określonego przez X i Y, a potem ustawia
pozycję pióra na wartość (X, Y).
C++ Builder. Programowanie obiektowe. Ćwiczenie 3. 15
______________________________________________________________________
©2004 Jerzy Kluczewski
Lista wybranych metod obiektu Canvas (ciąg dalszy)
Metoda
Opis
MoveTo(int X, int Y);
Zmienia aktualną pozycję rysowania PenPos
na (X,Y).
Polygon(const TPoint * Points, const int
Points_Size);
Rysuje serie linii tworząc wielobok
zamknięty. Parametr Points jest tablicą
opisującą punkty węzłowe. Parametr
Points_Size jest indeksem ostatniego punktu
w tablicy. Pierwszy punkt zostaje połączony z
ostatnim.
Polyline(const Types::TPoint* Points, const
int Points_Size);
Rysuje serie linii – łączących każdy punkt z
punktów podanych w parametrze Points.
Parametr Points_Size określa indeks
ostatniego punktu w tablicy Points.
Rectangle(int X1, int Y1, int X2, int Y2);
Rysuje prostokąt – lewy górny narożnik
określany jest jako punkt (X1, Y1) a dolny
prawy to punkt (X2, Y2).
RoundRect(int X1, int Y1, int X2, int Y2, int
X3, int Y3);
Rysuje prostokąt z zaokrąglonymi
narożnikami. X3 – szerokość zaokrąglenia,
Y3 – wysokość zaokrąglenia.
TextHeight(const AnsiString Text);
TextWidth(const AnsiString Text);
Zwraca wysokość i szerokość jaką zajmuje
łańcuch tekstowy na obrazie. Uwzględnia
użytą czcionkę oraz spacje początkowe.
TextOut(int X, int Y, const AnsiString Text); Rysuje łańcuch tekstowy w obiekcie Canvas,
od pozycji (X,Y), wartość PenPos ustawia na
końcu łańcucha.
TextRect(const Types::TRect &Rect, int X,
int Y, const AnsiString Text);
Rysuje łańcuch tekstowy wewnątrz regionu;
część tekstu przekraczającego granice regionu
zostanie obcięta.