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

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

 ? TEXT - строка текста;
 О LTEXT - строка текста с уникодом (Unicode);
 ? BUF - строка текста с уникодом (Unicode);
 ? BUF8 - 8-битная символьная строка текста;
 ? BUF <п> - строка текста с использованием уникода, длина которой зада
 ется в параметре <п>;
 Q LINK - 16-битный идентификатор (ID) для специальных ресурсов;
 ? LLINK - 32-битный идентификатор (ID) для специальных ресурсов;
 ? SRLINK - ссылка на идентификатор (ID) специализированного ресурса;
 ? SRUCT - определяет имя структуры;
 ? ENUM - перечисляемый тип;
 ? RESOURCE - определяет ресурсы приложения;
 ? NAME - 20-битный идентификатор (ID) ресурсов приложения.
 ?
  Как видите, типы данных, применяемых в Symbian OS, используют вполне стандартные определения, встречающиеся и в программировании для других систем.
  Для того чтобы создать свою структуру, строится обыкновенная конструкция исходного кода:
 STRUCT MYNAME
 
 BYTE bvalue = 0; LONG lvalue = 0; BUF buf; Точно такая же ситуация обстоит и с перечисляемыми типами. Объявляется перечисляемый тип с помощью ключевого слова ENUM и далее следует название самого типа. При определении ресурсов приложения задействуется другая система. RESOURCE <определение_ресурса> <ваше_имя>
 Посмотрите, как может выглядеть, например, определение ресурса для меню:
 RESOURCE MENU_BAR r_mymenu_bar
 {
 // реализация ресурса
  Ключевое слово MENU_BAR объявляет меню для программы, а в качестве названия данного ресурса служит определение r_mymenu_bar. В названиях ресурсов обычно используются знаки подчеркивания, и начальной буквой является прописная буква г английского алфавита.
  Системная библиотека Symbian OS содержит заголовочные файлы с определением ресурсов, перечисляемых типов, структур и констант. При работе с ресурсами надо помнить о подключении системных файлов ресурсов Symbian OS (Uikon). #include tinclude
  Системные файлы ресурсов Symbian OS подключаются независимо от использования UIQ_ или серии 60. При создании приложения под конкретную платформу, нужно подключить дополнительные файлы ресурсов, например, для серии 60 это: #include ¦include
 8.4. Меню
  Во всех программах (вне зависимости от операционной системы) используется механизм меню. Как правило, это список команд, при выборе которых пользователь может совершать определенные действия. В Symbian OS почти все
 
 программы имеют систему меню. В серии 60 меню назначается для подэкранных клавиш, обычно это левая клавиша Options, но при желании меню можно назначить меню и на правую клавишу. Давайте на примере рассмотрим систему меню серии 60, но сначала установим требования к будущей программе и предложим алгоритм ее решения. В качестве каркаса послужит приложение AifTest, созданное в главе 7.
  При запуске программы AifTest, подэкранным клавишам назначаются команды Options и Exit. Команду Exit вы уже умеете реализовывать, а для команды Options мы назначим меню в виде списка из трех командам. Одна из команд будет иметь вложенное или вторичное меню со списком еще из двух команд. При выборе пользователем одной из команд должны происходить назначенные действия. В качестве подобного действия была задействована работа с одним из видов диалогов под названием Note (заметка, примечание). В каждом таком информационном примечании будет содержаться текстовое сообщение с названием выбранной команды. Для решения этой задачи нам потребуется создать дополнительные команды в файле Test.hrh, а в файле ресурса Test.rss сформировать меню с помощью заданных команд и уже в файле Test_AppUi.cpp в функции HandleCommandL () непосредственно описать действия для каждой команды.
  Демонстрационный пример MenuTest находится на компакт-диске в папке \Code\MenuTest. Перейдем к реализации поставленной задачи. Первым делом надо создать команды. Для этого в файле Test.hrh в перечисляемом типе TTestCommands произведем необходимые объявления. Файл Test.hrh вы найдете на компакт-диске в папке \Code\MemuTest\inc\Test.hrh, рассмотрим исходный код.
 //. заголовочный файл Test.hrh
 // содержит спецификацию ресурсов у/*******************************************************
 // проверяем лексему
 #ifndef Test_HRH_
 #define Test_HRH_
 // определяем команды для меню
 enum TTestCommands
 {
 ETestCommand = 1,
 ETestConfirmation,
 ETestInformation,
 ETestNotes,
 ETestError,
 ETestWarning
 
 #endif // Test_HRH_
 /у*******************************************************
  Команда ETestCommand не используется в программе, она оставлена с прошлого приложения, но любая первая команда, идущая в перечислении, обязана объявляться со значением равным 1 или 0x600. Это связано с работой системы. В названиях созданных команд используются виды диалоговых информационных уведомлений:
 ? Configuration Note сообщает о завершении какого-либо действия, напри
 мер, о завершении скачивания файла из Интернета или об окончании со
 хранения игры. Это информационное окно содержит текстовое сообщение
 и графический элемент в виде галочки;
 ? Information Note - сообщение информационного характера, обычно свя
 занного с ошибками сделанными пользователем, например, ввод непра
 вильного пароля или имени. Информационное окно содержит текст и гра
 фический элемент в виде прописной английской буквы i;
 ? Error Note - этот вид примечания связан с серьезными ошибками, вызван
 ными сбоем программы. Окно содержит текст три восклицательных знака;
 ? Warning Note - информационное сообщение, связанное с предупреждени
 ем, в окне рисуется большой восклицательный знак и текст сообщения.
  Команда ETestNote в нашей программе будет иметь вторичное меню со списком из двух команд. Теперь перейдем к файлу Test.rss. На компакт-диске он находится в папке \Code\MenuTest\group\Test.rss.
 /у*******************************************************
 // файл Test.rss
 // ресурсы приложения
 //it******************************************************
 II (ID) NAME MENS
 // подключаем системные библиотеки
 ¦include
 tinclude
 ¦include
 // подключаем заголовочный файл
 #include "Test.hrh"
 // сигнатура /у*******************************************************
 RESOURCE RSSSIGNATURE
 
 | у/*******************************************************
 i // имя документа
 ' //*******************************************************
 i
 i RESOURCE TBUF r_default_document_name
 I buf="";
 > //*******************************************************
 // объявляем меню //*******************************************************
 i
 RESOURCE EIK_APP_INFO
 {
 cba = R_AVKON_SOFTKEYS_OPTIONS_EXIT; menubar = r_test_menubar;
 1 }
 /у*******************************************************
 // создаем меню
 //Л******************************************************
 RESOURCE MENU_BAR r_test_menubar {
 titles =
  {
 I MENU_TITLE
 {
 menu_pane = r_test_menu;
 у/*******************************************************
  // определяем команды для меню "Options" у/*.*.*.*.***.************************************************
 RESOURCE MENU_PANE r_test_menu {
 items = {
 // Test.hrh
  MENU_ITEM
  {
 command = ETestConfirmation; txt = "Confirmation Note";
 
 MENU_ITEM
 {
 command = ETestNotes;
 txt = "Notes";
  cascade = r_test_submenu; Ь
 MENU_ITEM {
 command = ETestlnformation;
 txt "¦ "Information Note";
 ь
 MENU_ITEM {
 command = EAknCmdExit;
 txt = "Exit";
 // вторичное меню /у*******************************************************
 RESOURCE MENU_PANE r_test_submenu {
 items =
 {
 MENU_ITEM
 {
 command = ETestError;
  txt = "Error Note"; },
 MENU_ITEM {
 command = ETestWarning; txt = "Warning Note";
 
 /у
 
 *******************************************************
 
  В самом начале исходного кода происходит изменение идентификатора ресурса на новое название MENS. Затем в ресурсе EIK_APP_INFO объявляется о создании меню для подэкраннои клавиши.
 
 menubar - r_test_menubar;
  Слово menubar - это зарезервированное слово, объявленное в системном заголовочном файле avkon.rh и указывающее на создание меню в программе. Дается название создаваемому меню r_test_menubar - это произвольное название, которое вы можете выбрать сами. Семантика в названии может быть любой, но рекомендуется применять английскую букву г в начале названия и знаки подчеркивания в самом названии. В нашей программе мы объявили меню с названием r_test_menubar, теперь надо описать этот вид меню. Делается это следующим образом:
 //*******************************************************
 // создаем меню //********************* ***********¦>
 RESOURCE MENU_BAR r_test_menubar {
 titles = {
 MENU_TITLE {
 menu_pane = r_test_menu;
 
 //*************
 
 **********
 
  Ресурс MENU_BAR описывает вид создаваемого меню. С помощью конструкции из слов titles и MENU_TITLE, а также ключевого слова menu_pane определяется меню в виде панели со списком команд под названием r_test_menu. И уже в ресурсе MENU_PANE описываются команды для списка меню r_test_menu.
  Как видите, применяется чередующаяся друг за другом конструкция исходного кода, где сначала объявляется меню, потом описывается вид создаваемого меню и в конце задается список команд в ресурсе MENU_PANE.
 // определяем команды для меню "Options" //*******************************************************
 RESOURCE MENUPANE rtestmenu
 items
 // Test.hrh MENUITEM
 
 command = ETestConfirmation; txt = "Confirmation Note";
 Ь
 MENU_ITEM {
 command = ETestNotes;
 txt = "Notes";
 cascade = r_test_submenu;
 MENU_ITEM {
 command = ETestlnformation;
 txt = "Information Note";
 },
 MENU_ITEM {
 command = EAknCmdExit;
 txt = "Exit";
  При описании команд меню применяется ключевое слово MENU_ITEM с фигурными скобками, внутри которых содержится исходный код для каждой команды. Ресурс command служит для идентификации определенной команды, которые объявлены в файле Test.hrh. С помощью ресурса txt задается текст, устанавливающий вид команды. Когда вы нажмете подэкранную клавишу Options, то появится меню со списком команд, названия которых задаются в MENU_PANE. Названия заданы на английском языке, только он отображается корректно. Для того чтобы использовать русский или другие языки в меню или во всей программе, нужно использовать систему локализации, о которой мы проговорим в конце этой главы в разделе 8.5.(Локализация). В списке присутствует команда выхода и три дополнительные команды, а одна из них, ETestNotes, содержит еще вторичное меню.
  Для определения вторичного меню создан следующий код: cascade = r_test_submenu;
  То есть, содержится дополнительный список вторичного меню, команды которого так же нужно описать:
 // вторичное меню
 //*******************************************************
 
 RESOURCE MENU_PANE r_test_submenu {
 items = {
 MENU_ITEM {
 command = ETestError; txt = "Error Note"; },
 MENU_ITEM {
 command = ETestWarning; txt = "Warning Note"; }
  }; }
  Как видите, описание вторичного меню ничем не отличается от описания основного. Тот же набор идентификаторов, схема описания и лишь ресурс r_test_submenu указывает на принадлежность к вложенному меню.
  На этом формирование меню и его команд заканчивается. Если сейчас откомпилировать и запустить программу MenuTest, то при нажатии на клавишу Options станут доступными созданные основное и вторичное меню (посмотрите на рис. 8.3).
 
 
 
 
 
 
 Рис. 8.3. Меню в программе MenuTest
  Но при выборе одной из команд запустится механизм обработки внештатных ситуаций (паника) и приложение будет закрыто, поэтому надо переместиться
 в файл Test_AppUi.cpp и написать исходный код для сформированного меню.
  В программе MenuTest файл Test_AppUi.cpp находится на компакт-диске в папке \Code\MenuTest\src\Test_appUi.cpp, рассмотрим исходный код этого файла.
 
 // файл Test_AppUi.cpp J
 // реализация класса CTestAppUi
 /у******************************************************* i
 II подключаем системные библиотеки ¦include ¦include
 // подключаем файл ресурса tinclude
 // подключаем заголовочные файлы
 #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() {
 1
 // деструктор
 CTestAppUi::-CTestAppUi() {
 if (iAppView)
 {
 // удаляем из стека
 iEikonEnv->RemoveFromStack(iAppView) ; // удаляем объект delete iAppView; // обнуляем iAppView = NULL;
 
 // обработка команд
 void CTestAppUi::HandleCommandL(Tint aCommand)
 {
 switch(aCommand) {
 // меню Confirmation: case ETestConfirmation:
 {
 _LIT (textl, "Confirmation Note");
 CAknConfirmationNote* NoteConfirmation;
 NoteConfirmation = new (ELeave) CAknConfirmationNote;
  NoteConfirmation ->ExecuteLD(textl); break; }
 // меню Information case ETestlnformation: {
 _LIT (text2, "Information Note");
 CAknInformationNote* Notelnformation;
 Notelnformation = new (ELeave) CAknInformationNote;
  Notelnformation ->ExecuteLD(text2); break; }
 // вторичное меню Error case ETestError: {
 _LIT (text3, "Error Note");
 CAknErrorNote* NoteError;
 NoteError = new (ELeave) CAknErrorNote;
  NoteError ->ExecuteLD(text3); break; }
 // вторичное меню Warning case ETestWarning:
 {
 _LIT (text4, "Warning Note");
 CAknWarningNote* NoteWarning;
 NoteWarning = new (ELeave) CAXnWarningNote;
  NoteWarning ->ExecuteLD(text4); break;
 
 // выход
 case EAknSoftkeyExit:
 
 /у
 
 case EEikCmdExit:
 {
  Exit (); break; }
 // паника default:
  User::Panic (_L("MenuTest"), ETestBasicUi); break; }
 **********************************************
 
  Все действия по обработке команд происходят в функции HandleCom-mandL (). В качестве ключей (case) используются команды, определенные в файле Test.hrh, это: ETestConfirmation, ETestlnformation, ETestError и ETestWarning. Обратите внимание, между ключами содержится исходный код команды, заключенный в фигурные скобки, что редко применяется в программировании на C++. Дело в том, что Metrowerks CodeWarrior при компиляции программы под платформу ARMI UREL или THUMB UREL перестраховывается и видит в этом ошибку. Только использование фигурных скобок дает возможность запаковать программу в SIS-архив. При эмуляции программы на компьютере и в C++ BuilderX такой проблемы не возникает. Для команды ETestConfirmation сначала задается текстовое сообщение, которое будет написано внутри информационного сообщения. Это текст Confirmation Note, указывающий на вид используемого примечания. Затем в двух строках кода: CAknWarningNote* NoteWarning; NoteWarning = new (ELeave) CAknWarningNote;
 происходит создание и инициализация объекта, представляющего информационное примечание типа Confirmation Note. И в строке NoteWarning ->ExecuteLD(text); созданное информационное примечание выводится на экран телефона.
  Обработка всех последующих команд происходит аналогичным образом, но с использованием классов CAknlnf ormationNote, CAknErrorNote и CAknWarningNote для каждого типа информационного примечания. На рис. 8.4 изображена работа программы MenuTest со всеми вариантами сообщений.
  Таким вот образом и происходит работа с меню в Symbian OS для серии 60, что позволяет программисту создавать хорошую систему обработки команд и навигацию в приложении.
 
 
 Рис. 8.4. Информационные примечания в программе MenuTest
 8.5. Локализация
  Создавая программу для массового использования, надо обязательно предусмотреть возможность поддержки максимального количества языков. Для этого в Symbian OS реализована система локализации приложения или поддержки языков.
  Каждый язык в Symbian OS имеет свой код - это ключевое слово и целочисленное значение. Например, для русского языка это ELangRussian = 16. В табл. 8.1 даны коды для всех языков, поддерживаемых Symbian OS.
 Таблица 8.1. Коды языков
 Языки Коды
 Английский Великобритания ELangEnglish = 1
 Французский ELangFrench = 2
 Немецкий ELangGerman = 3
 Испанский ELangSpanish = 4
 Итальянский ELangltalian = 5
 Шведский ELangSwedish = 6
 Датский ELangDanish = 7
 Норвежский ELangNorwegian = 8
 Финский ELangFinnish = 9
 Американский ELangAmerican = 10
 Швейцарский французский ELangSwissFrench = 11
 
 Таблица 8.1. Коды языков (продолжение)
 
 Языки
 
 Коды
 
 
 
 Швейцарский немецкий
 Португальский
 Турецкий
 Исландский
 Русский

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

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