Как-то печально обстоят дела с отображением анимации на устройствах под управлением Windows Mobile. Искал решение на .NET Compact Framework, нашел на Stack Overflow. Там предлагают писать собственный контрол, который будет делить изображение на кадры и отображать их с заданной периодичностью. Там в ответах ссылка на статью в MSDN. Собственно, везде это решение рекомендуют, но мне оно как-то не очень понравилось ввиду того, что позволяет отображать только специально подготовленное изображение, что во многих случаях очень неудобно.

А вот для тех, кто пишет ПО для Windows Mobile на C++ с wxWinCE эта проблема решается намного проще, с помощью wxAnimationCtrl. Вобще никаких лишних телодвижений делать не надо:

void wxAnimateMobileMainFrame::OnOPENClick( wxCommandEvent& event )
{
	wxFileDialog * dlg = new wxFileDialog(this, wxFileSelectorPromptStr, wxEmptyString,
		wxEmptyString, _("GIF Files (*.gif)|*.gif"));
	if(dlg->ShowModal() == wxID_OK)
	{
		m_AnimationCtrl->LoadFile(dlg->GetPath());
		m_AnimationCtrl->Play();
	}
	dlg->Destroy();
}

Из полезных возможностей:

  • Загрузка GIF-изображений с любым количеством кадров
  • Поддержка различных интервалов задержки для различных кадров
  • Циклическое воспроизведение (прописывается в самом GIF-файле)

Оказывается, все-таки, для некоторых задач C++ пользовать удобнее (хотя все равно для меня остается загадкой почему в .NET CF этого функционала нет).

Исходный код примера можно загрузить здесь.

Previous ArticleNext Article
Технический директор IT-Dimension, компании-разработчика кросс-платформенного программного обеспечения

This post has 3 Comments

3
  1. под мобайл/СЕ успешно работает GDI+ которое умеет парсить гифы, так что написать свой контрол который показывает гифы не составит труда… или вы думаете вх либа по другому как-то работает?

    З.Ы. можно и ручками распарсить

  2. Ммм? Оно действительно работает по-другому как-то, точнее, загружает GIF-файлы с помощью своего Image Handler’а (который не только под Win работает), а потом wxAnimationCtrl по таймеру их руками-то и отображает, только в отличии от предложенного для .NET CF варианта с константным интервалом таймера, там интервал берется для каждого кадра из файла как прописано, т.е. более “правильный” вариант получается.

  3. в любом случае оно прасит анимириованный-гиф файл, иначе никак, в net CF или просто поленились это сделать или посчитали что это можно сделать и самому (я склоняюсь ко 2-му варианту), кстати и в .NET анимированный гифы вроде не работают

Leave a Reply

Your email address will not be published. Required fields are marked *

w.

wxYahooMaps – Библиотека для работы с Yahoo! Maps Image API

Странная вещь получается. А ведь нету нормальных библиотек для С++, работающих с online-сервисами карт. Все популярные сервисы предоставляют API для .NET, а С++, как мне кажется, незаслуженно обделяют своим вниманием.
И вот пару дней назад решил восполнить этот пробел. Выбор пал на сервис Yahoo! Maps, а если быть точным, то Yahoo! Map Image API, которое позволяет получить изображение карты, сформировав определенным образом REST (Representational State Transfer) запрос.

Ознакомиться с механизмом работы сервиса можно здесь. Сильно подробно описывать не буду, скажу только что смысл заключается в формировании URL, открыв который мы получим XML-файл с адресом изображения карты.

Необходимым условием для работы с Yahoo! Map Image API является наличие у приложения уникального идентификатора (Application ID), получить который можно здесь (кстати, я уже писал ранее что Maps API для Google Android тоже требует Application ID).

Итак, wxYahooMaps. Что это такое и как это работает: это wxWidgets-based библиотека, которая позволяет по указанным координатам (широта + долгота) или названию местности (улица/город/штат/почтовый код) получить изображение карты, в центре которого будет искомая точка. Библиотека загружает карты асинхронно и поддерживает многопоточную загрузку, что иногда бывает очень удобным.

Для того чтобы начать пользоваться wxYahooMaps достаточно выполнить несколько простых действий:

Создать объект класса wxYahooMap (желательно чтобы это был член класса формы или приложения, т.е. был доступен на протяжении всей работы программы):


wxYahooMap * m_YahooMap;

...

m_YahooMap = new wxYahooMap(this);

К форме, которая должна получать уведомления о состоянии процесса загрузки карт добавить обработчик события EVT_YAHOO_MAP_STATUS:


BEGIN_EVENT_TABLE( wxYahooMapsTestMainFrame, wxFrame )
...
EVT_YAHOO_MAP_STATUS(wxID_ANY, wxYahooMapsTestMainFrame::OnYahooMapStatus)
END_EVENT_TABLE()

void wxYahooMapsTestMainFrame::OnYahooMapStatus(wxYahooMapStatusEvent & event)
{
	if(event.GetInt() == 0)
	{
		wxBitmap * bmp = event.GetBitmap();
		if(bmp)
		{
			// Здесь работаем с изображением карты
			// После этого изображение надо удалить
			wxDELETE(bmp);
		}
	}
	else
	{
		// Обработать ошибку
	}
}

Теперь для того чтобы загрузить изображение карты необходимо указать необходимые параметры поиска и вызвать метод wxYahooMap::StartDownload()

void wxYahooMapsTestMainFrame::OnGOBUTTONClick( wxCommandEvent & event )
{
	TransferDataFromWindow();
	m_YahooMap->SetApplicationID(m_AppID);
	m_YahooMap->SetUsePosition(m_UsePosition);
	m_YahooMap->SetPosition(wxRealPoint(m_Longitude, m_Latitude));
	m_YahooMap->SetStreet(m_Street);
	m_YahooMap->SetCity(m_City);
	m_YahooMap->SetState(m_State);
	m_YahooMap->SetZIPCode(m_ZIPCode);
	m_YahooMap->SetImageType(wxYahooMap::IntToYahooMapImageType(m_ImageType));
	m_YahooMap->SetImageSize(wxSize(m_ImageWidth, m_ImageHeight));
	m_YahooMap->SetZoomLevel(m_ZoomLevel);
	m_YahooMap->StartDownloading();
}

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

На данный момент библиотека wxYahooMaps оттестирована под:

  • Windows Vista
  • Windows XP
  • Windows Mobile 2003 (PPC)
  • Windows Mobile 6.0

Проводится тестирование под Mac OS и Linux.
Исходный код можно загрузить из SVN-репозитория на Google Code. Там же можно загрузить исполняемый файл примера для Windows XP/Vista.

PS: Если кто-либо из читателей блога желает помочь в развитии проекта, можно оставлять свои контакты в комментариях. На данный момент требуется помощь в реализации работы с геокодером Yahoo!.

Р.

Работа с базами данных. Собираем SQLite для Windows Mobile

SQLite – это встраиваемый движок баз данных. Слово «встраиваемый» означает, что SQLite не использует парадигму клиент-сервер, то есть движок SQLite не является отдельно работающим процессом, с которым взаимодействует программа, а предоставляет библиотеку, с которой программа компонуется и движок становится составной частью программы. Это значит, что для своей работы SQLite не требует установки. Это, а также довольно простой набор API-функций, делает ее наиболее простым инструментом для разработки приложений, использующих в своей работе базы данных.

Чтобы начать работу с SQLite нам необходимо загрузить исходный код библиотеки с официального сайта http://sqlite.org. На официальном сайте SQLite есть возможность загрузить уже собранные бинарные версии библиотеки для Windows, Linux и Mac OS X. Но во-первых, Windows Mobile в списке платформ, для которых SQLite доступна в бинарном виде, отсутствует, а во-вторых, индейцы не ищут легких путей, да и при сборке SQLite со статической линковкой CRT библиотек можно избежать зависимости от Microsoft Visual C++ Runtime не таскать за собой дополнительные файлы.
Для работы лучше использовать версию исходного кода SQLite в виде одного файла. На сайте в разделе загрузок он имеет название sqlite-amalgamation-x_y_z.zip, где x, y, z представляют собой версию библиотеки.
Итак, начнем. Превым делом нам необходимо создать проект статической библиотеки. Для этого в Visual Studio выбираем пункт меню File -> New -> Project, идем в раздел Visual C++ -> Smart Device, выбираем тип проекта Win32 Smart Device Project, указываем имя проекта sqlite3, жмем OK.

Создаем проект SQLite3 для Smart Device в Visual Studio
Создаем проект SQLite3 для Smart Device в Visual Studio

После этого на экране появится мастер настройки параметров нового проекта. Идем в раздел Platforms и выбираем платформы для которых мы хотим собрать нашу библиотеку. Рекомендую выбирать все теоретически необходимые платформы, т.к. это намного проще чем потом добавлять их в проект с помощью Configuration Manager.
Выбираем платформы для сборки SQLite для Windows Mobile
Выбираем платформы для сборки SQLite для Windows Mobile

В разделе Application Settings указываем тип проекта Static Library и убираем маркер с Precompiled header, жмем Finish.
Выбираем тип проекта для сборки SQLite3
Выбираем тип проекта для сборки SQLite3

Теперь у нас есть пустой проект, в который нам нужно добавить исходный код из дистрибутива SQLite, а именно файлы sqlite3.h, sqlite3.c, sqlite3ext.h
После того как исходный код добавлен в проект, в Solution Explorer у нас должно получиться что-то подобное.
Вид Solution Explorer после добавления в проект исходного кода SQLite3
Вид Solution Explorer после добавления в проект исходного кода SQLite3

Это все. Об использовании SQLite я расскажу в своих следующих постах.