background image

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 

  
 
 
 
 
 
 
 
 
 
 
 
 

background image

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

 

 
 
 
 
 
 
 

background image

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

}
 

background image

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 ClientWidthClientHeight określają rozpiętość powierzchni graficznej 
okienka (rozdzielczość wewnętrzna formularza From1). Z kolei zmienne WidthHeight 
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) 

 
 
 
 

background image

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 
 
 

background image

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. 
 
 
 
 

background image

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

 

 
 
 

background image

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++ ?