<< Пред.           стр. 15 (из 32)           След. >>

Список литературы по разделу

 CAknPasswordSettingItern(aldentifier,
 CAknPasswordSettingltem:rEAlpha, iData->iPw);
 break;
 case EAknExSettingPassNumber:
 settingltem = new (ELeave)
 CAknPasswordSettingltem(aIdentifier,
 CAknPasswordSettingltem::ENumeric,
  iData->iPin); break; case EAknExSettinglpAddress:
 settingltem = new (ELeave)CAknIpFieldSettingItem(
 aldentifier,iData-
 
 >iIpAddress);
 break;
 default:
 break;
 }
  return settingltem; }
  Все достаточно просто: создается указатель на объект settingltem класса CAknSettingltem, и при выборе одной из констант перечисляемого типа TaknExSettingltem, объявленного в файле CAknExSettingList.hrh, происходит поочередное создание всех типов списка Setting.
  Последний класс, CAknExSettingListltemData, содержит необходимые данные для каждого из типов списка. В файле PKG находятся выходные данные для создания установочного пакета программы Setting List.
 В следующей главе будет рассматриваться работа с графикой.
 
 Глава 9. Программирование графики
 Создавая программы с использованием графики можно сформировать красивое и неповторимое приложение. Гораздо приятней пользоваться программой с красочно оформленным интерфейсом, чем с программой, созданной в рамках классического оформления встроенных приложений Symbian OS. Операционная система Symbian имеет множество возможностей в работе с графикой, и в этой главе мы рассмотрим основные базовые компоненты.
  Механизм работы с графикой в Symbian OS построен на основе взаимодействия приложения с Window Server (Сервер окна). На рис. 9.1 схематично показана общая модель взаимодействия Window Server и программ.
 
 Рис. 9.1. Взаимодействие программ и Window Server
  Для каждого приложения с помощью класса RWsSession создается сессия, связывающая программу с Window Server, через который на системном уровне происходит вывод графики на экран телефона и ее обновление, в случае если пользователь совершит действия по нажатию клавиш. Класс RWsSession низкоуровневый. Его задача состоит в обеспечении доступа приложения к Window Server. В свою очередь Window Server снабжает программу полноценным механизмом работы с графикой и обработкой событий, поступающих от пользователя и связанных с изменением состояния графического контекста.
  В Symbian OS имеются графические библиотеки, содержащие разнообразный набор функциональных возможностей. Рассмотрим эти библиотеки:
 ? GDI - базовая библиотека для всех графических ресурсов системы. Обеспечивает работу со шрифтом, цветом и разного рода геометрическими операциями;
 
 ? WS32 представляет работу с Window Server, осуществляя доступ к графи
 ческому контексту;
 ? BITGDI - библиотека для работы с изображениями или точечными ри
 сунками (BMP);
 ? FBSCLI представляет Font Server и Bitmap Server для работы со шрифта
 ми и изображениями;
 ? MEDIACLINTIMAGE - мультимедийная библиотека для различных гео
 метрических операций с изображениями.
 ?
 
 Рис. 9.2. Система координат в Symbian OS
 
 В Symbian OS (в отличие от декартовой системы координат) применяется перевернутая система. Начальная точка (0, 0) системы координат находится в верхнем левом углу. Положительная ось X идет слева направо по верхней кромке экрана, а положительная ось Y - сверху вниз по левой стороне экрана (см. рис. 9.2).
  Такая же система координат применяется в компьютерных системах и в мобильных телефонах при работе с двухмерной графикой.
  Теперь давайте перейдем к конкретным примерам, демонстрирующим практическую сторону программирования графики.
 
 9.1. Рисование линий
  Начнем с самого простейшего. Нарисуем на экране беспорядочно четыре линии, закрашенные разными цветами. Для этого нам надо будет выполнить определенный алгоритм действий. Прежде всего, устанавливаются две точки для начала и конца линии. Каждая точка должна содержать координаты по осям X и Y, как показано на рис. 9.2. Затем необходимо задать толщину линии. Далее выбирается цвет линии, стиль начертания, после чего можно рисовать ее на экране. Но прежде чем перейти к исходному коду программы LineTest, надо более тщательно ознакомится с цветовой составляющей в Symbian OS.
  Цвет в Symbian OS задан в виде констант с целочисленными значениями. Любой нарисованный графический элемент можно закрашивать каким-либо цветом, а для упрощения этого процесса в Symbian OS определен макрос AKN_LAF_COLOR (). Смысл работы этого макроса очень прост: в исходном коде создается константа, например, для зеленого цвета: const Tint KGreen = 185;
 и с помощью макроса AKN_LAF_COLOR () происходит преобразование цветовой составляющей в RGB-значение. TRgb colorGreen = AKN_LAF_COLOR( KGreen );
  Переменная colorGreen используется непосредственно в исходном коде для установки цвета графическому элементу. Для каждого из цветов в Symbian OS задается целочисленное значение, которое вы можете найти в табл. 9.1. Зеленый и серый цвета с номерами - это разные градации или оттенки этих цветов.
 
 Таблица 9.1. Цветовые значения
 Цвет Значение
 Белый О
 Желтый 5
 Светло-желтый цвет 9
 Светло-фиолетовый 13
 Темно-желтый 17
 Светло-красный 20
 Оранжевый 23
 Красный 35
 Серый 3 43
 Светло-коричневый 51
 Светло-зеленый 76
 Светло-сиреневый 84
 Серый 6 86
 Коричневый 95
 Фиолетовый 105
 Темно-красный 107
 Светло-синий 120
 Серый 9 129
 Темно желтый 131
 Темно-коричневый 137
 Темно-фиолетовый 141
 Светло-зеленый 2 146
 Зеленый 2 159
 Серый 12 172
 Темно-сиреневый 176
 Зеленый 185
 Синий 210
 Черный 215
 Серый 1 216
 Серый 2 217
 Серый 4 218
 Серый 5 219
 Серый 7 220
 Серый 8 221
 Серый 10 222
 Серый 11 223
 Серый 13 224
 Серый 14 225
  Рассмотрим программу LineTest, в которой происходит прорисовка четырех линий. Команды меню для программы LineTest опущены, но в окончательном варианте программе, готовой для установки на телефон все команды для подэкранных клавиш должны быть обработаны соответствующим образом. На компакт-диске программа LineTest находится в папке \Code\LineTest\. Вся работа по рисованию графики происходит в функции Draw () файла исходного кода Test_AppView.cpp, рассмотрим этот код.
 
 // файл Test_AppView.cpp
 // реализация класса CTestAppView
 // рисуем линии
 //*******************************************************
 // подключаем системные библиотеки
 #include
 ¦include
 ¦include
 // подключаем файл ресурса
 ¦include
 // подключаем заголовочный файл
 #include "Test_AppView.h"
 // цветовые константы const Tint KOrange = 23; const Tint KDarkRed = 107; const Tint KLightViolet = 84; const Tint KBrown = 137;
 // двухфазный конструктор
 CTestAppView* CTestAppView::NewL(const TRect& aRect)
 {
 CTestAppView* self = CTestAppView::NewLC(aRect);
 Cleanupstack::Pop(self) ;
  return self; }
 // двухфазный конструктор
 CTestAppView* CTestAppView::NewLC(const TRect& 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();
 // оранжевый цвет
 TRgb colorOrange = AKN_LAF_COLOR(KOrange) ;
 // темно-красный цвет
 TRgb colorDarkRed = AKN_LAF_COLOR(KDarkRed);
 // сиреневый цвет
 TRgb colorLightViolet = AKN_LAF_COLOR(KLightViolet);
 // коричневый цвет
 TRgb colorBrown = AKN_LAF_COLOR(KBrown);
 // начальная точка для первой линии
 TPoint pointBeginl(20, 10);
 // конечная точка для первой линии
 TPoint pointEndl(20, 120);
 // определяем толщину первой линии
 TSize penSizePointl(3, 3);
 // задаем толщину первой линии
 gc.SetPenSize(penSizePointl);
 // задаем цвет первой линии
 gc.SetPenColor(colorOrange);
 // стиль начертания первой линии
 gc.SetPenStyle(CGraphicsContext::ESolidPen);
 // рисуем первую линию
 gc.DrawLine(pointBeginl, pointEndl);
 // вторая линия
 TPoint pointBegin2(40, 10);
 TPoint pointEnd2(40, 120);
 
 TSize penSizePoint2(3, 3); gc.SetPenSize(penSizePoint2); gc.SetPenColor(colorDarkRed); gc.SetPenStyle(CGraphicsContext::ESolidPen); gc.DrawLine(pointBegin2, pointEnd2);
 // третья линия
 TPoint pointBegin3(60, 40);
 TPoint pointEnd3(140, 40);
 TSize penSizePoint3(3, 3) ;
 gc.SetPenSize(penSizePoint3);
 gc.SetPenColor(colorLightViolet);
 gc.SetPenStyle(CGraphicsContext::ESolidPen);
 gc.DrawLine(pointBegin3, pointEnd3);
 // четвертая линия TPoint pointBegin4(60, 40); TPoint pointEnd4(140, 120); TSize penSizePoint4(3, 3); gc.SetPenSize(penSizePoint4); gc.SetPenColor(colorBrown);
 gc.SetPenStyle(CGraphicsContext::ESolidPen); gc.DrawLine(pointBegin4, pointEnd4); }
  Для работы с макросом ANN_LAF_COLOR () в начале исходного кода подключается заголовочный файл eikenv.h. Затем объявляются цветовые константы для оранжевого, темно-красного, светло-сиреневого и коричневого цветов с присвоением им целочисленных значений для каждого цвета.
 // цветовые константы const Tint KOrange = 23; const Tint KDarkRed = 107; const Tint KLightViolet = 84; const Tint KBrown = 137;
  Определив таким образом цветовые константы и подключив заголовочный системный файл eikenv.h, переходим в функцию Draw (), где происходит процесс отрисовки графики на экране. После получения графического контекста и очистки клиентской области экрана, производится конвертация цветовых значений с помощью макроса ANN_LAF_COLOR () для всех четырех цветов.
 // оранжевый цвет
 
 TRgb colorOrange = AKN_LAF_COLOR(KOrange);
 // темно-красный цвет
 TRgb colorDarkRed = AKN_LAF_COLOR(KDarkRed) ;
 // сиреневый цвет
 TRgb colorLightViolet = AKN_LAF_COLOR(KLightViolet);
 // коричневый цвет
 TRgb colorBrown = AKN_LAF_COLOR(KBrown);
  В дальнейшем все четыре переменные для четырех разных цветов будут участвовать в закрашивании четырех линий.
  Для того чтобы нарисовать линию, нам нужно определиться с начальной и конечной точкой, а отрезок между ними и будет нашей линией. Каждая точка состоит из пары значений по осям X и Y.
 // начальная точка для первой линии TPoint pointBeginl (20, 10); // конечная точка для первой линии TPoint pointEndl(20, 120);
  Объект pointBeginl класса TPoint содержит координаты для начальной точки линии: по оси X это 20 пикселей, а по оси Y 10 пикселей.
  В Symbian OS есть три специализированных класса: TPoint, TSize и TRect для облегчения программирования графики. При создании объектов pointBeginl и pointEndl был задействован конструктор класса TPoint, содержащий позиции координат по осям X и Y. Класс TPoint используется специально для создания точки в пространстве. Если же вы хотите переназначить координаты точки, используя уже объявленный, созданный и инициализированный объект, воспользуйтесь функцией SetXY ().
  После создания двух точек в пространстве надо определить толщину рисуемой линии.
 // определяем толщину первой линии TSize penSizePointl(3, 3) ; // задаем толщину первой линии gc.SetPenSize(penSizePointl) ;
  В этом случае задействуется класс TSize, при создании объекта которого применяется конструктор с двумя целочисленными параметрами TSize (iwidth, iHeight), задающими ширину и высоту для определенной области. В нашем случае мы рисуем линию, поэтому заданный размер будет толщиной линии, а именно, в три пикселя.
  И в конце задаем цвет, стиль начертания и рисуем линию с помощью функции DrawLine (), параметры которой - это начальная и конечная точки, между которыми рисуется линия.
 
 
  Аналогично рисуются оставшиеся три линии, но уже со своими координатами и цветом. На рис. 9.3 изображена работа программы LineTest.
 9.2. Рисуем прямоугольник
  Рис. 9.3. Работа программы LineTest
  Нарисовать прямоугольник на экране можно несколькими способами. Класс TRect, рисующий фигуры прямоугольной формы имеет три различные конструктора. Создавая объект класса TRect, и применяя один из конструкторов можно добиться различной реализации одной и той же задачи. Иногда в исходном коде удобнее использовать один вид конструктора, иногда другой. Рассмотрим имеющиеся конструкторы класса TRect.
 Первый конструктор имеет четыре параметра для создания прямоугольника. TRect (Tint aAx, Tint aAy, Tint aBx, Tint aBy) Параметры конструктора класса TRect:
 ? aAx - целочисленное значение и точка по оси X;
 ? аАу - целочисленное значение первая точка по оси Y;
 ? аВх - целочисленное значение вторая точка по оси X;
 ? аВу - целочисленное значение вторая точка по оси Y.
  Между двух этих координат в пространстве происходит прорисовка прямоугольной фигуры.
  Во втором конструкторе определены два параметра, но в качестве параметров используется класс TPoint, с которым вы знакомы по предыдущему разделу. С помощью класса TPoint можно создать точку в пространстве, применяя двойку целочисленных значений по осям X и Y для определения координат точки. TRect (const TPointS aPointA, const TPointS aPointB)
 Параметры конструктора TRect:
 ? aPointA - левый верхний угол прямоугольника;
 ? aPointB - правый нижний угол прямоугольника.
  Относительно этих двух точек в пространстве формируется остальное построение фигуры. Третий конструктор класса TRect имеет еще более интересную конструкцию. Имеются два параметра, первый - это точка в пространстве (левый верхний угол), а второй - это высота и ширина прямоугольника. На основании этих данных и рисуется прямоугольник. TRect (const TPointS aPoint, const TSizeS aSize)
 Параметры конструктора TRect:
 ? aPoint - левый верхний угол в пространстве;
 ? aSize - ширина по оси X и высота оп оси Y для рисуемого прямоугольника.
  Класс TSize - это еще один основной класс для упрощения работы с графикой в Symbian OS.
  Конструктор TSize выглядит следующим образом: TSize (Tint aWidth, Tint aHight)
 >
 
  Два целочисленных параметра определяют размер некой фигуры на основании ширины aWidth и высоты aHight. Все значения задаются в пикселях, как впрочем, и для других параметров классов TRect и TPoint.
  Теперь перейдем к демонстрационному примеру, который находится на компакт-диске в папке \Code\RectTest. Основные действия по представлению графики на экране в проекте RectTest происходят в файле Test_AppView.cpp, рассмотрим его код.
 /у*******************************************************
 // файл Test_AppView.срр
 // реализация класса CTestAppView
 // рисуем четыре прямоугольника
 // подключаем системные библиотеки
 ¦include
 #include
 #include
 // подключаем файл ресурса
 ¦include
 // подключаем заголовочный файл
 ¦include "Test_AppView.h"
 // цветовые константы const Tint KBlue = 210; const Tint KDarkPurple = 141; const Tint KGreylO = 219; const Tint KBlack = 215; const Tint KDarkYellov = 17;
 // двухфазный конструктор
 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
 {
 // получаем графический контекст окна
 CWindowGc& gc = SystemGcO;
 // очищаем клиентскую область окна
  gc.Clear(); //===================================^================
 // рисуем первый прямоугольник, используя конструктор // TRect(TInt aAx, Tint aAy, Tint aBx, Tint aBy)
 // синий цвет
 TRgb colorBlue = AKN_LAF_COLOR(KBlue); // цвет первого прямоугольника gc.SetPenColor(colorBlue); // задаем размер первого прямоугольника TRect drawRectl(10, 20, 50, 70); // рисуем первый прямоугольник gc.DrawRect(drawRectl); /7================================^===================
 // рисуем второй прямоугольник, используя конструктор // TRect(const TPoints aPointA, const TPointS aPointB);
 // темно-лиловый цвет
 TRgb colorDarkPurple = AKN_LAF_COLOR(KDarkPurple);
 // точка для верхнего левого угла прямоугольника
 
 TPoint pointBeginl(30, 40);
 // точка для правого нижнего угла прямоугольника
 TPoint pointEndl(60, 80);
 // толщина бордюра
 TSize penSizeRect2(б, 6);
 // устанавливаем толщину
 gc.SetPenSize(penSizeRect2);
 // цвет второго прямоугольника
 gc.SetPenColor(colorDarkPurple);
 // задаем размер второму прямоугольнику
 TRect drawRect2(pointBeginl, pointEndl);
 // рисуем второй прямоугольник
 gc.DrawRect(drawRect2);

<< Пред.           стр. 15 (из 32)           След. >>

Список литературы по разделу