Как выбирать и отображать ориентиры
Метаданные
Статья
Стандартные диалоги
Landmarks UI Selector API содержит несколько классов, которые позволяют выбирать ориентиры и категории ориентиров с помощью стандартных диалогов.
Вы должны включить заголовочный файл clmklandmarkselectordlg.h, на этапе связывания использовать библиотеку LmkCommonUi.lib.
Следующий фрагмент кода демонстрирует как запустить диалог и выбрать один ориентир:
TLmkItemIdDbCombiInfo item;
CLmkLandmarkSelectorDlg* selectLandmarkDlg = CLmkLandmarkSelectorDlg :: NewL();
selectLandmarkDlg->SetMopParent( this );
// запустить диалог для выбора ориентира
if( selectLandmarkDlg->ExecuteLD( item ) != 0 ) // dlg удалится автоматически
{
// получить ID выбранного элемента
TPosLmItemId itemId = item.GetItemId();
// Далее ваш код
delete item.GetLmDb(); // фиксирование утечки памяти
}
Фрагмент кода, позволяющий выбрать несколько ориентиров:
CLmkLandmarkSelectorDlg* selectLandmarkDlg = CLmkLandmarkSelectorDlg::NewL();
selectLandmarkDlg->SetMopParent( this );
RArray< TLmkItemIdDbCombiInfo > arrItems;
CleanupClosePushL( arrItems );
// выбрать список ориентиров
if( selectLandmarkDlg->ExecuteLD( arrItems ) != 0 )
{
// далее Ваш код
delete arrItems[0].GetLmDb(); // фиксирование утечки памяти
}
CleanupStack::PopAndDestroy(); // arrItems
Вы можете использовать класс CLmkCategorySelectorDlg для выбора одной или нескольких категорий аналогичным образом ( необходимо включить заголовочный файл clmkcategoryselectordlg.h ).
Landmarks UI Add/Edit API позволяет использовать стандартный диалог для просмотра/редактирования конкретного ориентира. API содержит единственный класс CLmkEditorDlg ( заголовочный файл clmkeditordlg.h ).
Запустить диалог для изменения атрибутов ориентира можно следующим образом:
// Открыть базу данных ориентиров по умолчанию
CPosLandmarkDatabase* db = CPosLandmarkDatabase :: OpenL( );
CleanupStack::PushL( db );
CLmkEditorDlg::TLmkEditorParams editParams;
// все атрибуты ориентира должны присутствовать в диалоге
editParams.iAttributes = CLmkEditorDlg::ELmkAll;
// пользователь может изменять значения ориентиров
editParams.iEditorMode = CLmkEditorDlg::ELmkEditor;
// lmItem - ID конкретного ориентира
CLmkEditorDlg *dlg = CLmkEditorDlg::NewL(*db, lmItem, editParams);
dlg->ExecuteLD();
CleanupStack :: PopAndDestroy(); // db
Пользовательские диалоги
Этот пример демонстрирует:
- как выбрать ориентир из базы данных
- как получить параметры ориентира (широта, долгота...)
- как отобразить данные ориентира
Используются следующие заголовочные файлы:
#include <clmklandmarkselectordlg.h>
#include <tlmkitemiddbcombiinfo.h>
#include <epos_cposlandmarkdatabase.h>
#include <e32cmn.h> //Abs
MMP-файл должен декларировать использование следующих библиотек:
LIBRARY lmkcommonui.lib
LIBRARY eposlandmarks.lib
LIBRARY lbs.lib
// для диалога
LIBRARY eikdlg.lib
LIBRARY eikctl.lib
Необходимо отметить, что значения координат ориентиров в базе данных представлены в десятичной системе - такое представление удобно для различных расчетов. На практике, для представления значений долготы и широты, используются градусы, минуты, секунды. Географические координаты широты ориентиров, расположенных в Северном Полушарии принято считать положительными, широта ориентиров в Южном Полушарии считается отрицательной. Географическая долгота ориентиров, расположенных к западу от Гринвичского меридиана, считается положительной, расположенных восточнее - отрицательной.
Для перевода значений широты/долготы из десятичной системы Вы можете использовать функцию Decompose2Geographical:
const TInt KMinsPerDegree = 60;
const TInt KSecsPerDegree = 3600;
// разложить значение широты/долготы на градусы, минуты, секунды
void YourClassName :: Decompose2Geographical( TReal64& aValue, TInt& aDeg,
TInt& aMinutes, TReal& aSeconds )
{
aDeg = ( TInt )aValue;
aMinutes = ( Abs( aValue - aDeg ) ) * KMinsPerDegree;
aSeconds = ( Abs( aValue - aDeg ) ) * KSecsPerDegree - aMinutes * KMinsPerDegree;
}
Для представления значений ввиде строки можно использовать следующую функцию:
// добавить данные широты/долготы в aDes
// если aValue = -23,3876 тогда aDes += -23°23'15.36"
void YourClassName :: AppendValueAsGeographical( TReal64& aValue,
TDes& aDes )
{
TInt deg, minutes;
TReal secs;
Decompose2Geographical( aValue, deg, minutes, secs );
aDes.AppendNum( deg );
aDes.Append( 176 ); // знак градуса
aDes.AppendNum( minutes );
aDes.Append( '\'' );
TRealFormat format( 5, 2 );
format.iType = KRealFormatFixed | KDoNotUseTriads;
aDes.AppendNum( secs, format );
aDes.Append( '"' );
}
Следующий фрагмент кода демонстрирует, как выбрать ориентир из базы данных и отобразить его атрибуты:
// этот диалог используется для выбора ориентира
CLmkLandmarkSelectorDlg* selectLandmarkDlg = CLmkLandmarkSelectorDlg :: NewL();
TLmkItemIdDbCombiInfo selectedItem;
// dlg удаляется автоматически
TInt ret = selectLandmarkDlg->ExecuteLD( selectedItem );
if( ret != 0 )
{
// было нажато Select или OK
TPosLmItemId itemId = selectedItem.GetItemId(); // ID выбранного элемента
CPosLandmarkDatabase* lmDb = selectedItem.GetLmDb(); // DB элемента
CPosLandmark* lmItemPos = lmDb->ReadLandmarkLC( itemId ); // чтение данных
// !!! Все диалоговые строки должны быть определенны в ресурсах.
// В данном примере (чтобы не загромождать код) все строки представлены
// в качестве литералов (макрос _LIT).
TBuf<128> lmInfo;
_LIT( KName, "Name: ");
lmInfo.Append( KName );
TPtrC landmarkName;
if( lmItemPos->GetLandmarkName( landmarkName ) == KErrNone )
lmInfo.Append( landmarkName ); // имя ориентира определенно
lmInfo.Append( '\n' );
TLocality pos;
if( lmItemPos->GetPosition( pos ) == KErrNone )
{
_LIT( KLatitude, "Latitude: " );
lmInfo.Append(KLatitude);
TReal64 latitude = pos.Latitude();
AppendValueAsGeographical( latitude, lmInfo );
lmInfo.Append( '\n' );
_LIT( KLongitude, "Longitude: " );
lmInfo.Append( KLongitude );
TReal64 longitude = pos.Longitude();
AppendValueAsGeographical( longitude, lmInfo );
lmInfo.Append( '\n' );
_LIT( KAltitude, "Altitude: " );
lmInfo.Append( KAltitude );
TRealFormat format( 6, 2 );
lmInfo.AppendNum( pos.Altitude(), format );
lmInfo.Append( '\n' );
_LIT( KHorAcc, "Hor. Acc.: " );
lmInfo.Append( KHorAcc );
lmInfo.AppendNum( pos.HorizontalAccuracy(), format );
}
delete lmDb;
// создать и запустить диалог
CAknMessageQueryDialog* dlg = CAknMessageQueryDialog :: NewL( lmInfo );
dlg->PrepareLC( R_LANDMARK_DIALOG ); // не забудьте включить Ваш rsg-файл
_LIT( KDlgName, "Landmark Info" );
dlg->SetHeaderTextL( KDlgName );
dlg->RunLD();
}
RSS-данные для диалога:
RESOURCE DIALOG r_landmark_dialog
{
flags = EEikDialogFlagNoDrag | EEikDialogFlagCbaButtons | EEikDialogFlagWait;
buttons = R_AVKON_SOFTKEYS_BACK;
items =
{
DLG_LINE
{
type = EAknCtPopupHeadingPane;
id = EAknMessageQueryHeaderId;
control = AVKON_HEADING
{
headinglayout = R_AVKON_LIST_HEADING_PANE_POPUPS;
};
},
DLG_LINE
{
type = EAknCtMessageQuery;
id = EAknMessageQueryContentId;
control = AVKON_MESSAGE_QUERY
{
message="";
};
}
};
}
Диалог будет выглядеть следующим образом:


(no comments yet)