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

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

 gc.Clear();
 // позиция для текста
 TPoint textPointPosition(20, 30);
 // строка текста
 TBuf<20> mytext;
 // загрузка текста
 StringLoader::Load(mytext, R_TEXT_FONT);
 // создаем шрифт
 const CFont* normalMyFont = iEikonEnv->NormalFont();
 // устанавливаем созданный шрифт
 
 gc.UseFont(normalMyFont);
 // рисуем текст
 gc.DrawText(mytext, textPointPosition);
 // очищаем память
 gc.DiscardFont() ;
 } /Z**************************************^*******************
  Изначально в исходном коде происходит подключение заголовочного файла stringloader.h для возможности работы с текстом.
  Перейдем в функцию Draw(). С помощью объекта textPointPosition класса TPoint создается точка в пространстве с координатами х=20 пикселей и у=30 пикселей. Этой точкой определяется верхний левый угол невидимой прямоугольной области, внутри которой будет выводиться текст на экране. Затем создается объект mytext класса TBuf, с возможностью хранения двадцати символов в буфере.
  Далее происходит вызов функции Load () с двумя параметрами. Первый параметр - это объект mytext, который будет содержать строку текста не более двадцати символов. Второй параметр как раз и определяет содержимое строки текста. В этом примере используется ресурс R_TEXT_FONT для гибкого подхода в локализации программы. В файле Text.rss в папке \Code\TextTest\group в ресурсах программы добавим расшифровку для R_TEXT_FONT. buf = "Text and Font";
  Теперь объект mytext содержит эту строку текста, и все готово для вывода ее на экран, но прежде надо задать шрифт для текста. Шрифт задается при помощи класса CFont: const CFont* normalMyFont = iEikonEnv->NormalFont ();
  Этой строкой кода происходит назначение одного из видов системного шрифта для сформированного ранее текста. Функция NormalFont () производит назначение простого шрифта под названием Normal (Нормальный). Результат этой операции сохраняется в объекте normalMyFont. В строке кода gc.UseFont(normalMyFont);
 простой шрифт назначается для всех последующих строк текста, и уже в функции DrawText () строка текста "Text and Font" выводится на экран. Всего существует три функции CGraphicsContext: : DrawText () с разными наборами параметров, регулирующими начертание текста на экране. Функция DrawText () в нашем примере имеет два параметра. Первый параметр - это строка текста, представленная объектом mytext, а второй параметр определяет позицию для вывода текста. А точнее, определяется позиция на экране для левого верхнего угла невидимой прямоугольной области, внутри которой рисуется текст. Размер прямоугольной области определяется автоматически функцией DrawText () на основании вида задействованного шрифта, а это размер и длина строки. В нашем случае, это двадцать символов, включая пробелы.
 
 
 
  Последняя функция DiscardFont () подстраховывает неправильное создание шрифта и освобождает память. На рис. 9.7 показана работа программы Text Test.
  Рис. 9.7. Работа программы TextTest
  Прямоугольная область, в которой выводится текст приложения, напрямую связана со стилем используемого шрифта и его размером. Каждый текст может иметь свое написание, заданное метрикой, с помощью которой определяется дистанция между буквами, наклон, высота букв и так далее. На основе этих данных формируется написание текста с заданным шрифтом. Помните, в первом классе были тетрадки в линеечку для прописи, где приходилось писать буквы в строго заданных линеечках с заданным наклоном и расстоянием между буквами?
 Вот это и есть метрика. Посмотрите на рис. 9.8, где схематично показана метрика, применяемая в Symbian OS.
 
 РИС. 9.8. Метрика
 ? Baseline - это горизонтальная линия, на которой расположен текст;
 ? Width - ширина буквы в тексте;
 ? Height - высота буквы в тексте;
 ? Ascent - дистанция от Baseline до верха буквы;
 ? Descent - расстояние от Baseline до низа буквы;
 ? Right Adjust - пространство после буквы;
 ? Left Adjust - пространство перед буквой;
 ? Move - это сумма значений в Width, Left Adjust и Right Adjust.
  Все вышеперечисленные метричные данные можно использовать при создании текста, вызвав функцию CGraphicsContext: : Draw () с нужным набором параметров. Сейчас давайте перейдем к примеру FontText, где показывается применение различных системных шрифтов. Проект находится в папке \Code\FontText. Нас интересует файл Test_AppView.cpp в папке \src в каталоге проекта, рассмотрим этот исходный код.
 // файл Test_AppView.cpp
 // реализация класса CTestAppView
 
 // различные виды шрифта
 // подключаем системные библиотеки
 #include
 tinclude
 #include
 #include
 // подключаем файл ресурса
 #include
 // подключаем заголовочный файл
 #include "Test_AppView.h"
 // цветовые константы const Tint KBlue = 210; const Tint KLightRed = 20; const Tint KOrange = 23; const Tint KBrown = 95; const Tint KDarkPurple = 141;
 // двухфазный конструктор
 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 TRectS /*aRect*/) const
 {
 // получаем графический контекст окна
 CWindowGcS gc = SystemGcO;
 // очищаем клиентскую область окна
 gc.Clear() ;
 // строка текста
 TBuf<20> mytext;
 // загрузка текста
  StringLoader::Load(mytext, R_TEXT_FONT);
 / /
 // шрифт Normal
 // синий цвет
 TRgb colorBlue = AKN_LAF_COLOR(KBlue);
 // цвет шрифта
 gc.SetPenColor(colorBlue);
 // позиция для текста
 TPoint textPointPositionl(10, 20);
 // создаем шрифт
 const CFont* normalMyFont = iEikonEnv->NormalFont();
 // устанавливаем созданный шрифт
 gc.UseFont(normalMyFont);
 // рисуем текст
 gc.DrawText(mytext, textPointPositionl);
 // очищаем память
 gc.DiscardFont();
 // сбрасываем настройки
 gc.Reset();
 / / = = = = = = = = = = = = = = = = = = = = = = = = = = = = :=: =
 // шрифт Title
 / / =====
 // позиция для текста
 TPoint textPointPosition2(30, 40);
 // создаем шрифт
 
 const CFont* titleMyFont = iEikonEnv->TitleFont();
 // устанавливаем созданный шрифт
 gc.UseFont(titleMyFont);
 // рисуем текст
 gc.DrawText(mytext, textPointPosition2);
 // очищаем память
 gc.DiscardFont ();
 // шрифт Annotation
 / /___.__.________________. "___ __
 // светло-красный цвет
 TRgb colorLightRed = AKN_LAF_COLOR(KLightRed);
 // устанавливаем цвет
 gc.SetPenColor(colorLightRed);
 // позиция для текста
 TPoint textPointPosition3(15, 55);
 // создаем шрифт
 const CFont* annotationMyFont = iEikonEnv-
  >AnnotationFont(); // устанавливаем созданный шрифт gc.UseFont(annotationMyFont); // рисуем текст
 gc.DrawText(mytext, textPointPosition3); // очищаем память gc.DiscardFont(); // сбрасываем настройки gc.Reset();
 // шрифт Legend
 // позиция для текста
 TPoint textPointPosition4(40, 70);
 // создаем шрифт
 const CFont* legendMyFont = iEikonEnv->LegendFont();
 // устанавливаем созданный шрифт
 gc.UseFont(legendMyFont);
 // рисуем текст
 gc.DrawText(mytext, textPointPosition4);
 // очищаем память
 gc.DiscardFont();
 I /_____._____________________________________.____
 // шрифт Symbol
 // оранжевый цвет
 
 TRgb colorOrange = AKN_LAF_COLOR(KOrange);
 // устанавливаем цвет
 gc.SetPenColor(colorOrange);
 // позиция для текста
 TPoint textPointPosition5(5, 85);
 // создаем шрифт
 const CFont* symbolMyFont = iEikonEnv->SymbolFont();
 // устанавливаем созданный шрифт
 gc.UseFont(symbolMyFont);
 // рисуем текст
 gc.DrawText(mytext, textPointPosition5);
 // очищаем память
 gc.DiscardFont();
 // сбрасываем настройки
 gc.Reset();
 // шрифт Dense
 // позиция для текста
 TPoint textPointPosition6(20, 100);
 // создаем шрифт
 const CFont* denseMyFont = iEikonEnv->DenseFont();
 // устанавливаем созданный шрифт
 gc.UseFont(denseMyFont);
 // рисуем текст
 gc.DrawText(mytext, textPointPosition6);
 // очищаем память
  gc.DiscardFont(); //======================================================
 // рисуем текст вертикально
 / /=== = ====== = = = === ==========:========= == = = ===== ===== = =:== =
 // позиция для текста
 TPoint textPointPosition7 (140, 20);
 // создаем шрифт
 const CFont* normalMyFontl = iEikonEnv->NormalFont();
 // устанавливаем созданный шрифт
 gc.UseFont(normalMyFontl);
 // рисуем текст
 gc.DrawTextVertical(mytext, textPointPosition7, EFalse);
 // очищаем память
 gc.DiscardFont ();
 // рисуем подчеркнутый текст
 
 // коричневый цвет
 TRgb colorBrown = AKN_LAF_COLOR(KBrown);
 // устанавливаем цвет
 gc.SetPenColor(colorBrown);
 // позиция для текста
 TPoint textPointPosition8(5, 120);
 // создаем шрифт
 const CFont* legendMyFontl = iEikonEnv->LegendFont();
 // устанавливаем созданный шрифт
 gc.UseFont(legendMyFontl);
 // устанавливаем тексту подчеркивание
 gc.SetUnderlineStyle(EUnderlineOn);
 // рисуем текст
 gc.DrawText(mytext, textPointPosition8);
 // очищаем память
 gc.DiscardFont();
 // сбрасываем подчеркивание
 gc.SetUnderlineStyle(EUnderlineOff);
 // рисуем зачеркнутый текст
 / / . __
 / /
 // темно-лиловый цвет
 TRgb colorDarkPurple = AKN_LAF_COLOR(KDarkPurple); // устанавливаем цвет gc.SetPenColor(colorDarkPurple); // позиция для текста TPoint textPointPosition9 (50, 135); // создаем шрифт
 const CFont* symbolMyFontl = iEikonEnv->SymbolFont(); // устанавливаем созданный шрифт gc.UseFont(symbolMyFontl); // устанавливаем зачеркивание текста gc.SetStrikethroughStyle(EStrikethroughOn); // рисуем текст
 gc.DrawText(mytext, textPointPosition9); // очищаем память gc.DiscardFont(); }
  В примере FontTest на экран последовательно выводится одна и та же строка текста, но при этом для каждой строки используется свой шрифт. Мы задействовали шесть шрифтов: Normal, Title, Annotation, Legend, Symbol и Dense. Из англоязычных названий нетрудно догадаться о предназначении каждого. В Symbian OS есть и другие шрифты, информацию о них можно найти в справочной системе.
 
  Позиции для строк текста задавались целочисленными значениями на основании класса TPoint, цель которого состоит в создании точки в пространстве. Для вывода шрифта на экран можно еще воспользоваться функциями Height () и width () для получения значений высоты и ширины экрана. Например, для нахождения точки в центре экрана можно написать такой код: TPoint centerPoint(aRect.Width(), aRect.Height());
  По умолчанию цвет текста черный, а для изменения цвета необходимо задействовать функцию SetPenColor () с цветовой константой, как это было сделано в предыдущих разделах. Исходный код, рисующий строку текста на экране, закомментирован. Надеюсь, вам не составит труда разобраться с ним самостоятельно. Лишь две конструкции кода с созданием подчеркнутого и зачеркнутого текста тре-
 
  Рис. 9.9. Работа программы FontTest
 буют к себе внимания. В этом случае шрифт, текст, цвет и вывод строки текста происходит как обычно, но еще за-действуется функция SetUnderlineStyle () для установки подчеркивания текста и функция SetStri-kethroughStyle () для зачеркивания текста. В обоих случаях в качестве параметров используются константы с окончанием On для включения задействованных установок (EUnderlineOn и EStrikethroughtOn). Чтобы отключить установленные свойства для текста, воспользуйтесь аналогичными константами, но с концовкой Off, как это сделано в подчеркнутом тесте. Вызов функции Reset () так же сбросит все установленные настройки. На рис. 9.9 показана работа программы FontTest.
 9.6. Работа с изображениями
  Графические изображения очень часто применяются в программах, в основном в играх или при создании различных логотипов. В Symbian OS формат для графических изображений МВМ (Multi-bitmap), создаваемый на основе конвертации точечного рисунка BMP. Можно так же загружать изображения в форматах GIF и JPEG, но они все равно будут конвертированы в формат МВМ и процесс конвертации этих форматов гораздо сложнее, чем BMP, поэтому на начальном этапе намного проще работать с точечными рисунками.
  Первое, что нужно сделать в проекте, где вы собираетесь загружать BMP файл(ы) - это открыть проектный файл ММР и задекларировать команды для загрузки изображения. Формат декларации строго определен и происходит в следующем порядке:
 ? START BITMAP - команда, объявляющая о начале блока команд для изоб
 ражения;
 ? HEADER - эта команда показывает, что сгенерированный файл МВМ ком
 пилятор должен искать в каталоге \SDK\Epoc32;
 ? TARGETPATH - это путь к файлу МВМ в системе;
 ?
 ? SOURCEPATH - это путь к файлу в вашем проекте. Предварительно в проек
 те создается папка с любым удобным названием, например, bitmaps, image, и
 в ней размещается загружаемое в программу изображение;
 ? SOURCE - название файла BMP;
 ? END - команда, завершающая блок команд для точечного рисунка.
  Теперь давайте перейдем к демонстрационному примеру ImageTest, где происходит загрузка BMP-файла размером 174 х 144 пикселя, задействуя тем самым всю клиентскую область приложения. Проект ImageTest на компакт-диске находится в папке \Code\ImageTest. Сразу перейдем к файлу Test.mmp в папке \group проекта и посмотрим, каким образом была объявлена загрузка файла Bmp.bmp из папки \image проекта ImageTest.
 START BITMAP Test.mbm
 HEADER
 TARGETPATH \system\apps\test
 SOURCEPATH ..\image
 SOURCE cl2 Bmp.bmp
 END
  После этого можно импортировать проект ImageTest в любую среду программирования и разбираться с кодом программы.
  Для работы с BMP в заголовочном файле Test_AppView.cpp проекта ImageTest объявляется объект iBitmap класса CFbsBitmap. Класс CFbsBitmap - это основной класс для работы с точечными рисунками, но еще существует класс CWsBitmap, значительно расширяющий возможность работы с Window Server. Теперь давайте перейдем к исходному коду файла Test_AppView.cpp, который находится в папке \Code\ImageTest\src\Test_AppView.cpp, и где происходят основные действия по загрузке изображения в приложение.
 у/*******************************************************
 // файл Test_AppView.срр
 // реализация класса CTestAppView
 // загружаем точечный рисунок
 //А******************************************************
 // подключаем системные библиотеки
 tinclude
 ¦include
 #include
 #include
 // подключаем файл ресурса
 #include v
 tinclude
 // подключаем заголовочный файл
 #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 TRectS aRect) {
 // путь к файлу Test.mbm
 _LIT(KPath, "WsystemWappsWtestWTest.mbm") ;
 // bitmap представляет изображение
 TFileName bitmap (KPath);
 // загружаем изображение
 iBitmap = CEikonEnv::Static()->CreateBitmapL(bitmap, 0);
 // создаем окно
 CreateWindowL ();
 // определяем клиентскую область
 SetRect(aRect);
 // активизируем механизм прорисовки
  Activate!. () ; }
 // конструктор CTestAppView::CTestAppView() { }
 // деструктор
 CTestAppView::-CTestAppView() {
  delete iBitmap; }
 // рисуем на экране
 void CTestAppView::Draw(const TRectS /*aRect*/) const {
 // получаем графический контекст окна
 
 CWindowGcS gc = SystemGcO;
 // очищаем клиентскую область окна

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

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