C++ Builder. Programowanie obiektowe. Ćwiczenie 6. 1
______________________________________________________________________
©2004 Jerzy Kluczewski
PROGRAMOWANIE OBIEKTOWE
ĆWICZENIE 6
C++ BUILDER 6.0 PE
•
Projektowanie prostych dywanów
•
Obiekt TForm
•
Obiekt TCanvas
•
Zdarzenie OnPaint
•
Typ TColor
•
Funkcja sin()
•
Funkcja RGB()
•
Właściwość TCanvas->Pixels
2
C++ Builder. Programowanie obiektowe. Ćwiczenie 6.
______________________________________________________________________
______________________________________________________________________
©2004 Jerzy Kluczewski
I.
Wstęp
Wykonamy teraz piękny, wielobarwny dywan, który będzie kreślony w oknie
aplikacji.
Najpierw wygenerujmy nasz nowy projekt z pustym formularzem i zapiszmy go do
pliku Dywan6.bpr.
Nasz projekt plikacji zapiszemy w plikach rozpoczynających się od nazwy Dywan6.
Utwórz projekt aplikacji za pomocą polecenia File
New
Application
Zapisz projekt aplikacji za pomocą polecenia File
Save All ...
Zapisz projekt do plików:
•
formularza do Dywan6Unit1.cpp,
•
głównego pliku projektu Dywan6.bpr
Zmień tytuł formularza Form1 na Dywan6.
C++ Builder. Programowanie obiektowe. Ćwiczenie 6. 3
______________________________________________________________________
©2004 Jerzy Kluczewski
II.
Kreślenie grafiki
Zdarzenie Form1
OnPaint
Zgodnie z regułami programowania, algorytm kreślenia umieszczamy w funkcji –
reakcji na zdarzenie OnPaint – „chcę rysować”. Daje to gwarancję, że grafika zostanie
automatycznie odświeżona, gdy formularz aplikacji będzie uaktywniony.
Wygenerujemy teraz funkcję w Object Inspector:
Ś
rodowisko przechodzi automatycznie do okna kodu funkcji TForm1::FormPaint :
Wpisujemy kod funkcji:
{
int i,j;
TColor kolor;
for( i = 0; i < ClientWidth; i++ )
{
for( j = 0; j < ClientHeight; j++ )
{
kolor = (TColor) (i * j * 3) % 100000;
Canvas->Pixels[i][j] = kolor;
}
}
}
4
C++ Builder. Programowanie obiektowe. Ćwiczenie 6.
______________________________________________________________________
______________________________________________________________________
©2004 Jerzy Kluczewski
Jak działa funkcja TForm1::FormPaint ?
Deklaracja zmiennych pomocniczych: i, j, typu int – oznacza że zmienne te należą do
zbioru liczb całkowitych.
Deklaracja zmiennej: kolor, typu TColor – oznacza że zmienna ta przechowuje rodzaj
koloru kreślonego piksela.
int i,j;
TColor kolor;
Pętla zewnętrzna for przesuwa współrzędną poziomą piksela od pozycji 0 do pozycji
(ClientWidth-1).
for( i = 0; i < ClientWidth; i++ )
UWAGA:
Zmienne ClientWidth, ClientHeight określają rozpiętość powierzchni graficznej
okienka (rozdzielczość wewnętrzna formularza From1). Z kolei zmienne Width, Height
oznaczają rozpiętość zewnętrzną okna (formularza), a więc razem z jego ramką
i paskiem tytułu.
Pętla wewnętrzna for przesuwa współrzędną pionową piksela od pozycji 0 do pozycji
(ClientWidth-1).
for( j = 0; j < ClientHeight; j++ )
Przed kreśleniem każdego piksela określany jego kolor za pomocą wzoru:
kolor = (TColor) (i * j * 3) % 100000;
Napis powoduje konwersję typu int na typ TColor natomiast operator % oblicza
jedynie wartość całkowitą ilorazu..
Operacja następna wstawia do tablicy pikseli Pixels znajdujących się w obiekcie
Canvas, odpowiedni kod koloru :
Canvas->Pixels[i][j] = kolor;
Teraz nadszedł czas na przetestowanie naszej aplikacji:
Uruchom ją za pomocą polecenia Run
Run (F9)
C++ Builder. Programowanie obiektowe. Ćwiczenie 6. 5
______________________________________________________________________
©2004 Jerzy Kluczewski
Wygląd okna aplikacji
Po uruchomieniu nasze okno wygląda następująco:
III.
Wzbogacanie naszej aplikacji
Tworzenie ekranowego koloru
Tak naprawdę tworzenie każdego koloru na ekranie polega na wybieraniu amplitudy
trzech składowych: Red – czerwonej, Green – zielonej, Blue – niebieskiej.
Aby wykorzystać tę metodę, do dyspozycji mamy funkcję RGB().
Składnia tej funkcji wygląda następująco:
TColor RGB( int r, int g , int b )
6
C++ Builder. Programowanie obiektowe. Ćwiczenie 6.
______________________________________________________________________
______________________________________________________________________
©2004 Jerzy Kluczewski
Wykasujmy teraz zawartość naszej funkcji TForm1::FormPaint (ale jej nagłówek
pozostawmy bez zmian)
Wpisujemy nową zawartość funkcji:
{
int i,j;
int r, g, b; // Składowe koloru: Red, Green, Blue
TColor kolor;
for( i = 0; i < ClientWidth; i++ )
{
for( j = 0; j < ClientHeight; j++ )
{
r = 255.0 * sin( (i + j) / 27.0);
g = 255.0 * ( sin( i / 23.0) - sin( j / 17.0 ) );
b = r + g;
kolor = (TColor) RGB( r, g, b);
Canvas->Pixels[i][j] = kolor;
}
}
}
Uruchom aplikację za pomocą polecenia Run
Run (F9)
Okienko kompilacji projektu poinformowało nas, że w projekcie istnieje 1 błąd.
Usuwanie błędu
Kliknijmy w OK i w oknie kodu mamy zaznaczoną linię w której popełniono błąd.
Na dole jest też opis rodzaju błędu – przyjrzyjmy się mu.
C++ Builder. Programowanie obiektowe. Ćwiczenie 6. 7
______________________________________________________________________
©2004 Jerzy Kluczewski
Otóż w linii 27 pliku Dywan6Unit1.cpp wystąpił błąd „Call to undefined function sin„
(wywołanie niezdefiniowanej funkcji sin)
Nie jest nic dziwnego, ponieważ C++ Builder nie wie w jakiej bibliotece gotowych
funkcji ma szukać funkcji matematycznej sinus. Aby projekt był kompletny należy go
poinformować, że będziemy używać funkcji matematycznych.
Przejdź do pierwszych linii w oknie kodu i na linią dyrektywy
#include "Dywan6Unit1.h"
dopisz dyrektywę
#include "math.h"
Teraz spróbuj skompilować projekt (Ctrl+F9) albo Project
Build Dywan6.
8
C++ Builder. Programowanie obiektowe. Ćwiczenie 6.
______________________________________________________________________
______________________________________________________________________
©2004 Jerzy Kluczewski
Wygląd okna aplikacji
Uruchom aplikację za pomocą polecenia Run
Run (F9)
Po uruchomieniu nasze okno wygląda następująco:
Sens kropek i zer
Usuń z wszystkich wartości numerycznych kropki i zera (np. zmień 17.0 na 17 itd.).
Uruchom projekt i przyjrzyj mu się – jak będzie wyglądał dywan.
Czy potrafisz wytłumaczyć sens kropek i zer w języku C++ ?