C++Builder. Учебный курс
.pdf5. ГРАФИЧЕСКИЕ СРЕДСТВА 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
- Начните новый проект и сохраните его.