Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

C++Builder. Учебный курс

.pdf
Скачиваний:
14
Добавлен:
15.11.2022
Размер:
9.54 Mб
Скачать

-С войству

C lie n tW id th присвойте значение 500,

C l i e n t H e i g h t -

400.

- Создайте обработчик события O n P a in t для формы:

void __fastcall T F o r m l ::F o rm P a in t( T O b je c t *Sender)

{

/ / --------------------------------------------------------------------------

/ /

Рисование

э ллипса

в

центре

формы

/ /

с

полуосями 100 и

60

 

 

 

 

/ / -------------------------------------------------------

 

 

 

 

 

 

 

 

, -----------------

int хс

=

C l i e n t W i d t h / 2 ,

ус

=

C l i e n t H e i g h t / 2 ;

int

а

=

100,

b = 60;

 

 

 

 

 

C a n v a s - > P e n - > W id th = 2;

 

 

 

 

C a n v a s - > P e n - > C o l o r = c l B l a c k ;

 

 

C a n v a s - > B r u s h - > C o l o r

=

clN avy;

 

C a n v a s - > B r u s h - > S t y l e

=

b s C r o s s ; / /

Тип заполнения

C a n v a s - > E l l i p s e ( x c - a ,

y c - b ,

xc+a,

y c + b ) ;

/ / --------------------------------------------------------------------------

 

 

 

 

 

 

 

 

 

 

/ /

Рисование

к р у г а радиусом

60

 

/ / --------------------------------------------------------------------------

 

 

 

 

 

 

 

 

 

 

х с

=

100,

ус

= 80;

 

 

 

 

 

int

г

=

60;

 

 

 

 

 

 

C a n v a s - > P e n - > W id th = 1;

 

 

 

 

C a n v a s - > P e n - > C o l o r = c l B l a c k ;

 

 

C a n v a s - > B r u s h - > C o l o r = c lG r e e n ;

 

C a n v a s - > B r u s h - > S t y l e = b s S o l i d ;

 

C a n v a s - > E l l i p s e ( x c - r ,

y c - r ,

x c + r ,

yc+r) ;

}

5.2.6.Рисование дуги

Рассмотрим пример рисования дуги с использованием метода

A rc . Объявление метода имеет следующий вид:

A rc ( i n t x l , i n t y l , i n t x 2 , i n t y 2 , i n t x 3 , i n t y 3 , i n t x 4 , i n t y 4 ) ;

Чертит дугу

эллипса в

охватывающем прямоугольнике

(x l,y l)-(x 2 ,y 2 ).

Начало дуги

лежит на пересечении эллипса и

луча, проведенного из его центра в точку (хЗ,уЗ), а конец - на пе­ ресечении с лучом из центра в точку (х4,у4). Дуга чертится про­ тив часовой стрелки.

Пример 5.6

- Начните новый проект и сохраните его.

-С войству C lie n tW id th присвойте значение 500, C l i e n -

t H e ig h t - 400.

- Создайте обработчик события O n P a in t для формы:

void __fastcall T F o r m l ::F o r m P a i n t ( T O b j e c t ‘ S e n d e r )

{

/ / ----------------------------------------------------------------------------

/ /

Рисование

дуги

р адиусом

150

/ / ----------------------------------------------------------------------------

 

 

 

 

int

xc = 300,

ус

= 200, г

= 150;

C a n v a s - > P e n - > W id th = 2;

C a n v a s - > P e n - > C o l o r = c l B l a c k ;

C a n v a s - > A r c ( x c - r , y c - r , x c + r , y c + r , x c + r , y c , x c , y c - r ) ;

xc = 300, yc = 200, r = 150; C a n v a s - > P e n - > C o l o r = c l R e d ; C a n v a s - > P e n - > W id th = 1;

C a n v a s - > A r c ( x c - r , y c - r , x c + r , y c + r , x c , y c - r , x c + r , y c ) ;

}

5.2.7.Использование метода F l o o d F i l l

Рассматривается пример использования метода F 1o o d F i l l ,

который закрашивает замкнутую область, используя текущие стиль и цвет закраски. Объявление метода имеет следующий вид:

F l o o d F i l l ( i n t х, i n t у, T C o lo r C o l o r , T F i l l S t y l e F i l l S t y l e )

Производит заливку канвы текущей костью. Заливка начина­

ется с точки (х,у) и распространяется во все стороны от нее. Если

F i l l S t y l e = f s S u r f a c e , заливка распространяется на все со­ седние точки с цветом C o lo r . Если F i l l S t y l e = f sB o rd e r, на­ оборот, заливка прекращается на точках с этим цветом.

Пример 5.7

-Начните новый проект и сохраните его.

-Свойству C lie n tW id th присвойте значение 500, C lie n t -

He i g h t - 4 0 0 .

-Создайте обработчик события O n P a in t для формы:

void __fastcall T F o r m l: : F o rm P a in t( T O b je c t *Sender)

{

C a n v a s - > B r u s h - > C o lo r = c l S i l v e r ;

C a n v a s - > P e n - > S t y l e = p s C l e a r ; / / Без рисования линий

C a n v a s - > R e c t a n g l e ( 0 , 0 , C l i e n t W i d t h , C l i e n t H e i g h t ) ;

/ / --------------------------------------------------------------------------

/ /

Рисование т р

еу го л ь н и к а и его закрашивание

/ /

Демонстрация

исп ользован и я метода F l o o d F i l l

// --------------------------------------------------------------------------

// F i 1 I S t y l e = f s B o r d e r

C a n v a s - > P e n - > S t y l e =

p s S o l i d ; / / Тип линии

сплошная

C a n v a s - > P e n - > C o l o r = c l B l u e ;

 

 

C a n v a s - > P e n - > W id th = 2;

 

 

 

 

Canvas->MoveTo (5 0 ,5 0 ) ;

 

/ /

Координаты

1-й

вершины

C a n v a s - > L in e T o (250,50)

;

/ /

Координаты

2 -й

вершины

C a n v a s - > L in e T o (50,250)

;

/ /

Координаты

3 -й

вершины

C a n v a s - > L in e T o (50,50)

;

 

/ /

Координаты

1-й

вершины

C a n v a s - > B r u s h - > C o lo r

=

 

clR e d ;

 

 

C a n v a s - > F l o o d F i l l ( 6 0 ,6 0 , c l B l u e , f sB order) ;

 

/ / F i l l S t y l e = f s S u r f a c e

 

 

 

 

Canvas->MoveTo (450,350)

;

/ /

Координаты

1-й

в е р ш и т

C a n v a s - > L in e T o (450,150)

;

/ /

Координаты

2 -й

вершины

C a n v a s - > L in e T o (250,250)

;

/ /

Координаты

3-й

вершины

C a n v a s - > L in e T o (450,350)

;

/ /

Координаты

1-й

вершины

C a n v a s - > B r u s h - > C o lo r = c l G r e e n ;

C a n v a s - > F l o o d F i l l (4 0 0 ,2 5 0 , c l S i l v e r , f s S u r f a c e ) ;

}

Для вывода текстовой строки используется метод TextOut,

объявление которого имеет следующий вид:

T e x t O u t ( i n t х, i n t у, c o n s t A n s i S t r i n g T e x t ) ;

Выводит текстовую строку Text так, чтобы левый верхний угол прямоугольника, охватывающего текст, располагался в точке

(х,у).

Методы TextHeight и TextWidth можно использовать для выравнивания текста по вертикали и горизонтали относитель­ но точки (х,у).Объявление этих функций имеет следующий вид:

i n t T e x t H e i g h t ( c o n s t A n s i S t r i n g T e x t ) ;

Возвращает высоту прямоугольника, охватывающего тексто­ вую строку Text.

i n t T e x t W i d t h ( c o n s t A n s i S t r i n g T e x t ) ;

Возвращает ширину прямоугольника, охватывающего тексто­ вую строку Text.

Пример 5.8 - Начните новый проект и сохраните его.

-Свойству ClientWidth присвойте значение 50о,

ClientHeight - 400.

- Создайте обработчик события OnPaint для формы:

void __fastcall T F o r m l : : F o r m P a i n t ( T O b j e c t *S ender)

{

/ / ----------------------------------------------------------------------------

/ /

Вывод т е к с т а

 

 

 

/ /

----------------------------------------------------------------------------

 

 

 

C a n v a s - > F o n t - > S i z e

=

14;

C anvas - >Font - > N am e

=

"Times New Roman";

C a n v a s - > T e x t O u t ( 1 0 , 1 0 , " С т р о к а " ) ;

/ /

Выравнивание

т е к с т а

int x = 100, у =

100,

w, h;

C a n v a s - > B r u s h - > C o l o r = c l G r a y ;

 

 

C a n v a s - > T e x t O u t ( x , у , "Строка1") ;

 

 

w

= C a n v a s - > T e x t W i d t h ( "Строка1" ) ;

 

 

/ /

Смещение влево

 

 

 

C a n v a s - > T e x t O u t ( x - w ,y + 2 5 , "Строка1")

;

 

/ /

Центрирование по

горизонтали

 

 

C a n v a s - > T e x t O u t ( x - w / 2 , у + 5 0 , "Строка1") ;

 

h

= C a n v a s - > T e x t H e i g h t ( "Строка1м) ;

 

 

/ /

Смещение вверх

 

 

 

C a n v a s - > T e x tO u t (x+70 , y - h , "Строка!")

;

 

/ /

Центрирование по

вертикали

 

 

C a n v a s - > T e x t O u t (х+140, y - h / 2 , "Строка1")

;

/ /

Изменение стиля

шрифта

 

 

C a n v a s - > B r u s h - > C o l o r = c l B t n F a c e ;

 

 

C anvas - > F o n t - > S t y l e

= T F o n t S t y l e s ()

<< fs B o ld ;

C a n v a s - > T e x t O u t ( x , 2 0 0 , "С трок а2") ;

 

 

C anvas - > F o n t - > S t y l e

= T F o n t S t y l e s ()

<<

f s l t a l i c <<

 

 

f s U n d e r l i n e ;

 

 

C a n v a s - > T e x t O u t ( x , 2 4 0 , "СтрокаЗ") ;

 

 

C anvas - > F o n t - > S t y l e

= T F o n t S t y l e s O ;

 

C a n v a s - > T e x t O u t ( x , 2 8 0 , "Строка4") ;

 

 

}

Вопросы для самоконтроля

1. Перечислите классы, используемые при графическом вы­

воде.

2.Назначение класса T C an v as.

3.Назовите основные свойства объекта C anvas.

4.Назовите основные методы объекта C anvas.

5.Назначение класса ТРеп.

6.Назовите основные свойства объекта Реп.

7.Назначение класса T B rush .

8.Назовите основные свойства объекта B rush .

9.Назначение класса T F o n t.

10.Назовите основные свойства объекта F o n t.

11.С помощью каких свойств можно задать высоту шрифта, и чем они отличаются?

12.Какое событие используется для вывода графического изображения?

13.Назначение стандартной функции RGB.

14. Назначение свойств C lie n tW id th и C l i e n t H e i g h t

формы и их отличие от свойств W id th и H e ig h t.

15.Чему равны координаты левого верхнего угла формы?

16.Чему равны координаты нижнего правого угла формы?

17.Нарисовать на форме прямоугольник. Как изменить цвет линий и заполнения прямоугольника?

18.Нарисовать прямоугольник, занимающий всю клиентскую часть окна формы.

19.Как нарисовать линию?

20.Нарисовать на форме треугольник.

21.С помощью какого метода можно нарисовать окружность?

22.Нарисовать окружность в центре формы.

23.Нарисовать на форме дугу окружности.

24.Зачем при выводе графического изображения необходимо создавать обработчик события O n R e siz e ? Продемонстрировать это на примере.

25.Назначение метода F l o o d F i l l .

26.Назначение метода Invalidate.

Упражнения

1.Написать программу для рисования шахматной доски.

2.Написать программу для рисования фигуры в соответствии

срисунком.

Будем строить график функции при изменении аргумента х от xm in до хтпах. Предполагаем, что значения функции не выхо­ дят за пределы интервала от ym in до ушах.

-Начните в C-H-Builder новый проект.

-Объявите в файле реализации модуля глобальные переменные.

double x m in = -3, xmax = 3; double ymin = -i, углах = 1;

int

n x ,

n y ;

int

x l ,

y l , x 2 , y 2 , mx, my;

 

 

6.2. Построение сетки

 

Для

построения сетки графика дополним класс формы

T F o r m l

новой функцией G r i d , имеющей два параметра их и пу -

число делений масштабной сетки соответственно по осям х и у.

- В заголовочном файле формы объявите в секции p r iv a te функцию

void __fastcall Grid(int nx, int ny) ;

- В файле реализации модуля формы определите функцию.

void __fastcall T F o r m l:: G r i d (int nx, int ny)

{

int i , X, Y;

double hx, hy, h, x, y;

C a n v a s - > B r u s h - > C o l o r = c lB t n F a c e ;

C a n v a s - > P e n - > C o l o r = c l B l a c k ;

C a n v a s - > F o n t - > S i z e

=

10;

Canvas - >Font - > N am e

=

"Times New Roman";

C a n v a s - > P e n - > W id th = 2;

C a n v a s - > R e c t a n g l e ( x l , y l , x 2 , y 2 ) ;

C a n v a s - > P e n - > W id th = 1;

// --------------------------------------------------------------------------

// Рисование горизонтальных линий сетки

/ / ----------------------------------------------------------------------------

h = d o u b l e ( m y ) / n y ; hy = ( y m a x - y m i n ) / n y ;

f o r (i= 0 ,Y = y 2 ,y = y m in ; i< = n y ; i+ + ,Y = y 2 - i * h , y + = h y )

{

 

C a n v a s - > M oveTo(xl, Y);

 

C a n v a s - > L i n e T o ( x 2 , Y ) ;

}

/

 

/

 

/ /

Рисование вертикальных линий с е т к и

/

/ ----------------------------------------------------------------------------

 

h

=

d o u b l e (mx)/ п х ;

hx = (x m a x - x m in )/ п х ;

f o r (i = 0 , X = x l , x = x m in ; i< = n x ; i + + , X = x l+ i* h ,x + = h x )

{

Canvas->MoveTo(X, y l ) ;

C a n v a s - > L in e T o (X , y 2 ) ;

}

}

-Самостоятельно разберитесь с назначением каждого опера­ тора функции.

-Создайте обработчик события O n P a in t формы.

v o i d __ f a s t c a l l T F o rm l: :F o rm P a in t(T O b je ct ‘ S ender)

{

mx = 0 . 8 * C l i e n t W i d t h ;

my = 0 . 8 * C l i e n t H e i g h t ;

x l

=

( C l i e n t W i d t h - m x ) / 2 ;

y l

=

( C l i e n t H e i g h t - m y ) / 2 ;

x2 = xl+mx; у 2 = yl+my;

G r id (6, 4 );

}

- Запустите приложение и проверьте правильность его работы (рис. 6.2).