<< Пред. стр. 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
Системные файлы ресурсов Symbian OS подключаются независимо от использования UIQ_ или серии 60. При создании приложения под конкретную платформу, нужно подключить дополнительные файлы ресурсов, например, для серии 60 это: #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
// подключаем файл ресурса 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. Коды языков (продолжение)
Языки
Коды
Швейцарский немецкий
Португальский
Турецкий
Исландский
Русский