Как-то печально обстоят дела с отображением анимации на устройствах под управлением 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 *

С.

Скажите “нет” GAPI – Все что вам нужно знать об AllKeys и обработке нажатия клавиш в Windows Mobile

Games API (GAPI) это технология, которая позволяла приложениям для Windows Mobile 2003 быстро отрисовывать графику на экране. В ней также были функции, которые позволяли получать сообщения о нажатии клавиш, даже для тех, которые обрабатываются операционной системой Windows Mobile самостоятельно.

Графическая составляющая GAPI была заменена на DirectShow (которая позволяла использовать аппаратное ускорение) в Windows Mobile 5.0. В тоже время поддерживалась совместимость с GAPI для того чтобы старые приложения продолжали работать.

Большая часть материалов по GAPI была упразднена в документации к Windows Mobile 6.1, в то же время функции для обработки ввода были оставлены и приложения могли запрашивать обработку нажатия всех клавиш. Совместимость приложений поддерживалась и для этой версии

Все это меняется в новой версии Windows Mobile, в Windows Mobile 6.5. В то же время некоторые устройства все еще могут поддерживать GAPI, но поддержка и тестирование GAPI более не является необходимостью для производителей устройств и для мобильных операторов. Это значит что если приложение требует GAPI, оно может вызвать непредсказуемое поведение на устройствах с Windows Mobile 6.5.

Другим важным изменением является тот факт что для приема в Windows Marketplace for Mobile и для сертификации Designed for Windows Mobile необходимо чтобы приложение не зависело от GAPI.

Для замены функционала, предоставляемого GAPI, новая функция для работы с клавиатурой была введена в публичное API. Это функция AllKeys(). В этой ситуации с введением новой функции есть одна классная штука – она была доступна и ранее наряду с GAPI b на самом деле это API функция, оберткой над которой GAPI и являлась. Это значит что миграция на AllKeys() lолжна быть довольно простой и обратную совместимость можно будет поддерживать без проблем.

Миграцию на AllKeys() можно осуществить очень просто – заменой

  • GXOpenInput() на AllKeys(TRUE).
  • GXCloseInput() на AllKeys(FALSE).

Функция AllKeys() поддерживается для Windows Mobile 2003 и выше. Определена в Winuser.h

Пример использования:

// process checkbox

case IDC_ALL_KEYS_CHECK_BOX:

if (g_AllKeys == true)
{
    // Allow the OS to intercept some button presses
     AllKeys(FALSE);
    g_AllKeys = false;
    // set button state
    SendMessage(hwndCtl,BM_SETCHECK, BST_UNCHECKED,0);
}
else
{
    // Do not allow os to intercept button presses
    AllKeys(TRUE);
    g_AllKeys = true;
    //set button state
    SendMessage(hwndCtl,BM_SETCHECK, BST_CHECKED,0);
} 

Всю эту интересность я узнал из поста в Windows Mobile Team Blog. Эта статья является вольным переводом исходной.