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

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

 ¦include "Test_AppUi.h"
 // двухфазный конструктор
 CTestDocument* CTestDocument::NewL(CEikApplicationS aApp)
 {
 CTestDocument* self = NewLC(aApp);
 CleanupStack::Pop(self);
  return self; }
 // двухфазный конструктор
 CTestDocument* CTestDocument::NewLC(CEikApplicationS aApp) {
 CTestDocument* self = new (ELeave) CTestDocument(aApp);
 CleanupStack::PushL(self);
 self->ConstructL ();
 return self;
 
 // двухфазный конструктор
 void CTestDocument::ConstructL()
 // простой конструктор без реализации CTestDocument::CTestDocument(CEikApplicationS aApp) : CAknDocument(aApp)
 // деструктор
 CTestDocument::-CTestDocument()
 // создает интерфейс пользователя CEikAppUi* CTestDocument::CreateAppUiL() {
  return new (ELeave) CTestAppUi; }
  В начале исходного кода файла Test_Document.cpp происходит подключение заголовочных файлов приложения Test. Затем описываются двухфазные конструкторы, использующие функции NewL (), NewLC () и ConstructL () для работы со стеком. Деструктор и простой конструктор CTestDocument () пока остаются без реализации. Функция CreateAppUiL () способствует созданию каркаса интерфейса пользователя посредством класса CTestAppUi. Класс CTestDocument может использоваться и для сохранения и чтения данных приложения, применяя функции StoreLO и RestoreLO, которые нужно объявить в заголовочном файле и описать в файле реализации.
 7.3.4. Класс CTestAppUi
  Класс CTestAppUi завершает создание каркаса интерфейса пользователя и является получателем различных уведомлений, которые инициализируются структурой приложения, обрабатывая тем самым события, полученные от пользователя.
  Заголовочный файл Test_AppUi.h содержит объявления класса CTestAppUi и находится на компакт-диске к книге в папке \Code\Test\inc\Test_AppUi.h. Рассмотрим исходный код этого файла.
 /у*******************************************************
 // заголовочный файл Test_AppUi.h // спецификация класса CTestAppUi
 
 // проверяем лексему tifndef _Test_APPUI_H_ tdefine _Test_APPUI_H_
 // подключаем системную библиотеку
 #include
 // ссылка на класс class CTestAppView;
 // объявляем класс CTestAppUi
 class CTestAppUi : public CAknAppUi
 {
 public:
 void ConstructLO ; // конструктор CTestAppUi() ; // деструктор -CTestAppUi();
 public:
 // события
 void HandleCommandL(Tint aCommand);
 private:
  CTestAppView* iAppView; };
 #endif // _Test_APPUI_H_
  В третьей строке кода происходит подключение системной библиотеки aknappui.h для работы с классом CAknAppUi. В объявлении класса CTestAppUi используется оператор ":", указывающий на наследование классом CTestAppUi всех возможностей системного класса CAknAppUi уровня Avkon серии 60. В классе происходит объявление двух конструкторов, деструктора и функции HandleCommandL () для обработки пользовательских событий. Также создается указатель на объект класса CTestAppView,
  Перейдем к файлу Test_AppUi.cpp, который находится на компакт-диске в папке \Code\Test\src\Test_AppUi.cpp и содержит реализацию класса CTestAppUi.
 
 /у*******************************************************
 // файл Test_AppUi.cpp
 // реализация класса CTestAppUi
 // подключаем системные библиотеки
 #include
 #include
 // подключаем файл ресурса
 ¦include
 // подключаем заголовочные файлы
 ¦include "Test_AppUi.h"
 ¦include "Test_AppView.h"
 ¦include "Test.hrh"
 ¦include "Test.pan"
 // конструктор .
 void CTestAppUi::ConstructL()
 {
 // основной конструктор завершающий создание UI BaseConstructL() ; // создаем клиентскую область iAppView = CTestAppView::NewL(ClientRect()); // добавляем в стек AddToStackL(iAppView); }
 // конструктор CTestAppUi::CTestAppUi() { }
 // деструктор CTestAppUi::-CTestAppUi() {
 if (iAppView) {
 // удаляем из стека
 iEikonEnv->RemoveFromStack(iAppView); // удаляем объект delete iAppView; // обнуляем iAppView = NULL;
 // обработка команд
 void CTestAppUi::HandleCommandL(Tint aCommand)
 
 switch(aCommand)
 {
 // выход
 case EEikCmdExit:
 case EAknSoftkeyExit:
  ExitO ; break; // паника default:
  User::Panic (_L("Test"), ETestBasicUi); break;
 
 //
 
 *******************************************************
 
  Первоначально в исходном коде файла Test_AppUi.cpp происходит подключение системных библиотек. Avkon.hrh - это своеобразный заголовочный системный файл уровня Avkon для всех ресурсов программы, работающих с меню, диалогами и списками. Далее происходит подключение заголовочных файлов создаваемого приложения. В файле Test.hrh содержится спецификация ресурсов нашей программы, а в файле Test.pan определен исходный код для обработки внештатных ситуаций. В Symbian OS существует специальный термин Panic (Паника), его мы и будем придерживаться. Содержание этих двух заголовочных файлов будет рассмотрено в этой главе позже.
  Функция ConctructLO, играющая роль конструктора, состоит из трех строк исходного кода формирующего каркас UI. В первой строке кода происходит вызов системного конструктора BaseConstructL (), создающего Ш. Затем с помощью функции ClientRect () создается или определяется клиентская область экрана телефона. Полученное значение сохраняется в объекте iAppView, который в свою очередь посредством функции AddToStackL () добавляется в стек.
  Деструктор класса CTestAppUi содержит полный цикл по удалению активного объекта из стека
 iEikonEnv->RemoveFromStack(iAppView); delete iAppView; и обязательно обнуляется. iAppView = NULL;
 Не забывайте после удаления объекта явно присваивать ему значение NULL.
  Функция HandleCommandL () реализует обработку событий, полученных с подэкранных клавиш телефона. С помощью оператора switch происходит обработка имеющихся вариантов действий пользователя. На этом этапе задействована единственная команда Exit, расположенная под правой подэкранной клавишей телефона. В телефоне имеются две клавиши, расположенные под экраном телефона с левой и с правой стороны. Это две программно определенные клавиши (Soft key), необходимые для удобства работы с меню, диалогами, списками.
 
 В функции HandleCommandL () команда EEikCmdExit создает команду Exit на подэкранной клавише, а команда ЕAknSо f t keyExi t задает программную клавишу для использования команды Exit путем вызова функции Exit (), которая на системном уровне включает механизм корректного завершения программы.
  При работе с командами, когда применяется конструкция операторов case, надо не забывать использовать ключевое слово break, иначе после выполнения определенных действий, прописанных за оператором case, управление будет передано следующему оператору case. Оператор default обрабатывает любые другие действия, неописанные в функции HandleCommandL (). В этом случае используется функция User: : Panic () , отслеживающая внештатные ситуации или панику, связанную с событиями, полученными от пользователя, но не описанными в функции HandleCommandL (). Например, если сейчас запустить на эмуляторе программу Test, то на двух подэкранных клавишах вы увидите две команды: слева - Options, а справа - Exit. Команда Exit была обработана в приложении, при ее выполнении последует выход из программы. А вот команда Options нами пока не использовалась, но при ее выполнении должно что-то произойти, потому что команда эта есть и соответственно ее можно выполнить, нажав подэкранную клавишу. И вот для того, чтобы не произошло ошибки или внештатной ситуации, программа "не запаниковала" (если так можно выразиться), используется функция User: : Pan i с (). Эта функция имеет два параметра. Первый - это текстовое сообщение, которое будет представлено в уведомлении, и где, как правило, используется название программы. Второй параметр в функции User: :Panic () - это перечисление ETestBasicUi, определенное в файле Test.pan для обработки простейшей паники, связанной с пользовательскими данными. Если вы сейчас запустите программу Test и выполните команду Options, то в ответ появится небольшое по размеру информационное окно с сообщением о возникшей ошибке, что и является реакцией программы на возникшую внештатную ситуацию.
 7.3.5. Класс CTestAppView
  Класс CTestAppView определяет представление имеющихся данных приложения относительно экрана телефона, создавая при этом окно и отображая в нем прикладные данные. Спецификация класса CTestAppView находится в файле Test_AppView.h на компакт-диске в папке \Code\Test\inc\Test_AppView.h, рассмотрим исходный код этого класса.
 // заголовочный файл Test_AppView.h // спецификация класса CTestAppView
 // проверяем лексему #ifndef _Test_APPVIEW_H tdefine Test APPVIEW H
 
 // подключаем системную библиотеку #include
 class CTestAppView : public CCoeControl
 {
 public:
 // двухфазный конструктор
 static CTestAppView* NewL(const TRect& aRect);
 static CTestAppView* NewLC(const TRects aRect);
 // деструктор
 ~CTestAppView();
 public:
  void Draw(const TRectS aRect) const; private:
 void ConstructL(const TRects aRect); CTestAppView();
 #endif // _Test_APPVIEW_H_
  В начале исходного кода происходит подключение системной библиотеки coecntrl.h для возможности работать с системным классом CCoeControl, потенциал которого наследует класс CTestAppView. При объявлении класса CTestAppView создается стандартная конструкция с применением двухфазного конструктора и деструктора, а также декларируется использование функции Draw () для рисования графики в клиентской области экрана, чтобы нарисовать на экране пару прямоугольников для красоты. Сейчас создается каркас программы, в который затем можно интегрировать графику, шрифт, элементы интерфейса пользователя. Для того, чтобы не смотреть на пустой белый экран, задействуется функция Draw ().
  Теперь перейдем к файлу Test_AppView.cpp, на компакт-диске он находится в папке \Code\Test\src\Test_AppView.cpp.
 // файл Test_AppView.срр
 // реализация класса CTestAppView
 //*******************************************************
 // подключаем системные библиотеки #include
 
 #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 TRectS aRect) {
 // создаем окно CreateWindowL() ;
 // определяем клиентскую область SetRect(aRect);
 // активизируем механизм прорисовки ActivateL(); }
 // конструктор CTestAppView::CTestAppView()
 // деструктор
 CTestAppView: : --CTestAppView ()
 // рисуем на экране
 void CTestAppView::Draw(const TRectS /*aRect*/) const
 {
 // получаем графический контекст окна
 CWindowGc& gc = SystemGcO;
 // очищаем клиентскую область окна
 
 gc.Clear();
 // определяем область прорисовки
 TRect drawRect = Rect();
 // задаем размер прямоугольнику
 drawRect.Shrink(10,10);
 // рисуем прямоугольник
 gc.DrawRect(drawRect);
 // задаем размер второму прямоугольнику
 drawRect.Shrink(15,30);
 // рисуем второй прямоугольник
 gc.DrawRect(drawRect);
 } //*******************************************************
  В реализации класса CTestAppView описывается стандартный двухфазный конструктор на основе функций NewL () и NewLC () с использованием стека. В функции ConstructL (), играющей роль конструктора, сначала при помощи функции CreateWindowL () создается окно, затем определяется клиентская область экрана, на которой можно рисовать графику или задействовать различные элементы пользовательского интерфейса. Что же такое клиентская область? Как вы знаете из главы 1, окно или экран телефона разделены на три панели: Status Pane, Main Pane и Control Pane. По умолчанию клиентская область определена как Main Pane, ее мы и используем. Если выражаться языком Windows-программирования - это оконный режим. И в конце функции ConstructL () происходит активизация всех ранее созданных элементов вызовом функции Acti-vateL().
  Функция Draw () рисует два прямоугольника на экране телефона. Первым делом в функции Draw () нам необходимо получить графический контекст окна, чтобы было на чем рисовать графику, шрифты и элементы интерфейса пользователя, для этого задействуется функция SystemGc (). CWindowGc& gc = SystemGc();
  Дальше очищаем клиентскую область экрана телефона при помощи функции Clear (), у которой в этом случае нет аргументов, а значит, в качестве цвета очистки используется белый цвет. Затем определяем область прорисовки в строке исходного кода: TRect drawRect = Rect();
  В следующей строке кода происходит создание прямоугольника с заданными размерами: drawRect.Shrink(10,10);
  Функция Shrink () создает в пространстве область определенного размера и имеет для этого два параметра. Первый - это координата по оси X, второй - координата по оси Y. Отсчет происходит с левого верхнего угла экрана. Откладываются отрезки в 10 пикселей по оси X и в 10 пикселей по оси Y. Начальная точка прорисовки прямоугольника находится в верхнем левом углу. Остальные линии
 
 дорисовываются автоматически относительно левого верхнего угла, создавая тем самым четыре точки с координатами 10 пикселей по каждой оси, равномерно отложенные от каждого угла клиентской области экрана телефона. Чтобы нарисовать заданный прямоугольник вызывается функция DrawRect (). gc.DrawRect(drawRect);
  Построение и прорисовка второго прямоугольника происходит по той же схеме, но в качестве координаты верхнего левого угла применяется значение в 15 пикселей по оси X и 30 пикселей по оси Y. На экране рисуются два прямоугольника, причем второй прямоугольник рисуется внутри первого.
 7.3.6. Файл Test_Main.cpp
  В файле TestMain.cpp происходит создание и запуск приложения, которое мы описали в предыдущих разделах. Для конкретно запущенной программы создается свой новый поток, запускается механизм apprun.exe на системном уровне Eikon и начинается работа всей программы. Исходный код в Test_Main.cpp находится на компакт-диске в папке \Code\Test\src\Test_Main.cpp.
 // файл Test_Main.срр
 // создание и запуск приложения
 // подключаем заголовочный файл #include "Test_Application.h"
 // загружаем DLL системы
 GLDEF_C Tint E32Dll(TDllReason /*aReason*/)
 {
  return KErrNone; }
 // создаем приложение
 EXPORT_C CApaApplication* NewApplication() {
 return (new CTestApplication);
 } у/*******************************************************
  В исходном коде имеются две функции. При помощи функции E32D11 () производится загрузка системных динамических библиотек DLL. Если загрузка прошла успешно, возвращается значение KErrNone, обозначающее отсутствие ошибок в системе. И в конце в функции NewApplication () создается и запускается приложение, выполняя тем самым полный цикл системных вызовов, необходимых для работы программы с момента ее запуска и до выполнения команды Exit (выход из приложения).
 
 7.3.7. Файл Testpan
  Программа Test содержит еще несколько важных файлов, один из них - Test.pan. На компакт-диске он находится в папке \Code\Test\inc\Test.pan.
 у/******************************************************* // файл Test.pan
 // паника
 //***** **************************************************
 // проверяем лексему
 #ifndef Test_PAN_
 ¦define Test_PAN
 // перечисляемый тип enum TTestPanics {
 ETestBasicUi = 1
 
 #endif
  TestPAN
 /у*****************
 
 ***************************
 
  В исходном коде файла Test_AppUi.cpp в функции HandleCommandL () была задействована конструкция кода для обработки паники, возникающей во время внештатных ситуаций. В частности, использовалась функция Panic () с двумя параметрами. Первый - это строка текста, которая не должна превышать шестнадцати символов. Второй параметр - это 32-битное целое число. Комбинация обоих параметров составляет идентификатор программной ошибки. Во втором параметре использовалась константа ETestBasicUi со значением 1, созданная в перечисляемом типе TTestPanics файла Test.pan. Значение создаваемой константы не должно равняться 0, в данном случае число 1 является неким кодом, идентифицирующим ошибку приложения. В справочной системе Symbian OS в разделе System panic reference можно найти полный перечень кодов для работы с внештатными ситуациями. В перечисляемый тип TTestPanics файла Test.pan можно добавлять константы, присваивая им коды (числа от 1 и выше), определенные в категории System panic справочной системы Symbian OS для работы с внештатными ситуациями, возникающими в программе.
 7.3.8. Файл Test.hrh
  Файл Test.hrh - это специализированный заголовочный файл, содержащий объявления констант для использования в файлах *.срр и файлах ресурсов *.rss. Это специальные константы, необходимые для работы с меню, диалогами и командами. Файл Test.hrh находится на компакт-диске в папке \Code\Test\inc\Test.hrh, рассмотрим исходный код файла.
 
 // заголовочный файл Test.hrh
 // содержит спецификацию ресурсов /у*******************************************************
 // проверяем лексему
 #ifndef Test_HRH_
 #define Test_HRH
 // перечисляемый тип
 enum TTestlds
 {
 ETestCommandl = 1
 #endif // _Test_HRH_ /у*******************************************************
  В исходном коде объявляется перечисляемый тип TTestlds с одной константой, которую мы пока в программе не используем, но в дальнейшем при модернизации программы обязательно задействуем.
  Что касается исходного кода в файлах *.рап и *.hrh, то здесь можно использовать только объявления перечисляемых типов (enum) для определения перечислений, любая другая конструкция исходного кода вызовет ошибку при компиляции.
 7.3.9. Файл Test_Caption.rss
  Файлы ресурсов - это одна из важнейших составляющих в программировании приложений под Symbian OS. С помощью файлов ресурсов осуществляется создание и работа с меню, диалогами, списками и редакторами. Все файлы с расширением *.rss (Resource Source Script) в программе относятся к файлам ресурсов. Файл Test_Caption.rss определяет в приложении название программы, написанное под иконкой приложения на рабочем столе телефона и в самой программе на панели Status Pan.
  Файл Test_Caption.rss находится на компакт-диске в папке \Code\Test\group \Test_Caption.rss и содержит следующий программный код:
 // файл Test_caption.rss
 // заголовки программы
 у/*******************************************************
 finclude RESOURCE CAPTIONDATA
 
 caption = "Test"; shortcaption = "Test";
  В начале исходного кода происходит подключение системной библиотеки apcaptionfile.rh, содержащей большое количество перечисляемых констант. Две из них и были задействованы в файле Test_Caption.rss.
  Константа caption содержит название программы, которое отображается на экране телефона под иконкой. Вторая константа shortcaption использует меньший текст для удобного использования названия программы, например, в списке. Структура RESOURCE CAPTION_DATA, где определены константы, является стандартной структурой, создающей заголовок приложения. Файл ресурсов CAPTION (в нашей программе это файл Test_Caption.rss) используется опционально, по желанию программиста, и аналогичные функции можно возложить на информационные файлы ресурсов программы AIE
 7.3.10. Файл Testrss
  Это, пожалуй, самый главный файл ресурса, необходимый для создания меню, диалогов и списков. В программе Test мы используем этот вид ресурсов не на полную мощность, но уже в следующей главе усложним программный код. Файл Test.rss можно найти на компакт-диске в папке \Code\Test\group\Test.rss, рассмотрим исходный код файла ресурсов программы Test.
 //******************************************************* // файл Test.rss
 // ресурсы программы
 //**** ***************************************************
 // имя ресурса (ID) NAME SETS
 // подключаем системные библиотеки
 #include
 ¦include
 ¦include
 // подключаем заголовочный файл
 ¦include "Test.hrh"
 //*******************************************************
 // сигнатура //*******************************************************
 RESOURCE RSS SIGNATURE
 
 /у******************************************************* // имя документа
 RESOURCE TBUF r_default_document_name { buf="";
  } у/*******************************************************
 // команды
 RESOURCE EIK_APP_INFO { cba = R_AVKON_SOFTKEYS_OPTIONS_EXIT;
  } у/*******************************************************
  В первой строке исходного кода файла Test.rss определяется имя ресурса: NAME SETS
  Ключевое слово NAME определяет имя для ресурса из четырех заглавных букв в файле ресурса. Имя ресурса - это идентификатор, определяющий принадлежность файла ресурса к этой программе. Имя состоит из четырех произвольно заданных букв и для каждого приложения лучше использовать новое имя.
  Затем происходит подключение системных библиотек и файла Test.hrh для работы с ресурсами. Все дальнейшие объявления ресурсов применяют следующий синтаксис: RESOURCE ИМЯ_СТРУКТУРЫ
  Ключевое слово RESOURCE объявляет тип структуры и дальше следует название создаваемой структуры. В названиях структур ресурсов применяется множество ключевых слов для стандартных различных определений и дополнительно можно создавать свои структуры ресурсов. В системной библиотеке в файле avkon.rh объявлены все структуры и ключевые слова для работы с ресурсами в серии 60. В файле Test.rss задействованы пока три названия:
 ? RSS_SIGNATURE - это сигнатура, регулирующая в приложении непра
 вильные подключения файлов ресурсов, панику, загрузку других бинар
 ных ресурсов. Но эта структура игнорируется, просто определите ее и ос
 тавьте пустой;
 ? TBUF - этот вид ресурса задает имя для документа приложения. Исполь
 зуется по усмотрению, но он обязательно должен быть объявлен;
 ?
 ? EIK_APP_INFO - информационный ресурс приложения (Application information resource).
  Все три объявленные ресурса в исходном коде программы должны присутствовать обязательно, вне зависимости от того используются они или нет. Подробнее с файлами ресурсов вы познакомитесь в главе 8.
 7.3.11. Файл bid. in f
  Файл bld.inf создается автоматически при формировании проекта и включает в себя всего две строки кода: PRJ_MMPFILES Test.mmp
  Ключевое слово PRJ_MMPFILES типичное для всех проектов - это ссылка на проектный файл *.mmp, название которого прописывается во второй строке кода.
  Файл bld.inf необходим для процесса сборки и компоновки приложения, как указатель на соответствующие проектные данные. Импорт проекта в среду C++ BuilderX происходит через файл bld.inf. В среде программирования Metrowerks CodeWarrior импорт проекта осуществляется через *.mmp файл, но наличие файла bld.inf обязательно.
 7.3.12. Файл Test.mmp
  Проектный файл с расширением *.mmp содержит полное описание свойств проекта и является одним из ключевых файлов программы. Поговорка "Что объявишь, то и будешь иметь" как нельзя лучше подходит к файлам ММР. В демонстрационном примере Test файл Test.mmp находится на компакт-диске в папке \Code\Test\group\Test.mmp, рассмотрим структуру файла.
 //***•***************************************************
 // файл Test.mmp у/*******************************************************
 TARGET Test.app
 TARGETTYPE app
 UID ОхЮООЗЭСЕ 0x10000000
 TARGETPATH \system\apps\test
 LANG 01
 SOURCEPATH ..\src
 SOURCE Test_Main.cpp
 SOURCE Test_Application.cpp
 SOURCE Test_AppView.cpp
 
 SOURCE Test AppUi.cpp SOURCE Test Document.cpp SOURCEPATH ..\group RESOURCE Test.rss RESOURCE Test caption.rss USERINCLUDE ..\inc SYSTEMINCLUDE \epoc32\include
 LIBRARY euser.lib
 LIBRARY apparc.lib
 LIBRARY cone.lib
 LIBRARY eikcore.lib
 LIBRARY avkon.lib
 LIBRARY eikcoctl.lib
 /у*******************************************************
  Синтаксис и семантика описания проекта в файле *.mmp строго предопределена и обычно написание осуществляется строго по ранжиру. В программе Test задействованы не все возможные атрибуты. Поэтому предлагаю рассмотреть все существующие атрибуты, попутно разбирая присутствующие в файле Test.mmp.
  Проектный файл *.mmp состоит из двух столбцов. С левой стороны располагаются ключевые слова, обозначающие определенный атрибут, а с права заданы значения для атрибутов проекта.
 ? TARGET - это имя программы, устанавливающее вид создаваемой програм
 мы: *.арр, *.dll или *.ехе. В файле Test.mmp назначено имя Test. арр - это
 стандартная программа для Symbian OS.
 ? TARGETTYPE - тип создаваемой программы: *.арр, *.dll, *.exe (должен со
 впадать со значением в TARGET). Опционально может использоваться
 уникальный идентификатор (UID1).
 ? UID - уникальный идентификатор GUI Symbian OS (UID2) и уникальный
 идентификатор приложения (UID3). Подробно об уникальных идентифи

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

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