Namespaces

Variants
Actions

Please note that as of October 24, 2014, the Nokia Developer Wiki will no longer be accepting user contributions, including new entries, edits and comments, as we begin transitioning to our new home, in the Windows Phone Development Wiki. We plan to move over the majority of the existing entries over the next few weeks. Thanks for all your past and future contributions.

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

From 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 04:27.
232 page views in the last 30 days.

Was this page helpful?

Your feedback about this content is important. Let us know what you think.

 

Thank you!

We appreciate your feedback.

×