<< Пред. стр. 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
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;
// очищаем клиентскую область окна