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

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

 MENUITEM
 command = EAknExSettingListCmdOutlineO!?; txt = qtn aknexsettinglist outline09;
 
 MENUITEM
 command = EAknExSettingListCmdOutlinelO; txt ¦ qtn_aknexsettinglist_outlinelO;
  В ресурсе MENU_BAR создается меню r_aknexsettinglist_menu, расшифровка которого находится в ресурсе MENU_PANE. Меню r_aknexsetting-list_menu в качестве команды (command) использует перечисление EAknEx-SettingListCmdSettingList, объявленное в файле AknSettingList.hrh. Затем идет спецификатор cascade, который указывает на создание вторичного меню r_aknexsettinglist_settinglist_cascade. Обратите внимание на флаг (flags), используемый при создании меню. С помощью флажка EEikMenu-ItemSeparatorAfter происходит отключение активного в текущий момент пункта меню. Если пользователь выбрал один из пунктов меню, то он находится на экране, представляющем данную команду, и поэтому эта команда дезактивируется и становится недоступной пользователю.
  В спецификаторе txt должна находиться строка текста для этого меню. Для удобства локализации программы используется макрос, расшифровка которого находится в файле AknExSettingList.loc. Всем командам, используемым в программе Setting List, назначаются макросы для удобства локализации приложения. В меню программы также предусмотрена команда выхода Exit. Вторичное MeHior_aknexsettinglist_settinglist_cascade содержит десять команд для каждого из типов списка Setting. Команды объявляются с помощью спецификатора MENU_ITEM и содержат идентификатор команды (command) и строку текста (txt), которая будет показана во вторичном меню.
  Далее в файле AknExSettingList.rss идут множественные объявления текстовых строк для использования в различных местах программы. Текстовым строкам задаются макросы, расшифровки которых находятся в файле локализации программы Setting List. По окончанию работы с текстом происходит создание типов списка Setting, первый - Text editor.
 , I
 // r_aknexsettinglist_text_setting_page
 // для Outline04
 / /
 RESOURCE AVKON_SETTING_PAGE
 r_aknexsettinglist_text_setting_page { -
 number = TEXT_SETTING_PAGE_NUMBER; label = qtn_aknexsettinglist_text_title;
 
 type = EEikCtEdwin;
 editor_resource_id = r_aknexsettinglist_edwin;
 RESOURCE EDWIN r_aknexsettinglist_edwin
 {
 width = TEXT_SETTING_PAGE_WIDTH; lines = TEXT_SETTING_PAGE_LINES; maxlength = TEXT_SETTING_PAGE_MAXLENGTH20;
  Список Text editor предназначен для команды меню Outline04, выполнив которую пользователь откроет этот тип списка. Объявление RESOURCE AVKON_SETTING_PAGE декларирует создание списка типа Setting, а от количества и значений задействованных параметров уже будет зависеть, какой из типов списка создается.
 ? number - это порядковое число будет отображаться для данного элемента
 списка в верхнем левом углу его титульной панели. Константе
 TEXT_SETTING_PAGE_NUMBER в начале исходного кода было присвоено
 значение равное единице.
 ? label - строка текста для названия этого элемента списка. Используется
 ресурс типа RESOURCE TBuf256 для удобства локализации программы.
 ? type - это тип создаваемого списка Setting. С помощью типа
 EEikCtEdwin формируется тип Text editor списка Setting.
 ? editor_resource_id - идентификатор создаваемого ресурса. В Text
 editor задан r_aknexsettinglist_edwin, описав который, вы создади
 те список Text editor с необходимыми свойствами.
  В ресурсе RESOURCE EDWIN r_aknexsettinglist_edwin указывается ширина текстового поля (width), равная девяти символам. Количество строк (lines) равно пяти строкам, максимальное количество введенных символов (maxlength) равно двадцати.
 Дальше происходит создание типа Slider control списка Setting.
 / /
 // r_aknexsettinglist_slider_setting_page // для outline05
 RESOURCE AVKON_SETTING_PAGE r_aknexsettinglist_slider_setting_page
 {
 number = SLIDER_SETTING_PAGE_NUMBER; label = qtn_aknexsettinglist_slider_title; type = EAknCtSlider;
 
 editor_resource_id = r_aknexsettinglist_slider;
 RESOURCE SLIDER r_aknexsettinglist_slider {
 layout = EAknSettingsItemSliderLayout;
 minvalue = SLIDER_SETTING_PAGE_MINVALUE;
 maxvalue = SLIDER_SETTING_PAGE_MAXVALUE;
 Step = SLIDER_SETTING_PAGE_STEP;
 valuetype = EAknSliderValuePercentage;
 minlabel = qtn_slider_minlabel;
 maxlabel = qtn_slider_maxlabel;
  Объявление ресурса для типа Slider control идентично объявлению Text editor, но в параметре type содержится значение EAknCtSlider, определяющее создание списка Slider control. Такой вид исходного кода закономерен для создания всех типов списка Setting. Идентификатор ресурса r_aknexsettinglist_slider описывает свойства создаваемого типа списка Slider control.
 ? layout - отображение заголовка в списке Slider control.
 Q minvalue - минимальное значение, от которого происходит отчет в программе. Это значение равно 0.
 ? maxvalue - максимальное значение, до которого можно передвинуть бе
 гунок Slider. В программе оно равно 100.
 ? step - это шаг, то есть минимальное значение, на которое можно за один
 раз передвинуть бегунок. Равно единице.
 ? valuetype - задает, как именно установленное значение будет пред
 ставлено на экране - в виде чисел, процентного соотношения, фракций
 или геометрической фигуры.
 ? minlabel, maxlabel - макрос локализации, определяющий минималь
 ное и максимальное значения для устанавливаемых свойств.
 Затем в файле AknExSettingList.rss создается тип списка Volume control.
 // r_aknexsettinglist_volume_setting_page
 // For outline06
 / /
 RESOURCE AVKON_SETTING_PAGE r_aknexsettinglist_volume_setting_page
 Г
 number = VOLUME_SETTING_PAGE_NUMBER; label = qtn_aknexsettinglist_volume_title; type = EAknCtVolumeControl;
 
 editor_resource_id = r_aknexsettinglist_volume;
 RESOURCE VOLUME r_aknexsettinglist_volume {
 flags ¦ ESettingsVolumeControl;
 value = VOLUME_SETTING_PAGE_VALUE;
  Тип создаваемого списка Volume control задается перечислением EAknCt-VolumeControl. В ресурсе RESOURCE VOLUME r_aknexsettinglist_volume описываются свойства создаваемого типа списка:
 ? flags - это флаг, указывающий на стиль создаваемого типа списка.
 В программе используется ESettingsVolumeControl, формирующий
 стиль контроля в виде прямоугольников, как показано на рис. 8.11.
 ? value - максимальное значение для Volume control, в программе равное
 целому значению 8.
  Тип списка Time editor создается на основании EEikCtTimeEditor в ресурсе r_aknexsettinglist_time_setting_page.
 // r_aknexsettinglist_time_setting_page
 // для outline07.
 //
 RESOURCE AVKON_SETTING_PAGE
 r_aknexsettinglist_time_setting_page
 {
 number = TIME_SETTING_PAGE_NUMBER;
 label = qtn_aknexsettinglist_time_title;
 type = EEikCtTimeEditor;
 editor_resource_id = r_aknexsettinglist_time_editor;
 RESOURCE TIME_EDITOR r_aknexsettinglist time editor {
 minTime = TIME
 {
 second = TIME_EDITOR_MIN_SECOND;
 minute = TIME_EDITOR_MIN_MINUTE;
 hour = TIME_EDITOR_MIN_HOUR; };
 maxTime = TIME
 
 second = TIME_EDITOR_MAX_SECOND; minute = TIME_EDITOR_MAX_MINUTE; hour = TIME_EDITOR_MAX_HOUR;
  В ресурсе TIME_EDITOR r_aknexsettinglist_time_editor содержатся описания минимального и максимального допустимого значения времени. В minTime значится second, minute и hour и они равны 0, а в maxTime, second и minute равны 59, a hour равензначению 23. Все эти значения заданы с помощью констант в начале исходного кола файла AknExSettingList.rss.
  Дальше в исходном коде происходит создание списков типа Alphabetic Password editor и Numeric Password editor.
 / /
 // r_aknexsettinglist_alpha_password_setting_page
 // для outline08.
 / /
 //
 RESOURCE AVKON_SETTING_PAGE
 r_aknexsettinglist_alpha_password_setting_page
 {
 number = ALPHA_PASSWORD_SETTING_PAGE_NUMBER;
 label = qtn_aknexsettinglist_alpha_title;
 type = EEikCtSecretEd;
 editor_resource_id = r_aknexsettinglist_alpha_password;
 RESOURCE SECRETED r_aknexsettinglist_alpha_password {
 num_letters = ALPHA_PASSWORD_LENGTH_OF_STRING;
 // r_aknexsettinglist_ol09_numeric_password_setting_page
 // для outline09.
 / /
 //
 RESOURC AVKON_SETTING_PAGE
 r_aknexsettinglist_ol09_numeric_password_setting_page
 {
 number ¦ NUMERIC_PASSWQRD_QLQ2_SETTING_PAGE_NUMBER;
 label = qtn_aknexsettinglist_numeric_title; type = EAknCtNumericSecretEditor;
 
  editor_resource_id = r_aknexsettinglist_numeric_password,• Г
 RESOURCE NUMSECRETED r_aknexsettinglist_numeric_password
 {
 num_code_chars = NUMERIC_PASSWORD_LENGTH_OF_STRING;
  Конструкция кода, создающая эти два списка практически одинакова. Для Alphabetic Password editor используется тип EEikCtSecretEd, тогда как для Numeric Password editor- тип EAknCtNumericSecretEditor. В списке типа Alphabetic при вводе символов на несколько секунд видны набираемые цифры или буквы. Длина вводимых символов ограничена значением 8 в типе num_letters. В типе Numeric изначально все вводимые символы засекречены и камуфлируются звездочками. Количество символов в программе Setting List для списка типа Numeric Password editor задано так же значением 8 в num_code_char s.
  Тип IP editor предназначен для ввода и редакции IP-адреса. В создании этого типа списка используется EAknCtlpEditor. Описание свойств создаваемого списка находится в ресурсе RESOURCE IP_FIELD_EDITOR r_aknexsetting-list_ip_editor.
 / / .
 // r_aknexsettinglist_ip_editor // For outlinelO.
 RESOURCE IP_FIELD_EDITOR
 r_aknexsettinglist_ip_editor
 {
 min_field_values = IP_FIELD
 {
 first_field = IP_EDITOR_MIN_FIELD_VALUE;
 second_field = IP_EDITOR_MIN_FIELD_VALUE;
 third_field = IP_EDITOR_MIN_FIELD_VALUE;
 fourth_field = IP_EDITOR_MIN_FIELD_VALUE;
 };
 max_field_values = IP_FIELD {
 first_field = IP_EDITOR_MAX_FIELD_VALUE; second_field = IP_EDITOR1MAXJIELD_VALU"E; third_field = IP_EDITOR_MAX_FIELD_VALUE; fourth_field = IP_EDITOR_MAX_FIELD_VALUE;
 
 flags = 0;
 RESOURCE AVKON_SETTING_PAGE
 r_aknexsettinglist_ip_address_setting_page
 {
 label= qtn_aknexsettinglist_ip_editor_title;
 type = EAknCtlpFieldEditor;
 editor_resource_id = r_aknexsettinglist_ip_editor;
  Для всех значений min_f ield_values задается целочисленное значение 20 в виде константы IP_EDITOR_MIN_FIELD_VALUE. Максимальное значение установлено константой IP_EDITOR_MAX_FIELD_VALUE и равно 200.
  Затем в файле ресурса программы Setting List происходит создание массива строк текста для типа Enumerated text. В качестве строк текста используются константы и в файле локализации они расшифровываются некоторыми условными названиями.
  На этот момент были созданы почти все вложенные страницы для каждого типа списка, в которые пользователь попадает после выбора элемента списка на титульной панели. Теперь надо создать все типы списков с титульными панелями и привязать уже созданные вложенные страницы к соответствующим типам списков. Схема создания титульной панели списка Setting строится по следующему принципу. Формируется ресурс RESOURCE AVKON_SETTING_ITEM_LIST, где описываются свойства создаваемого списка и в параметре item объявляется ссылка для связывания ранее созданных вторичных страниц с титульными панелями списка. Посмотрите, как это делается на примере списков типа Text editor, Volume control и Slider control.
 //
 // r_aknexsettinglist_setting_list_setting_text
 // ListBox( Setting style )
 // для Outlined.
 / /
 RESOURCE AVKON_SETTING_ITEM_LIST
 r_aknexsettinglist_setting_list_setting_text
 {
 flags= EAknSettingltemNumberedStyle;
 title = qtn_aknexsettinglist_outline01;
 initial_number = 1;
 items =
 {
 AVKONSETTINGITEM
 
 identifier = EAknExSettingText; setting_page_resource =
  r_aknexsettinglist_text_setting_page; name = qtn_aknexsettinglist_text_title;
 // r_aknexsettinglist_setting_list_setting_slider // ListBox( Setting style ) // для Outline02.
 RESOURCE AVKON_SETTING_ITEM_LIST r_aknexsettinglist_setting_list_setting_slider {
 flags= EAknSettingltemNumberedStyle; title = qtn_aknexsettinglist_outline02; initial_number = 1; items = {
 AVKON_SETTING_ITEM {
 identifier = EAknExSettingSlider; setting_page_resource =
  r_aknexsettinglist_slider_setting_page; name = qtn_aknexsettinglist_slider_title;
 // r_aknexsettinglist_setting_list_setting_volume // ListBox( Setting style ) // для Outline03
 RESOURCE AVKON_SETTING_ITEM_LIST r_aknexsettinglist_setting_list_setting_volume {
 flags= EAknSettingltemNumberedStyle; title = qtn_aknexsettinglist_outline03; initial_number ¦ 1; items = {
 AVKON SETTING ITEM
 
 {
 identifier = EAknExSettingVolume; setting_page_resource =
  r_aknexsettinglist_volume_setting_page; name = qtn_aknexsettinglist_volume_title;
  Как видите, ничего сложного нет, и весь исходный код хорошо читается, рассмотрим эти ресурсы:
 ? flags - флаг, определяющий стиль создаваемого списка;
 ? title - строка текста (в файле локализации находится ее расшифровка);
 ? initial_number - число и порядковый номер списка будут отображать
 ся на титульной панели в левом верхнем углу.
  Затем происходит привязка ранее созданных страниц к титульной панели списков в ресурсе AVKON_SETTING__ITEM с тремя следующими параметрами:
 ? identifier- идентификатор типа списка находится в файле с расшире
 нием *.hrh;
 ? setting_page_resource - здесь указывается созданный ранее ресурс,
 например, для списка типа Volume control это ресурс r_aknexsetting-
 list_setting_list_setting_volume. (Все же лучше избегать длин
 ных названий. Я понимаю, что этот код написан программистами Nokia, но
 согласитесь, ни читать, ни писать подобные названия неудобно, можно
 было придумать и попроще).
  Вот таким образом происходит создание титульного листа и вложенной страницы для редакции или указания каких-то опций в программе. Аналогичный исходный код используется и для других типов списка Setting, он легко читается и, думается, что вы разберетесь с ним самостоятельно. Файл локализации содержит расшифровку для каждой команды и строки текста в программе Setting List. Приложение создавалось только для английского языка. Поэтому в программе файл с расширением *.1ос всего один, и внутри него содержится описание текстовых констант. Это еще один способ локализации программы. На данный момент мы рассмотрели все файлы ресурсов и теперь можно переходить непосредственно к исходному коду программы.
  Классы Application, Document и AppUi вполне узнаваемы и содержат программный код, изученный нами в главе 7. Рассмотрение этих классов мы пропустим и перейдем к оставшимся классам программы Setting List.
 Класс CAknExSettingListView
  Класс CAknExSettingListView наследует возможности системного класса CAknView. В примерах с классами программы Test механизм был несколько иной, и мы использовали для этих целей класс CCoeControl. В Symbian OS
 
 можно использовать множество вариантов по созданию программ, один из них реализован в приложении Setting List, а возможности класса CCoeControl реализует в данном случае класс CAknExSettingListContainer. Заголовочный файл класса CAknExSettingListView.h выглядит следующим образом:
 /*
 * CAknExSettingListView
 * Copyright (с) 2003 Nokia. All rights reserved.
 */
 #ifndef AKNEXSETTINGLISTVIEW_H
 #define AKNEXSETTINGLISTVIEW_H
 ¦include
 class CAknExSettingListContainer; class CAknExSettingListListbox; class CAknExSettingListltemData;
 class CAknExSettingListView : public CAknView {
 public:
 CAknExSettingListView();
 virtual --CAknExSettingListView () ;
 public:
 void DisplayNextOutlineL();
 void DisplayPreviousOutlineL();
 void SetCurrentOutlineld(const Tint aOutlineld);
 public:
 TUid Id() const;
 void HandleCommandL(Tint aCommand);
 Tint CurrentOutlineldO ;
 private:
 void IndicateTitlePaneTextL(const Tint aCommand); void SwapContainerL(TBool aActiveContainer); void CreateListBoxL(Tint aResourceld);
 private:
 
 void DoActivateL(const TVwsViewIdS aPrevViewId, TUid aCustomMessageld, const TDesC8& aCustomMessage);
 void DoDeactivate();
 private:
 CAknExSettingListContainer* iContainer; CAknExSettingListListbox* iListBox; TBool iActiveContainer; CAknExSettingListltemData* iData; Tint iCurrentOutlineld;
 #endif
  Две функции, DisplayNextOutlineL() и DisplayPreviousOut-lineL(), регулируют в приложении переход между экранами на основании идентификатора Tint iCurrentOutlineld для текущей позиции выбранной команды меню. Реализация двух этих функций в файле CAknExSettingListView.cpp выполнена на основании оператора switch. В тот момент, когда выбрана одна из команд меню в программе Setting List, открывающая один из типов списка, можно с помощью подэкранной клавиши Next или джойстика для команд Left, Right перейти в программе на следующий экран, отображающий уже другой тип списка Setting. При выборе команд Next и Right для клавиш телефона в работу включается функция DisplayNextOutlineL (), производя переход по командам меню на один шаг и открывая новый экран со следующим списком. С помощью функции DisplayPreviousOutlineL () и клавиши телефона Left пользователь возвращается на шаг назад.
  Функция TUid Id () const возвращает текущий идентификатор для View, а функция SetCurrentOutlineld (const Tint aOutlineld) устанавливает идентификатор, на основе которого функции DisplayNextOutlineL () и DisplayPreviousOutlineL () регулируют переход с экрана на экран.
  Функция HandleCommandL ( Tint aCommand) обрабатывает команды в меню программы Setting List. В этом случае задействуются две функции Swap-ContainerLO и CEikChoiceList: :CreateListBoxL (). Функция Swap-ContainerL () устанавливает логическое значение для текущего экрана, то есть если выбран этот экран с типом списка Setting, то TRUE, а если нет - FALSE. Системная функция CEikChoiceList: :CreateListBoxL () создает непосредственно список для экрана на основании данных ресурса приложений, находящихся в файле AknExSettingList.hrh.
  Функция IndicateTitlePaneTextL (const Tint aCommand) по идентификатору ресурсов формирует новую надпись на титульной панели для каждого из типов списка Setting.
 
  Функции DoActivateL () и DoDeactivate () соответственно создают и уничтожают объект класса контейнер. В программе это класс CAknExSet-tingListContainer, который играет управляющую роль в приложении, регулируя какой из экранов и типов списка будет отображен на экране телефона. В программе может существовать несколько классов типа View, но в один отдельно взятый момент времени, возможно представление только одного из классов типа View и, как правило, класс типа Container регулирует это положение. Зачем нужно несколько классов типа View? Это значительно упрощает программу, например, когда вы создадите игру, у вас будут классы для представления (тип View) экрана с красочным интерактивным меню, экраном опций, отдельным экраном для заставки игры, основным циклом игры. Все это можно определить в одном классе, но гораздо проще создать несколько классов, распределив между ними рабочие функции. Для того чтобы активизировать одно из представлений вида вызывается функция DoActivateL (), а на экране может быть представлен только один класс тип View, поэтому для представления другого класса типа View одной программы, необходимо дезактивировать текущий класс функцией DoDeactivate () и так далее для всех компонентов программы.
  Класс CAknExSettingListContainer, исходный код которого находится в файлах CAknExSettingListContainer.h и CAknExSettingListContainer.cpp программы Setting List, производный от системного класса CCoeControl осуществляет контроль за представлением вида и событиями, полученными с клавиш телефона. В функции CAknExSettingListContainer::OfferKeyEventL() с помощью ключевых кодов для клавиш Left (EKeyLeftArrow) и Right (EKeyRightArrow) обрабатывается ввод данных, полученных от пользователя.
 Класс CAknExSettingListListBox
  Класс CAknExSettingListListBox создает список вида Setting, посмотрим на спецификацию этого класса, находящуюся в файле AknExSettingList-Listbox.h.
 /*
 ^ ^____
 * AknExSettingListListBox.h
 * AknExSettingList
 * Copyright (с) 2003 Nokia. All rights reserved.
 */
 #ifndef AKNEXSETTINGLISTLISTBOX_H #define AKNEXSETTINGLISTLISTBOX_H
 finclude
 class CAknExSettingListltemData;
 
 class CAknExSettingListView;
 class CAknExSettingListListbox : public CAknSettingltemList
 {
 public:
 CAknSettingltem* CreateSettingltemL(Tint
 identifier);
 void SetData(CAknExSettingListltemData* aData); void SetView(CAknExSettingListView* aView);
 private:
 TKeyResponse OfferKeyEventL(const TKeyEvent& aKeyEvent,
  TEventCode aType); void SizeChangedO ;
 private:
 CAknExSettingListltemData* iData;
  CAknExSettingListView* iView; }; #endif
  Самая главная функция класса - это CreateSettingltemL (), создающая типы списков Setting. В функции используется управляющий оператор switch, где на основании полученного идентификатора создается тот или иной вид списка, как показано в листинге функции CreateSettingltemL ().
 //
 // CAknExSettingListListbox;;CreatsSsttingItemL
 //
 CAknSettingltem*
 CAknExSettingListListbox::CreateSettingltemL(Tint
 aldentifier)
 {
 CAknSQttingltQm* SQttingltQm = NULL;
 switch (aldentifier)
 {
 case EAknExSettingText:
 settingltem = new (ELeave) CAknTextSettingltem(aldentifier, iData->iTextBuf);
 break;
 case EAknExSettingVolume:
 
 settingltem = new (ELeave)CAknVolumeSettingItem(
  aldentifier, iData->iVolume ); break; case EAknExSettingEnumText:
  settingltem = new (ELeave) CAknEnumeratedTextPopupSettingItem(
  aldentifier, iData->iLanguageCode); break; case EAknExSettingSlider:
 settingltem = new (ELeave)CAknSliderSettingItem(
  aldentifier, iData->iSliderValue); break; case EAknExSettingDate:
  settingltem = new (ELeave) CAknTimeOrDateSettingItern(aldentifier,
 CAknTimeOrDateSettingltem::EDate,
  iData->iDate ); break; case EAknExSettingTime:
  settingltem = new (ELeave) CAknTimeOrDateSettingltem(aldentifier,
 CAknTimeOrDateSettingltem::ETime,
  iData->iTime); break; case EAknExSettingBinary:
 settingltem = new (ELeave) CAknBinaryPopupSettingltem(aldentifier, iData-
  >iBinary); break; case EAknExSettingPassAlph:
 settingltem ¦ new (ELeave)

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

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