<< Пред. стр. 16 (из 32) След. >>
// сбрасываем установленные параметрыgc.Reset();
// рисуем третий прямоугольник, используя конструктор // TRect(const TPointS aPoint, const TSizeS aSize)
// координаты верхнего левого угла
TPoint pointTopLeft3 (90, 20);
// размер прямоугольника
TSize sizeRect3(/*x*/50, /*y*/100) ;
// светло-серый цвет
TRgb colorGreylO = AKN_LAF_COLOR(KGreyl0);
// цвет кисти
gc.SetBrushColor(colorGreylO);
// закрашиваем кистью прямоугольник
gc.SetBrushStyle(CGraphicsContext::ESolidBrush);
// задаем размер третьему прямоугольнику
TRect drawRect3(pointTopLeft3, sizeRect3);
// рисуем третий прямоугольник
gc.DrawRect(drawRect3);
// рисуем четвертый прямоугольник, используя конструктор
// TRect(const TPointS aPoint, const TSizeS aSize)
/ / ,
/ / ~~
// координаты верхнего левого угла TPoint pointTopLeft4 (20, 100); // размер прямоугольника TSize sizeRect4 (50, 30); // черный цвет для бордюра TRgb colorBlack = AKN_LAF_COLOR(KBlack); // определяем толщину бордюра ¦
TSize penSizeRect4(8, 8);
// задаем толщину бордюра
gc.SetPenSize(penSizeRect4);
// устанавливаем цвет бордюру
gc.SetPenColor(colorBlack);
// темно-желтый цвет для кисти
TRgb colorKDarkYellov = AKN_LAF_COLOR(KDarkYellov);
// устанавливаем цвет кисти
gc.SetBrushColor(colorKDarkYellov);
// закрашиваем кистью прямоугольник
gc . SetBrushStyle (CGraphicsContext: .-ESolidBrush) ;
// задаем размер четвертому прямоугольнику
TRect drawRect4(pointTopLeft4, sizeRect4);
// рисуем четвертый прямоугольник
gc.DrawRect(drawRect4);
} //**********************************************************
В начале исходного кода создаются пять констант для работы с цветом: синим, темно-лиловым, одной из градаций серого, черным и темно-желтым. Далее в функции Draw () рисуются четыре разных прямоугольника.
Первый прямоугольник при создании объекта drawRectl класса TRect использует конструктор из четырех целочисленных значений (по осям X и Y), на пересечении которых создаются точки, и рисуется прямоугольник. В качестве цвета линий задан синий цвет. Толщина линий не задана, а значит по умолчанию это один пиксель. Если так же не указать цвет для линий, то по умолчанию это черный цвет.
При прорисовке второго прямоугольника используется конструктор класса TRect с двумя параметрами на основе класса TPoint. Создается точка для левого верхнего угла с координатами (30,40) и для нижнего правого угла с координатами (60, 80) пикселей. Для прямоугольника устанавливается толщина линии в (6, 6) пикселей и закрашивается этот бордюр темно-лиловым цветом. В конце исходного кода для создания второго прямоугольника используется функция Reset (): gc.Reset ();
Эта функция сбрасывает все настройки, в данном случае для толщины и цвета бордюра. Если не вызывать эту функцию, то установленные значения будут действовать и для следующего исходного кода, описывающего создания той или иной фигуры, пока не будет вызвана функция Reset ().
Третий прямоугольник рисуется с помощью конструктора класса TRect. TRect (const TPoints aPoint, const TSize& aSize)
Создается точка для верхнего левого угла и размер прямоугольника по ширине и высоте, на основании этих данных и происходит построение третьего прямоугольника. Чтобы закрасить внутреннее пространство прямоугольника в серый цвет, применяется кисть (Brush).
gc.SetBrushStyle(CGraphicsContext::ESolidBrush);
Но при этом все равно автоматически прорисовывается бордюр прямоугольника шириной в один пиксель черного цвета. Если вы захотите закрасить прямоугольник, круг, эллипс или любой другой графический элемент, то перед закрашиванием фигуры кистью напишите следующую строку кода: gc.SetPenStyle(CGraphicsContext::ENullPen) ;
Тем самым вы сбросите прорисовку контура фигуры.
Последний прямоугольник так же рисуется с помощью класса TSize, но с толстым бордюром в (8, 8) пикселей черного цвета. А внутреннее пространство прямоугольника закрашивается в темно-желтый цвет. На рис. 9.4 изображена работа программы RectTest.
Рис. 9.4. Работа программы RectTest
9.3. Рисуем эллипс
Рисование эллипса происходит классом TRect. Первоначально происходит определение формы эллипса с помощью прямоугольника. Создавая прямоугольник с заданным размером и координатами, вы задаете площадь на экране для последующей отрисовки эллипса. Центр эллипса будет располагаться в центре прямоугольника, а его контур будет касаться сторон прямоугольника, учитывая особенность его формы. Сам прямоугольник не рисуется на экране, а лишь определяет площадь для формирования эллипса. Вместо эллипса можно нарисовать, например, окружность, если все стороны прямоугольника сделать равными.
Перейдем к примеру EllipsTest, где рисуются три разных по размеру и цвету эллипса. Пример находится на компакт-диске в папке \Code\EllipsTest, рассмотрим его содержимое:
// файл Test_AppView.срр
// реализация класса CTestAppView
// рисуем три эллипса на экране
// подключаем системные библиотеки
#include
tinclude
#include
// подключаем файл ресурса
tinclude
// подключаем заголовочный файл
#include "Test_AppView.h"
// цветовые константы
const Tint KOrange = 23; const Tint KGreen2 = 159;
// двухфазный конструктор
CTestAppView* CTestAppView::NewL(const TRect& aRect)
{
CTestAppView* self = CTestAppView::NewLC(aRect);
CleanupStack::Pop (self);
return self; }
// двухфазный конструктор
CTestAppView* CTestAppView::NewLC(const TRects aRect) {
CTestAppView* self = new (ELeave) CTestAppView;
CleanupStack::PushL(self);
self->ConstructL(aRect);
return self; }
// двухфазный конструктор
void CTestAppView::ConstructL(const TRects aRect) {
// создаем окно CreateWindowL();
// определяем клиентскую область SetRect(aRect);
// активизируем механизм прорисовки ActivateL(); }
// конструктор CTestAppView::CTestAppView() { }
// деструктор
CTestAppView::-CTestAppView() { }
// рисуем на экране
void CTestAppView::Draw(const TRectS /*aRect*/) const {
// получаем графический контекст окна
CWindowGcS gc = SystemGcO;
// очищаем клиентскую область окна
gc.Clear();
/ /
// рисуем первый эллипс
// левый верхний угол прямоугольника
TPoint pointBeginl (10, 10);
// правый нижний угол прямоугольника
TPoint pointEndl(40, 60);
// создаем прямоугольник
TRect drawRectl(pointBeginl, pointEndl);
// рисуем в прямоугольнике эллипс
gc.DrawEllipse(drawRectl);
/ /
/ /
// рисуем второй эллипс
// левый верхний угол прямоугольника
TPoint pointBegin2 (50, 20);
// правый нижний угол прямоугольника
TPoint pointEnd2(80, 80);
// оранжевый цвет для эллипса
TRgb colorOrange = AKN_LAF_COLOR(KOrange) ;
// толщина бордюра у эллипса
TSize penSizeRect2 (4, 8);
// устанавливаем толщину
gc.SetPenSize(penSizeRect2) ;
// задаем цвет бордюру эллипса
gc.SetPenColor(colorOrange);
// создаем второй прямоугольник
TRect drawRect2(pointBegin2, pointEnd2);
// рисуем в прямоугольнике эллипс
gc.DrawEllipse(drawRect2);
// сбрасываем установленные параметры
gc.Reset();
// рисуем третий эллипс
/ / ¦
// координаты верхнего левого угла
TPoint pointTopLeft3(90, 20);
// размер прямоугольника для эллипса
TSize sizeRect3(50, 100);
// светло зеленный цвет
TRgb colorGreen2 = AKN_LAF_COLOR(KGreen2);
// цвет кисти
gc.SetBrushColor (colorGreen2);
// закрашиваем кистью эллипс
gc.SetBrushStyle(CGraphicsContext::ESolidBrush); // задаем размер третьему прямоугольнику TRect drawRect3(pointTopLeft3, sizeRect3); // рисуем эллипс gc.DrawEllipse(drawRect3);
} у/**********************************************************
В качестве цвета для эллипсов используется оранжевый и зеленый цвета. В функции Draw () происходит создание и отрисовка трех эллипсов.
Первый эллипс формируется при помощи конструктора класса TRect с двумя параметрами класса TPoint. После того, как создан прямоугольник с заданными размерами, происходит вызов функции DrawEllipse (): gc.DrawEllipse(drawRectl);
В качестве параметра, функция принимает созданный прямоугольник, который представлен объектом drawRectl класса TRect. Все остальные действия по прорисовке эллипса происходят автоматически на основании размеров прямоугольника. Цвет и контурная линия заданы не были, а значит, толщина линии будет в один пиксель черного цвета.
Второй эллипс рисуется большего размера и имеет бордюр толщиной в (4, 8) пикселей. Два значения - 4 и 8 - это ширина рисуемого бордюра. Контур получается достаточно толстый, поэтому мы его закрасим в ярко-оранжевый цвет. В конце исходного кода по созданию второго эллипса вызывается функция Reset () для сброса установленных параметров для цвета и толщины линии.
Последний эллипс создан на основе конструктора класса TRect с параметрами, использующими классы TPoint и TSize, в которых задается левый верхний угол прямоугольника и его размер по ширине и высоте. Третий эллипс, вписанный в прямоугольник размером 50 на 100 пикселей, и закрашивается кистью в зеленый цвет: gc.SetBrushColor (colorGreen2); gc.SetBrushStyle(CGraphicsContext::ESolidBrush);
Рис. 9.5. Работа программы EllipsTest
После этого он рисуется на экране при помощи функции gc.DrawEllipse(drawRect3);
На рис. 9.5 изображена работа программы EllipsTest.
9.4. Рисуем часть круга
В английском языке есть слово Pie (пирог) и именно это слово имеет в своем названии функция DrawPie (), отвечающая за отрисовку фигуры, похожей на пирог с вырезанным треугольным кусочком. Применительно к программированию слово "пирог" звучит весьма необычно, поэтому дадим этой фигуре название часть круга.
Чтобы нарисовать часть круга необходимо, так же как и в случае с эллипсом, создать прямоугольную площадь, внутри которой и рисуется часть круга. Функция DrawPie () содержит три параметра:
? KPieRect - прямоугольная площадь, внутри которой рисуется часть круга на основе класса TRect;
? pieStartPoint - двойка целочисленных значений, определяемых с по
мощью класса TPoint, задающих начальную точку для части круга;
? pieEndPoint - целочисленное значение на основе класса TPoint, зада
ющее конечную точку для части круга.
С помощью первого параметра создается невидимый прямоугольник, внутри которого будет рисоваться часть круга. Стартовая точка pieStartPoint задает точку в пространстве площади прямоугольника по контуру рисуемого круга. Вторая точка pieEndPoint задает конец окружности и между первой и второй точками против часовой стрелки прорисовывается часть круга.
Перейдем к демонстрационной программе PieTest, иллюстрирующей принципы создания части круга. На компакт-диске программа находится в папке \Code\PieTest. В файле Test_AppView.cpp располагается основной код приложения, рассмотрим его.
// файл Test_AppView.cpp
// реализация класса CTestAppView
// рисуем часть круга у/*******************************************************
// подключаем системные библиотеки
#include
#include
#include
// подключаем файл ресурса
#include
// подключаем заголовочный файл
tinclude "Test_AppView.h"
// цветовые константы const Tint KOrange = 23; const Tint KGreen2 = 159;
// двухфазный конструктор
CTestAppView* CTestAppView::NewL(const TRectS aRect)
{
CTestAppView* self = CTestAppView::NewLC(aRect);
CleanupStack::Pop(self);
return self; }
// двухфазный конструктор
CTestAppView* CTestAppView::NewLC(const TRects aRect)
{
CTestAppView* self = new (ELeave) CTestAppView;
CleanupStack::PushL(self);
self->ConstructL(aRect);
return self; }
// двухфазный конструктор
void CTestAppView::ConstructL(const TRectS aRect) {
// создаем окно CreateWindowL();
// определяем клиентскую область SetRect(aRect);
// активизируем механизм прорисовки ActivateL(); }
// конструктор CTestAppView::CTestAppView() { }
// деструктор
CTestAppView::~CTestAppView() { }
// рисуем на экране void CTestAppView::Draw(const TRect& /*aRect*/) const
{
// получаем графический контекст окна CWindowGcS gc = SystemGcO; , // очищаем клиентскую область окна gc.Clear ();
/ /=== = ======:===:=== = = = ==== === = =: = = =: = === = = = -=== = = = = :=:==== =
// рисуем часть круга
// координаты верхнего левого угла
TPoint pointTopLeftl (10, 20);
// размер прямоугольника
TSize sizeRectl(80, 80);
// светло-зеленный цвет
TRgb colorGreen2 = AKN_LAF_COLOR(KGreen2);
// толщина линии
TSize penSizeRectl(4, 4);
// устанавливаем толщину
gc.SetPenSize(penSizeRectl);
// устанавливаем цвет
gc.SetPenColor(colorGreen2);
// рисуем прямоугольник
TRect drawRectl(pointTopLeftl, sizeRectl);
// начальная точка
TPoint pointBeginl(10, 20);
// конечная точка
TPoint pointEndl(80, 20);
// рисуем кусок круга
gc.DrawPie(drawRectl,pointBeginl, pointEndl);
// сброс настроек
gc.Reset();
// рисуем вторую часть круга
/ /
// координаты верхнего левого угла
TPoint pointTopLeft2 (100, 40);
// размер прямоугольника
TSize sizeRect2(60, 60);
// оранжевый цвет
TRgb colorOrange = AKN_LAF_COLOR(KOrange);
// устанавливаем цвет для кисти
gc.SetBrushColor(colorOrange);
// назначаем цвет кисти пирогу
gc.SetBrushStyle(CGraphicsContext::ESolidBrush);
// рисуем прямоугольник
TRect drawRect2(pointTopLeft2, sizeRect2);
// начальная точка
TPoint pointBegin2(10, 30);
// конечная точка
TPoint pointEnd2(50, 0);
// рисуем часть круга
gc.DrawPie(drawRect2, pointBegin2, pointEnd2);
} /у*******************************************************
Для первой части круга прямоугольная площадь задается размером 80 х 80 пикселей, создается бордюр (4, 4) и закрашивается в светло-зеленый цвет. Прямоугольник для части круга формируется на основе класса TRect с конструктором из двух параметров - TPoint и TSize, но выбор конструктора особого значения не имеет. Можно использовать любой удобный для вас конструктор при создании объекта класса TRect.
Затем с помощью строки кода: gc.DrawPie(drawRectl, pointBeginl, pointEndl);
рисуется первая часть круга и происходит сброс настроек цвета и бордюра функцией Reset ().
Вторая часть круга рисуется аналогичным образом, но с меньшим размером - 60 х 60 пикселей, пространство внутри части круга закрашивается в оранжевый цвет. На рис. 9.6 показан результат работы приложения PieTest.
9.5. Текст и шрифт
Рис. 9.6. Рисуем часть круга
Очень часто требуется выводить любые виды текстовых сообщений на экран для информирования пользователя, например, о количестве набранных очков в игре, оставшихся патронах или других информационных сообщений.
Работа с текстом в Symbian OS построена на использовании системных классов и отличается особой простотой. Давайте перейдем к примеру Text Test, который находится на компакт-диске в папке \Code\TextTest.
Так же как и в случае с рисованием графики, основные действия происходят в файле Test_AppView.cpp в функции Draw (). Рассмотрим исходный код файла Test_AppView.cpp проекта TextTest, иллюстрирующий простейший способ вывода текста на экран телефона.
/у*******************************************************
// файл Test_AppView.срр
// реализация класса CTestAppView
// текст
/ у*******************************************************
// подключаем системные библиотеки
#include
#include
tinclude
#include
// подключаем файл ресурса
#include
// подключаем заголовочный файл
#include "Test_AppView.h"
// двухфазный конструктор
CTestAppView* CTestAppView::NewL(const TRectS aRect)
{
CTestAppView* self = CTestAppView::NewLC(aRect); CleanupStack::Pop(self);
return self; }
// двухфазный конструктор
CTestAppView* CTestAppView::NewLC(const TRectS aRect) {
CTestAppView* self = new (ELeave) CTestAppView;
CleanupStack::PushL(self);
self->ConstructL(aRect);
return self; }
// двухфазный конструктор
void CTestAppView::ConstructL(const TRect& aRect) {
// создаем окно CreateWindowL();
// определяем клиентскую область SetRect(aRect);
// активизируем механизм прорисовки ActivateL(); }
// конструктор CTestAppView::CTestAppView() { }
// деструктор
CTestAppView::~CTestAppView() { }
// рисуем на экране
void CTestAppView::Draw(const TRectS /*aRect*/) const {
// получаем графический контекст окна
CWindowGc& gc = SystemGcO;
// очищаем клиентскую область окна