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

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

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

5. ГРАФИЧЕСКИЕ СРЕДСТВА C++BUILDER

Весь вывод, генерируемый приложениями Windows, по своей природе графический. В дополнение к тексту в Windows можно чертить и геометрические фигуры - линии, прямоугольники, ок­ ружности, эллипсы и т.д. Есть несколько типов выходных уст­ ройств, с которыми можно работать при создании графического вывода. Чаще всего - это дисплей и принтер.

Богатство изобразительных возможностей Windows связано с так называемым дескриптором контекста графического устройства DC и тремя входящими в него инструментами - шрифтом, пером и кистью. В C++Builder созданы специализированные классы, суще­ ственно упрощающие использование графических инструментов Windows:

- T C an v as - для контекста;

-T F o n t - для шрифта;

-Т Реп - для пера;

-T B ru sh - для кисти.

Связанные с этими классами объекты автоматически созда­ ются для всех видимых элементов и становятся доступны про­ грамме через свойства C an v as, F o n t, Реп и B rush .

С помощью класса T F o n t создается объект-шрифт для любо­ го графического устройства (экрана, принтера, плоттера и т.п.). С помощью класса ТРеп создается объект-перо, служащий для вычерчивания линий. Объекты класса T B rush (кисти) служат для заполнения внутреннего пространства замкнутых фигур.

Класс T C an v as создает «канву», на которой можно рисовать чертежными инструментами - пером, кистью и шрифтом. Объекты класса T C an v as автоматически создаются для всех видимых ком­ понентов, которые должны уметь нарисовать себя. Они инкапсу­ лируют объекты F o n t, Pen, B ru sh , а также многочисленные ме­ тоды, использующие эти объекты.

5.1. Графические компоненты

Графическую информацию можно непосредственно выводить на форму, используя методы свойства C a n v a s и обработчик со­ бытия O n P a in t формы.

Для вывода графической информации могут также использо­ ваться следующие компоненты:

-T P a in tB o x ;

-T Im a g e ;

-T S h a p e ;

-T C h a r t .

5.7.7. Объект Canvas

Для создания графического вывода из программы C++Builder используется объект C a n v a s (холст). C a n v a s - это объект с на­ бором свойств и методов, позволяющих управлять выводом на графические устройства - дисплеи, принтеры, плоттеры. Очень важное преимущество C a n v a s заключается в том, что вы можете пользоваться одной и той же абстракцией для доступа к поверхно­ сти рисования как дисплея, так и принтера. При выводе изображе­ ний из текста вы просто используете C a n v a s объекта P r i n t e r

для печати, и C a n v a s визуального объекта - для вывода на дис­ плей.

C anvas сам по себе является свойством других визуальных объектов C++Builder. Если у объекта есть свойство C anvas, то на его поверхности можно рисовать, достигая при этом различных графических эффектов. Ниже приведены важные характеристики свойства C anvas визуальных объектов C++Builder:

-свойство C anvas никогда не делают опубликованным (p u b lis h e d ). Оно доступно только во время работы приложения;

- свойство C anvas всегда доступно только для чтения.

Вы можете думать о C anvas, как о воображаемом листе бу­ маги, на котором можно рисовать.

Свойства Canvas

К наиболее важным свойствам класса TC anvas относятся:

- Реп (перо) - для черчения линий;

- B ru s h (кисть) - для заполнения внутренних областей фи­ гур различными цветами и стилями;

- F o n t (шрифт) - для вывода текста.

В дополнение к вышеупомянутым свойствам, C anvas для полного контроля над изображением дает возможность доступа к его отдельным пикселам. Это обеспечивается за счет использова­ ния свойства P i x e l s , которое позволяет рассматривать поверх­ ность рисования, как двумерный массив пикселов. Однако следует

использовать встроенные

возможности рисования объекта

C a n v a s, а свойство P i x e l s

применять только в крайних случаях.

Методы Canvas

Для рисования на форме используется область клиента окна, ширина и высота которого задается свойствами C lie n tW id th и C l i e n t H e i g h t . Левый верхний угол области клиента имеет ко­ ординаты (0,0).Объекты, рисуемые внутри окна, автоматически обрезаются по его границе. Такой подход гарантирует, что вывод приложения не затронет других приложений.

Ниже приведены наиболее часто используемые методы класса

T C an v as:

-

R e c ta n g le служит для черчения прямоугольников и

квадратов;

-

E l l i p s e предназначен для черчения эллипсов и окружно­

стей;

 

-M oveTo и L in e T o используются при черчении прямых

линий;

-P o ly g o n и P o ly L in e служат соответственно для черче­ ния многоугольников и ломаных линий, состоящих из нескольких отрезков;

-T e x tO u t выводит текст.

R e c t a n g l e ( i n t x l , i n t y l , i n t x 2 , i n t y 2 ) ;

Вычерчивает и заполняет прямоугольник, заданный коорди­ натами противоположных углов ( x l,y l) и (х2,у2). Для вычерчи­ вания без заполнения используйте методы F ra m e R e c t или P o ­ l y l i n e .

E l l i p s e ( i n t x l , i n t

y l , i n t x2, i n t y 2 ) ;

Задаются координаты

противоположных углов прямоуголь­

ника ( x l,y l)

и (х2,у2), в который будет вписан эллипс. В классе

T C an v as не

определен

метод C i r c l e , поэтому для рисования

окружности следует использовать метод E l l i p s e .

MoveТ о ( i n t х , i n t

у ) ;

Перемещает перо в положение (х,у) без вычерчивания линии.

L i n e T o ( i n t х , i n t у ) ;

Чертит линию от текущего положения пера до точки (х,у). Для черчения обычных линий обычно используются методы

MoveTo и L in e T o . Для рисования линий C a n v a s поддерживает свойство P en P o s, называемое текущей позицией пера. Можно либо непосредственно устанавливать текущее положение пера, присваивая свойству P e n P o s значение типа T P o in t, либо ис­ пользовать метод M oveTo для его изменения. В обоих случаях во­ ображаемое перо переместится в заданную точку поверхности ри­ сования. После этого можно использовать последовательность вы­ зовов метода L in e T o для рисования отрезков.

P o ly g o n ( T P o in t P o i n t s , i n t P o i n t s _ S i z e ) ;

Вычерчивает пером многоугольник по точкам, заданным в массиве P o i n ts . В параметре P o i n t _ S iz e указывается индекс последней точки. Конечная точка соединяется с начальной, и мно­ гоугольник заполняется кистью. Для вычерчивания без заполнения используйте метод P o l y l i n e .

Пример:

v o id __f a s t c a l l T F o rm l: : F o rm P a in t(T O b je c t *Sender)

{

T P o in t p o i n t s [4 ] ;

 

p o i n t s [0]

=

P o i n t ( 1 0 ,1 0 ) ;

 

p o i n t s [1]

=

P o i n t (3 0 ,1 0 ) ;

 

p o i n t s [2]

=

P o i n t (130 ,3 0 ) ;

 

p o i n t s [3]

=

P o i n t (240,120)

;

C a n v a s - > B ru sh -> C o lo r = c l T e a l ;

C a n v a s - > P o ly g o n ( p o in ts , 3) ;

}

 

 

 

P o l y l i n e

(T P o in t P o i n t s ,

i n t Points__Size) ;

Вычерчивает пером ломаную прямую по точкам, заданным в массиве P o in ts .

T e x t O u t ( i n t х , i n t у, c o n s t A n s iS tr in g T e x t) ;

Выводит текстовую строку T ex t так, чтобы левый верхний угол прямоугольника, охватывающего текст, располагался в точке (х,у).

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

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

i n t T e x tW id th ( c o n s t A n s i S tr in g T e x t) ;

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

5.2. Примеры рисования графических примитивов

Для вывода изображений, которые должны постоянно при­ сутствовать на экране, используется событие OnРа in t . Это собы­ тие происходит тогда, когда форма по какой-либо причине требует перерисовки.

Ниже приводятся примеры рисования графических примити­ вов. Эти примеры можно рассматривать в любой последовательно­ сти независимо друг от друга.

—Для правильной работы примеров при изменении размеров окна и изображения создайте обработчик события O nR esize:

v o i d __ fastcall T F o rm l: : F o rm R e s iz e (T O b je c t * S en d er)

{

I n v a l i d a t e ( ) ;

}

Событие O n R esize возникает при каждом изменении разме­ ра формы. Его обычно используют для перерисовки формы.

Метод I n v a l i d a t e сообщает Windows о необходимости полностью перерисовать форму после того, как будут обработаны другие важные сообщения Windows.

5.2.1. Рисование линий

Для рисования линий необходимо использовать методы Мо~ veT o и L in e T o . Объявление этих методов имеет следующий вид:

- L in e T o ( i n t х , i n t у ) ;

Чертит линию от текущего положения пера до точки (х,у).

-M oveTo ( i n t х , i n t у) ;

Перемещает перо в положение (х,у) без вычерчивания линии. Эти методы можно также использовать для рисования поли­

линий.

Пример 5.1

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

-Свойству C lie n tW id th присвойте значение 500, C li - e n tH e ig h t - 400.

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

v°id __fastcall T F o rm l::F o r m P a in t( T O b je c t * S en d er)

{

r a n d o m i z e ( ) ;

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

/ /

Рисование

линий

 

 

 

 

 

/ /

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

 

 

 

 

 

 

C a n v a s - > P e n - > C o lo r

= c lR e d ; / /

Цвет линии

 

C a n v a s - >P en -> W id th

= 2 ;

/ /

Толщина линии

C anvas-> M oveT o( 5 0 , 5 0 ) ; / /

Координаты начала о трезк а

C a n v a s - > L in e T o ( 5 0 , 3 5 0 ) ; / /

Координаты конца

отрезк а

/ /

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

 

 

 

 

 

 

/ /

Цвет линии

з а д а е т с я с

помощью

ген ератора

 

/ /

случайных

ч исел

с использованием функции

RGB

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

 

 

 

 

 

 

 

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

= 1 ;

/ /

Толщина линии

/ /

Тип линии

(только для

тонких

линий)

 

C a n v a s - > P e n - > S ty le = p sD o t;

 

 

 

C a n v a s - > P e n - > C o lo r

= T C olor (RGB (random (256) ,

ra n d o m (2 5 6 ),

ra n d o m (256)) ) ;

 

 

 

C a n v a s - >MoveTo(1 0 0 ,5 0 ) ;

 

 

 

 

C a n v a s - > L in e T o (1 0 0 ,3 5 0 ) ;

 

 

 

 

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

 

 

 

 

C anvas-> M oveT o(1 5 0 ,5 0 ) ;

 

 

 

 

C a n v a s - > L in e T o (1 5 0 ,3 5 0 ) ;

 

 

 

 

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

 

 

 

 

 

 

 

/ /

Рисование

полилинии

 

 

 

 

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

 

 

 

 

 

 

 

C a n v a s - > P e n - > S ty le

= p s S o l i d ;

/ /

Сплошная

линия

C a n v a s - > P e n - > C o lo r = c lB lu e ;

 

 

 

C a n v a s - >MoveTo( 2 0 0 ,5 0 ) ;

C a n v a s - > L in e T o (3 5 0 ,5 0 ) ;

C a n v a s - > L in e T o (4 5 0 ,2 5 0 ) ;

C a n v a s - > L in e T o (4 0 0 ,3 0 0 )

;

C a n v a s - > L in e T o (2 0 0 ,3 0 0 )

;

}

Цвет пера для вычерчивания первой линии устанавливается с помощью стандартной функции RGB. Значение цвета конструиру­ ется из трех базовых компонентов - красного, зеленого и синего.

Рассмотрим пример использования C an v as для рисования прямоугольников.

Для рисования прямоугольника используется метод R e c ta n ­ g l e , объявление которого имеет следующий вид:

R e c t a n g l e ( i n t x l , i n t y l , i n t x 2 , i n t y 2 ) ;

Этот метод предназначен для рисования и заполнения прямо­ угольника с координатами противоположных вершин ( x l,y l) и (х2,у2). Для рисования без заполнения можно свойству S t y l e объекта B ru s h присвоить значение b s C le a r .

Пример 5.2

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

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

tH e ig h t - 4 0 0 .

- Создайте обработчик события 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 r m P a in t( T O b je c t * S en d er)

{

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

/ /

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

заполнением

/ /

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

 

 

 

 

 

 

C a n v a s - > P e n - > C o lo r

=

c l B l a c k ;

 

/ /

Цвет линий

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

= 2 ;

 

/ /

Толщина линии

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

= c lG r a y ;

/ /

Цвет

зап олн ен ия

C a n v a s - > R e c t a n g l e ( 5 0 , 2 0 , 3 0 0 , 2 0 0 ) ;

 

 

 

C a n v a s - > B r u s h - > S ty le

= b s C r o s s ; / /

Стиль

зап олн ен ия

C a n v a s - > R e c t a n g l e ( 5 0 ,2 5 0 ,2 3 0 ,3 5 0 ) ;

 

 

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

 

 

 

 

 

 

 

/ /

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

зап о л н ен и я

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

 

 

 

 

 

 

 

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

 

 

 

 

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

= 1 ;

 

/ /

Толщина линии

C a n v a s - > B r u s h - > S ty le

= b s C l e a r ;

 

/ /

О тсутствие

 

 

 

 

 

/ /

зап олн ен ия

C a n v a s - > R e c t a n g l e ( 2 5 0 ,2 5 0 ,4 5 0 , 3 5 0 ) ;

}

Для рисования

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

P o ly g o n , объявление которого имеет следующий вид:

P o ly g o n (T P o in ts

* P o in t, i n t Point__Size) ;

Вычерчивает пером многоугольник по точкам, заданным в массиве P o i n t s . Конечная точка соединяется с начальной, и мно­ гоугольник заполняется кистью. В параметре P o i n t _ S i z e указы­ вается индекс последней точки.

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

 

-С войству C l i e n t W i d t h присвойте значение 500, C l i e n -

t H e i g h t

- 400 .

 

 

 

 

- Создайте обработчик события O n P a i n 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 c t *Sender)

{

 

 

 

 

 

 

/ /

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

 

 

 

 

 

/ /

Рисование

м ногоугольника

/ /

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

 

 

 

 

 

T P o in t p o i n t s [5 ] ;

 

 

p o i n t s [0]

=

P o i n t ( 1 0 ,1 0 ) ;

p o i n t s [1]

=

P o i n t ( 4 0 0 ,1 0 ) ;

p o i n t s [2]

=

P o i n t (2 3 0 ,1 3 0 ) ;

p o i n t s [3]

=

P o i n t (4 0 0 ,2 5 0 ) ;

p o i n t s

[4]

=

P o i n t (1 0 ,2 5 0 ) ;

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

2;

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

= clA q u a;

C a n v a s - > P o l y g o n ( p o i n t s , 4 ) ;

}

 

 

 

 

 

 

 

 

 

 

5.2.4.

Рисование полилинии

 

Для

рисования

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

P o ly g o n , объявление которого имеет следующий вид:

P o l y l i n e ( T P o i n t s * P o in t, i n t P o in t _ S iz e ) ;

Вычерчивает пером ломаную прямую по точкам, заданным в массиве P o i n ts . В параметре P o i n t _ S iz e указывается индекс

последней точки.

 

Пример 5.4

 

 

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

 

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

tH e ig h t - 400.

 

 

- Создайте обработчик события 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 r m P a in t( T O b je c t * S en d er)

{

 

 

 

/ /

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

 

 

/ /

Рисование

полилинии

/ /

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

 

 

T P o in t p o i n t s [5] ;

p o i n t s [0]

=

P o i n t ( 1 0 , 1 0 ) ;

p o i n t s [1]

=

P o i n t ( 4 0 0 ,1 0 ) ;

p o i n t s [2]

=

P o i n t ( 2 3 0 ,1 3 0 ) ;

p o i n t s [3]

=

P o i n t ( 4 0 0 ,2 5 0 ) ;

p o i n t s [4]

=

P o i n t ( 1 0 ,2 5 0 ) ;

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

C a n v a s - > B r u s h - > C o lo r = c lA q u a ;

C a n v a s - > P o l y l i n e ( p o i n t s , 4 ) ;

}

5.2.5. Рисование эллипса

Рассматривается пример использования метода E l l i p s e , ко­ торый можно использовать для рисования окружности или эллип­ са. Объявление метода имеет следующий вид:

E l l i p s e ( i n t x l , i n t y l , i n t х 2 , i n t у 2 ) ;

Этот метод чертит эллипс в охватывающем прямоугольнике с координатами противоположных вершин ( x l,y l) и (х2,у2) и за­ полняет внутреннее пространство эллипса текущей кистью.

Пример 5.5

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