×
Namespaces

Variants
Actions

Как выбирать и отображать ориентиры

From Nokia Developer Wiki
Jump to: navigation, search
Article Metadata

Статья
Перевод:
Den123
Последнее редактирование: hamishwillee (27 Sep 2012)

Стандартные диалоги

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="";
};
}
};
}

Диалог будет выглядеть следующим образом:

LandmarkInfo.PNG

Внеутренние ссылки

This page was last modified on 27 September 2012, at 07:27.
72 page views in the last 30 days.
×