×
Namespaces

Variants
Actions

Going Beyond Hello - A Tutorial for Symbian C++ Applications/ru

From Nokia Developer Wiki
Jump to: navigation, search
Article Metadata
Code ExampleArticle
Created: ()
Last edited: hamishwillee (14 Nov 2011)

В статье Первая программа на Symbian C++ были рассмотрены вопросы создания графического приложения с помощью Carbide.c++, а также была затронута тема сборки и запуска проекта на эмуляторе Windows и на самом устройстве.

В этой же статье на основе созданного в прошлый раз приложения будет разработан пример маленького графического редактора, что позволит раскрыть некоторые другие аспекты программирования на Symbian C++, например, создание меню, управление событиями touch (прикосновения к экрану), отрисовка на экране и др.

Contents

Структура приложения

В Carbide.c++ предлагается два способа просмотра структуры проекта. Во-первых, это традиционный Project Explorer среды Eclipse, располагающий список файлов по директориям точно таким же образом, каким они располагаются в файловой системе.

А во-вторых, Symbian Project Navigator, отображающий те же самые файлы, только располагая их в соответствии с логической иерархией и принятым в Symbian стандартам.

Можно удивиться такому большому количеству файлов для такого маленького приложения "Hello World". Однако, разгадка лежит на поверхности - более простое Hello World не позволило бы заглянуть в мир реальных приложений.

Взамен простого Hello World Carbide.c++ легко и без принуждения создал полноценный, законченный и расширяемый проект, структура которого отделяет код и данные согласно MVC шаблону. При этом приложение может реагировать на события системы и содержит всё, что необходимо для его локализации.

Директории проекта

FD1-7 29.CarbideProjectNavigator.png

\group

  • bld.inf: компонентный файл. Определяет mmp файлы, принадлежащие компонентам приложения, экспортируемые заголовочные файлы, конфигурацию сборки по умолчанию (например, GCCE, WINSCW) и так далее.
    • Bld.inf применяется для генерации make файлов, которые (abld.bat) используются для сборки в командной строке.
    • Этот файл отвечает за импорт проекта на Symbian C++ в Carbide.c++, так как обладает всеми ссылками на исполняемые файлы в проекте (смотри Пример импортирования).
  • HelloWorld.mmp: файл проекта. Для сборки выполняемого файла (в нашем случае это HelloWorld.exe) определяет настройки , независящие от платформы и компилятора. Содержит информацию о ресурсных файлах, файлах исходного кода для компиляции и библиотеках для подключения.
  • Icons_aif_scalable_dc.mk: Make файл для создания иконки приложения из *.svg файла в директории /gfx.

\src

  • HelloWorldApplication.cpp: Для EXE файла задает точку входа (E32Main()) и реализует класс Application (который обеспечивает самую основную функциональность графического интерфейса). Обычно в этот файл, основанном на стандартном шаблонном классе GUI приложения, не вносится какой-либо дополнительный код.
  • HelloWorldDocument.cpp: Этот класс отвечает за настройки, которые необходимо сохранять от одного запуска приложения к другому. В классе реализованы функции загрузки и сохранения .ini файлов. Этот механизм по умолчанию недоступен — для большинства приложений этот код можно принять без изменений.
  • HelloWorldAppUi.cpp: Это главный класс управления приложением. Реализует логику управления событиями всего приложения (поэтому не надо обрабатывать, например, завершение работы приложения в каждом из видов). Хранит информацию обо всех использующихся видах.
  • HelloWorldContainerView.cpp: Этот класс содержит информацию о всех графических элементах и управляет событиями текущего вида. Самостоятельно этот класс ничего не отображает, но владеет и управляет информацией о классе Container (ниже), который отвечает за часть вида (view) MVC шаблона.
  • HelloWorldContainer.cpp: Содержит все графические элементы, который могут быть отображены на дисплее. Обычно классы ContainerView и Container имеют очень тесную связь.

Таким образом во время запуска приложения, будут созданы следующие объекты:

FD1-7 30.ApplicationStartClassCreation.png

\inc

  • HelloWorldApplication.h, HelloWorldDocument.h, HelloWorldAppUi.h:, HelloWorldContainerView.h,HelloWorldContainer.h: Заголовочные файлы, соответствующие каждому из исходных файлов, описанных выше.
  • HelloWorld.hrh: Идентификаторы для UI элементов, в том числе и видов. Совместно используется ресурсными файлами для определения UI элементов и файлами исходного кода для управления этими элементами.
  • HelloWorld.pan: Определяет код паник и соответствующие им методы.


\data

  • HelloWorld_reg.rss: Содержит регистрационную информацию о приложении, такую как, например, название.
  • HelloWorld.rss: Главный ресурсный файл. Содержит дополнительную информацию о приложении, а также о пользовательском интерфейсе и текстовых ресурсах.
  • HelloWorld.loc, HelloWorld.l01: Файл локализации. Использующиеся в UI строки записываются в отдельном ресурсном файле локализации. Каждый файл имеет формат расширения .lxx, где xx — это определенный номер языка. Так для английского языка — это ‘01’, для французского — ‘02’, а для немецкого ‘03’ и так далее. Файл .loc связывает все языковые файлы, подключая их с помощью инструкции #include. Языковые файлы компилируются в отдельные ресурсные файлы (с расширением .rxx; Ресурсный файл для текущего языка устройства будет подгружен UI подсистемой во время выполнения программы.


\gfx

  • list_icon.bmp, list_icon_mask.bmp, mark_icon.bmp, mark_icon_mask.bmp: файлы изображений и их масок. Компилируются в файл MultiBitMap (mbm), формат которого предназначен для отображения на дисплее.
  • qgn_menu_HelloWorld.svg: SVG-T файл изображения, который будет скомпилирован в файл HelloWorld_aif.mif MultiImageFile (mif), использующийся для иконки приложения.


\sis

  • HelloWorld.pkg: Определяет содержимое, которое будет запаковано в устанавливаемый на устройство .sis файл. Включает выполняющийся файл, требующиеся ресурсные файлы (например, графические файлы и так далее).
  • HelloWorld.sis: Сжатый файл установки на устройство. Сборка этого файла основана на файле .pkg.
  • HelloWorld.sisx: Подписанный сертификатом sis файл (в нашем случае самоподписанный).


Расширяем Hello World – Графический редактор

Для того чтобы сделать наше приложение более интерактивным попытаемся реализовать простой графический редактор, позволяющий пользователю рисовать линии прикосновением к экрану.

Линии будут рисоваться прямо на экране, а все изменения будут потеряны, как только произойдет перерисовка экрана — например, при звонке на наш телефон в тот момент, когда на нем запущено наше приложение. Отрисовка линий будет осуществляться на bitmap (графический битовый образ), содержимое которого просто копируется на экран всякий раз, когда это требуется.

Одно из решение проблемы потери данных заключается в том, чтобы сохранять все линии в специально заведенном списке. При необходимости перерисовать содержимое экрана последовательно обходится весь список и отрисовывается каждая линия заново.

Использование SDK документации

Класс, управляющий bitmap, называется CFbsBitmap. Обратимся к документации по этому классу, чтобы определить необходимые заголовочные файлы, библиотеки и доступные методы.

По этой ссылке можно перейти на страницу поиска online документации по интересующему нас классу CFbsBitmap. В результате поиска должна быть найдена страница CFbsBitmap in Os Font_and_Bitmap_Server.

Note.pngNote: Если нет доступа к online документации, можно воспользоваться offline SDK документацией. Для этого нажмите кнопку Пуск и перейдите по: Все программы - S60 Developer Tools - 5th Edition SDK, v1.0 - SDK Documentation

Наверху страницы можно увидеть, что для использования CFbsBitmap нам потребуется заголовочный файл FBS.H и подключение библиотеки fbscli.lib.

FD1-7 31.DeveloperLibrary.png

Этот класс обладает возможностью сохранения bitmap, а также предоставляет прямой доступ к данным bitmap. Однако, для более удобной работы отрисовка будет осуществляться через устройство и контекст.

Для более подробной информации по bitmap, контексту и функциям отрисовки в документации можно поискать по слову ‘bitmaps’. Поиск приведет на страницы Bitmaps in Using Bitmaps (Использование bitmaps), или Using Bitmaps in Using Graphics Device Interfaces (Использование bitmaps для графического интерфейса устройства).

Платформа Symbian имеет несколько различных классов устройств и контекста. В нашем случае будет использоваться CFbsBitmapDevice (заголовочный файл: bitdev.h, библиотека: bitgdi.lib) и CFbsBitGc (заголовочный файл: bitstd.h, библиотека: bitgdi.lib).

Добавление библиотеки в проект

На предыдущем шаге было определено, что потребуется подключение двух библиотек для использование всех трех классов: fbscli.lib и bitgdi.lib. Для добавления их в наш проект необходимо открыть файл HelloWorld.mmp (из директории /group/ окна Project Explorer) и затем перейти на вкладку Libraries.

Наверху этой вкладки можно увидеть список всех подключенных библиотек. Библиотека fbscli.lib уже должна находиться в списке, поэтому нет необходимости ее добавлять. Однако bitgdi.lib отсутствует.

Note.pngNote: Библиотек в этом списке на самом деле больше, чем потребуется нашему проекту (они были добавлены мастером по созданию проектов!). Однако это не страшно и удалять их не стоит.

Нажимаем на кнопку Add (Добавить). Находим bitgdi.lib в списке и добавляем ее в список Libraries (библиотек).

FD1-7 32.CarbideMMPEditorLibraries.png

После завершения этих действий обе библиотеки должны быть в списке Libraries.

Когда приложение будет компилироваться заново, Carbide.c++-ом будут автоматически определены изменения в файле .mmp и затем будет предложен выбор для дальнейших действий. Нажмите на Compile and Link для автоматического внесения в проект изменений согласно .mmp файлу.

FD1-7 33.CarbideModifiedMMPdetected.png

Создание bitmap

После того как библиотеки были добавлены, появилась возможность использовать bitmap классы а нашем проекте. Откройте файл HelloWorldContainer.h и добавьте следующие инструкции подключения заголовочных файлов:

#include <fbs.h> 
#include <bitdev.h>
#include <bitstd.h>

Для сохранения bitmap объектов в качестве членов класса, добавьте следующие инструкции в private секцию класса CHelloWorldContainer. Будьте осторожны и не добавляйте этот код в секции, управляемые UI designer, так как все ручные изменения в этих секциях будут потом автоматически удалены. Эти области помечены с помощью специальных комментариев.

private: 
CFbsBitmap* iBitmap;
CFbsBitmapDevice* iBmpDevice;
CFbsBitGc* iBmpGc;

В Symbian C++ используется специальный стиль кодирования, которого стоит придерживаться. Имена переменных членов классов должны начинаться со строчной буквы i, например, (iBitmap). Параметры функции должны начинаться со строчной a — (aBitmap). Обычные локальные переменные, которые создаются внутри функции, не должны иметь какого-либо префикса. Используя эти соглашения, при чтении кода сразу будет понятно, откуда эта переменная появилась — а это очень важный аспект при удалении объектов.

Следующее, что необходимо сделать — это создать bitmap. Определите и реализуйте новый метод:

void CHelloWorldContainer::CreateBitmapsL()

Разберем этот метод шаг за шагом:

Во-первых, необходимо быть уверенным, что предыдущий объект удален, если он существовал вообще. Это требуется для того, чтобы приложение могло создать заново bitmap объект, например, в случае смены слоев экрана. Перед вызовом деструктора не надо делать проверку, является ли указать NULL, так как C++ вызов delete удаляет только тот объект, который не NULL. Однако надо быть уверенным, что объект на самом деле стал NULL, для чего следует присвоить NULL объекту. Это позволит при следующем удалении избежать "двойного удаления" в деструкторе, которое обычно приводит к панике системы.

delete iBitmap; iBitmap = NULL; 
delete iBmpDevice; iBmpDevice = NULL;
delete iBmpGc; iBmpGc = NULL;

Следующая строка кода должна быть понятно — создается объекта класса CFbsBitmap:

iBitmap = new (ELeave) CFbsBitmap();

Объявление (ELeave) в Symbian C++ вызовет сброс (Symbian C++ вариант стандартных исключений) в случае, если не удастся выделить память объекту, например, потому что недостаточно памяти. Объявив (ELeave), не надо дальше проверять корректно ли создался объект, так как, если не возникло паники, то это автоматически означает, что создание прошло успешно. Более подробную информацию по сбросам можно найти здесь.

Обрабатывать потенциально возникшие сбросы в этом методе не надо, на это указывает буква L в конце имени метода (CreateBitmapL()), которая обычно добавляется для метода способного привести к сбросу. Более подробно об этом моменту будет ниже.

Сейчас вернемся к нашему размещенному в памяти классу CFbsBitmap и попытаемся создать его. Размер, доступный для рисования по контейнеру, можно получить вызовом метода Size() из класса родителя. EColor16MU определяет цветовую глубину – в нашем случае это true color режим с 32 битами на пиксель. Режим цвета EColor16MA не использует старший байт, а задействует его для маски прозрачности (alpha channel).

iBitmap->Create(Size(), EColor16MU);

На следующей строке создается графическое устройство на основе bitmap. Графическое устройство необходимо для создания графического контекста. Использование метода NewL() общепринятая практика в Symbian C++. Это статическая 'фабрика' функция, которая возвращает объект требуемого типа.

iBmpDevice = CFbsBitmapDevice::NewL(iBitmap);

Графический контекст обеспечивает большое количество операций рисования, среди который определение способа рисования.

iBmpDevice->CreateContext(iBmpGc);

После того как объекты созданы, самое лучшее время для того, чтобы подумать о том, когда они будут удаляться. Утечки памяти имеют серьезные последствия на мобильных устройствах, где не предусмотрена виртуальная память, а основная память ограничена 30-80 мегабайтами. Поэтому перейдем к декструктору CHelloWorldContainer и добавим следующие инструкции для удаления трех объектов:

delete iBmpGc; 
delete iBmpDevice;
delete iBitmap;

После проделанных шагов возникает логичный вопрос: где вызывать метод CreateBitmapsL(). Конечно, можно это сделать из конструктора класса. Но что произойдет, если во время работы приложения, пользователь физически поменяет ориентацию телефона с книжной на альбомную? Так как bitmap был создан с книжными размерами, пользователь больше не сможет использовать полноэкранный режим для рисования.

Таким образом, наше приложение должно реагировать на событие изменения размеров экрана. В нашем случае при этом событии выполняется метод SizeChanged(). Когда контейнер впервые создается, размеры изменяются, а это позволит просто вызвать наш метод CreateBitmapsL() из SizeChanged():

void CHelloWorldContainer::SizeChanged() 
{
CCoeControl::SizeChanged();
LayoutControls();
 
// [[[ begin generated region: do not modify [Generated Contents]
// ]]] end generated region [Generated Contents]
 
if (!iBitmap || (iBitmap && iBitmap->SizeInPixels() != Size()))
{
TRAPD(err, CreateBitmapsL());
}
}

В приведенном выше коде дополнительная проверка гарантирует, что bitmap будет пересоздан только в том случае, если размеры контейнера действительно отличаются от размеров bitmap. Метод SizeChanged() также вызывается, например, когда нажимается меню опций (кнопка options в нижнем левом углу).

Однако, что за инструкция TRAPD() делает здесь? Чтобы понять это необходимо обратиться к концепции сбросов.

Сбросы

При программировании в Symbian C++ добавление буквы L к концу имени метода означает, что метод может вызвать сброс (обычно потому что вызывает другие методы, способные вызвать сброс, не применяя при этом "TRAP" к ним). Заметим, что это лишь относится к правилам стиля кодирования, но никак не проверяется и не требуется компилятором.

Метод CreateBitmapsL() вызывает два метода, которые могут вызвать сброс: параметр (ELeave), перегруженного метода new, который вызывает сброс при недостатке памяти для размещения в ней объекта. К имени метода создания графического устройства NewL() также добавлена буква L, что означает также возможность появления сброса. Наш метод CreateBitmapsL() никаким образом не отлавливает эти сбросы, поэтому к его имени также добавляется буква L.

Любой сброс вызывает возвращение по стеку вызовом до первого макроса TRAPD. Метод SizeChanged() ловит сбросы из CreateBitmapsL() и следовательно его имя не оканчивается на L.

Код возвращаемой сбросом ошибки сохраняется в переменной err, которая объявляется как обыкновенное целое макросом. Считается хорошим тоном проверить содержимое этой переменной и в соответствии с этим содержимым обработать ошибку, а не делать так, как сделано это в нашем коде, т.е. ошибка просто проигнорирована. В нашей ситуации обработка ошибок проигнорирована для упрощения кода. {{Tip| Хорошим способом автоматической проверки кода на возможность возникновения потенциальных проблем является использования средства CodeScanner, которое идет в комплекте с Carbide.c++. Это средство статически анализирует код на соответствие Symbian правилам и стандартам. Более подробную информацию можно найти по адресу Carbide.c++.

Обработка событий Touch

Перед тем как начать обрабатывать события touch (события прикосновения к экрану) необходимо объявить еще одну переменную в нашем коде. Для того чтобы рисовать линию от одной точки прикосновения (первоначальная позиция) до другой, необходимо где-то сохранять информацию о первоначальной позиции. Поэтому добавим следующую private переменную в класс CHelloWorldContainer:

TPoint iLastPos;

TPoint — это удобный класс для хранения двух целых значений, которые в нашем случае интерпретируются как координаты. В добавлении к этому класс предоставляет методы по изменению значений. Нет необходимости инициализировать эту переменную в конструкторе класса CHelloWorldContainer, так как класс контейнера наследуется от класса CBase, который автоматически обнулит все переменные.

События touch наследуются из класса контейнера, который ответственен за управление всем видимым пользовательским интерфейсом главной панели приложения. Для того чтобы управлять событиями самостоятельно, необходимо переопределить следующий метод в классе CHelloWorldContainer:

void CHelloWorldContainer::HandlePointerEventL(const TPointerEvent& aPointerEvent)

Определите этот метод в заголовочном файле (он может быть либо private, либо protected) и добавьте реализацию в .cpp файл.

Информация о новом событии посылается через аргумент aPointerEvent. Нас будет интересовать событие up для первой кнопки (это справедливо только для текущих touch устройств). В тот момент когда пользователь отнимает стилус или палец от экрана, будет рисоваться линия до этой позиции. В реализацию метода добавьте следующую проверку:

if (aPointerEvent.iType == TPointerEvent::EButton1Up) 
{
}

Рисование линии представляет собой простое действие. Во-первых, определяется цвет и стиль, затем вызывается метод рисования линии. Заметим, что настройки цвета и стиля остаются в этом графическом контексте до тех пор, пока заново не будут изменены поэтому не стоит устанавливать каждый раз эти настройки, рисуя объекты с одним и тем же цветом и стилем.

iBmpGc->SetPenColor(KRgbRed); 
iBmpGc->SetPenSize(TSize(2,2));
iBmpGc->DrawLine(iLastPos, aPointerEvent.iPosition);

Затем сохраняется новая позиция, потому что по логике нашего приложения следующая линия начнется с конца предыдущей:

iLastPos = aPointerEvent.iPosition;

Наконец, необходимо перерисовать экран. В противном случае, пользователь не увидит новую линию!

DrawDeferred();

В конце метода также вызывается метод HandlePointerEventL() класса родителя (контейнер наследуется от CCoeControl, потому что сам по себе это обычный UI элемент):

CCoeControl::HandlePointerEventL(aPointerEvent);

Если все было сделано правильно, вот так должен выглядеть код метода HandlePointerEvent():

void CHelloWorldContainer::HandlePointerEventL(const TPointerEvent& aPointerEvent) 
{
if (aPointerEvent.iType == TPointerEvent::EButton1Up)
{
iBmpGc->SetPenColor(KRgbRed);
iBmpGc->SetPenSize(TSize(2,2));
iBmpGc->DrawLine(iLastPos, aPointerEvent.iPosition);
iLastPos = aPointerEvent.iPosition;
DrawDeferred();
}
CCoeControl::HandlePointerEventL(aPointerEvent);
}

Уже было добавлено все, что требуется для рисования на bitmap, но этот bitmap надо еще перенести на экран. Метод CHelloWorldContainer::Draw() вызывается тогда, когда система желает перерисовать содержимое контейнера. Поэтому в конец метода Draw() необходимо добавить следующую строку кода, которая копирует bitmap, начиная с верхнего левого угла графического контекста экрана:

gc.BitBlt(TPoint(0, 0), iBitmap);

Откомпилируйте проект. Все должно работать — рисовать линии можно щелкая мышкой внутри главной панели экрана эмулятора!

FD1-7 34.HelloWorldRedLines.png

Определение меню

Приложение можно улучшить, добавив пользователю возможность очистки экрана, что позволит ему начать рисунок сначала, не запуская приложения заново, а прямо во время его выполнения. В этой секции будет показано, как добавить и затем обработать событие на кнопку меню.

Откройте документ HelloWorldContainer.uidesign. Его можно найти в главной директории проекта через Project Explorer или в директории UI Designs через Symbian Project Navigator.

Щелкните мышкой по пункту optionsMenu внизу UI design, чтобы открыть меню. Как показано на рисунке, необходимо просто щелкнуть по пустому пункту меню и начать печатать:

FD1-7 35.CarbideUIDesignerOptionsMenu.png

Добавьте два пункта меню — Clear (для очистки экрана) и Exit (для закрытия приложения).

Затем щелкните один раз по пункту меню Exit, чтобы выбрать его. Перейдите к группе Behavior окна Properties и измените идентификатор команды на EAknCmdExit (это доступно в выпадающем списке). Эта команда также будет послана приложению, если операционная система пожелает завершить его работу, например, чтобы освободить для телефона дополнительную память. Поэтому необходимо, чтобы каждое приложение отвечало на это событие и корректно завершалось. Однако, управление этим моментом уже возложил на себя мастер Carbide.c++ при генерации приложения; нет необходимости реализовывать управление этим событием вручную.

FD1-7 36.CarbideUIDesignerExitMenu.png

Если сейчас попытаться запустить приложение, можно увидеть, что меню Exit уже работает.

Tip.pngTip: При тестировании приложения лучше завершать его по команде Exit (чем по кнопке закрытия приложения). Среда выполнения приложения автоматически проверит его на утечки памяти. Если закрыть сразу эмулятор, можно будет не обнаружить такие утечки на ранней стадии кодирования, что впоследствии приведет к тому, что обнаружить причину возникновения утечки будет все труднее и труднее.

Очистка рисунка

Когда пользователь нажимает кнопку меню Clear, вызывается метод CHelloWorldContainerView::HandleCommandL() с идентификатором команды в качестве параметра.

Если необходимо управлять каким-либо пунктом меню, то UI designer может создать вспомогательный для этого код за нас. Чтобы сделать это, щелкните правой кнопкой мыши и в появившемся меню выберите Handle ‘selected’ Event (задать управление выбранным событием). После появления окна с подтверждением внесенных изменений UI designer-ом — нажмите Yes. После этого будет сгенерирован код, и Carbide.c++ автоматически откроет файл с кодом и установит курсор в нем на новом методе HandleClearMenuItemSelectedL(). Это более подходящее место для написания своего кода реакции на нажатие отдельной кнопки меню, чем большая функция HandleCommandL(), которая обрабатывает все команды. Также будет автоматически сгенерирован код для вызова нового метода из HandleCommandL() (просмотрите сейчас этот метод, чтобы увидеть, внесенные автогенератором изменения).

FD1-7 37.CarbideUIDesignerHandleEvent.png

Теперь, осталось дело за малым — очистить bitmap. Чтобы сделать это создайте новый public метод в контейнере:

void CHelloWorldContainer::ClearDrawing() 
{
iBmpGc->Clear();
DrawDeferred();
}

И вызовите его из метода обработки событий. Как было объяснено в секции об архитектуре приложения, класс вида (CHelloWorldContainerView) является контроллером и собственником класса контейнера (CHelloWorldContainer). Поэтому этот класс на объект класса контейнера имеет указатель, который можно использовать для вызова метода очистки.

TBool CHelloWorldContainerView::HandleClearMenuItemSelectedL(TInt aCommand) 
{
iHelloWorldContainer->ClearDrawing();
return ETrue;
}

Сейчас все встало на свои места, и команда меню Clear должна очистить экран от прежде нарисованных линий.

Поздравляем с успешным окончанием этого маленького курса, теперь Вы являетесь обладателем своего собственного мобильного графического редактора!

Дальнейшие упражнения

В качестве дальнейшего упражнения было бы хорошо расширить только что созданный графический редактор. Например, добавить возможность смены пользователем цвета линии.

Tip.pngTip: Очень полезным может оказаться умение пользоваться 'горячими' клавишами, так как это значительно сократит время на выполнение рутинных операций, что позволит повысить эффективность разработки. Например, вместо того, чтобы для сборки проекта искать эту команду в меню, можно нажать комбинацию клавиш Ctrl + B. Также будет полезным: Ctrl + Shift + F автоматическое форматирование кода. Чтобы просмотреть полный список команд, нужно выполнить Ctrl + 3, а для просмотра списка 'горячих' клавиш — Ctrl + Shift + L.

Импорт других проектов

Вместе с установкой S60 SDK устанавливается много примеров, также можно загрузить примеры приложений с сайта developer.symbian.org и форума Nokia.

Чтобы импортировать уже готовое приложение в Carbide.c++, перейдите File | Import. В следующем диалоге выберите Symbian OS Bld.inf file и нажмите кнопку Next.

FD1-7 46.ImportFileTypeSelect.png

Теперь нажмите Browse и откройте файл bld.inf проекта, который необходимо импортировать. Обычно этот файл находится в директории /group/ проекта.

FD1-7 47.ImportFileSelect.png

На следующем шаге необходимо выбрать SDK, которое будет использоваться. При создании приложения Hello World это уже подробно объяснялось.

FD1-7 48.ImportSelectSDKsAndTargets.png

На следующем шаге обычно все настройки принимаются по умолчанию.

На последнем шаге необходимо определить настройки проекта Project Properties. В большинстве случаев можно оставить все значения по умолчанию.

FD1-7 49.ImportProjectProperties.png

После того как проект импортирован, можно приступать к работе. Содержимое проекта не копируется в текущую workspace директорию Carbide.c++, поэтому все изменения будут происходить прямо с первоначальными файлами. Если необходимо сохранить первоначальную версию проекта, то перед началом импорта стоит скопировать его в другую директорию.

Возможные проблемы: Если импорт проекта завершился ошибкой, обратите особое внимание на последний шаг: корневая директория должна совпадать с корневой директорий проекта, а не быть на уровень выше. Также имя проекта должно совпадать с последней частью пути к директории. Проблемы могут быть вызваны и настройками по умолчанию, которые среда задала некорректно.

Warning.pngWarning: Не пользуйтесь стандартным (Eclipse) импортом проектов! Причина, по которой не стоит этого делать, заключается в том, что стандартный импорт переносит все настройки сборки, включая пути к установленному SDK. Поэтому если SDK не был установлен в ту же директорию, что и на компьютере разработчика, то собираться проект не будет. Импорт bld.inf переносит только необходимое содержание проекта.

Итоги

В результате нашей работы был создан маленький графический редактор, который стал расширением возможностей приложения, разработанного в статье Symbian C++ Quick Start/ru. В этой статье были объяснены принципы создания приложения, включая способ задания меню, управление touch событиями экрана, отрисовка на экране и другие.

Дополнительная информация

Licence icon cc-by-sa 3.0-88x31.png© 2010 Symbian Foundation Limited. This document is licensed under the Creative Commons Attribution-Share Alike 2.0 license. See http://creativecommons.org/licenses/by-sa/2.0/legalcode for the full terms of the license.
Note that this content was originally hosted on the Symbian Foundation developer wiki.

This page was last modified on 14 November 2011, at 06:44.
84 page views in the last 30 days.
×