книги / C++Builder. ╨г╤З╨╡╨▒╨╜╤Л╨╣ ╨║╤Г╤А╤Б
.pdf-С войству |
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).