воскресенье, 28 февраля 2010 г.

Windows Mobile 6.5.3 DTK

Совсем Microsoft недавно представила в Барселоне новую платформу Windows Phone 7 Series, которая привлекла к себе внимание специалистов и простых пользователей. На фоне этого ажиотажа, как-то незаметно прошла новость о выходе новой версии Windows Mobile 6.5.3 DTK. А ведь там тоже есть несколько интересных новинок, которые уже доступны для разбработчиков Windows Mobile. Дальнейшие описания действительны для Visual Studio 2008 (для Visual Studio 2005 есть небольшие отличия).

Сначала несколько общих слов. В новом релизе Windows Mobile 6.5.3 DTK было добавлена новая документация, новые примеры, заголовки файлов и библиотеки и утилиты. А также добавлены новые образы эмуляторов под Windows Mobile 6.5.3. Не забывайте, что Windows Mobile 6.5.3 DTK необходимо устанавливать после установки Windows Mobile 6 SDK Refresh. При установке DTK ничего из состава SDK не удаляется и вы можете спокойно разрабатывать приложения как для Windows Mobile 6, так и для Windows Mobile 6.5.

Документация

Как и прежде, вся необходимая документация доступна на сайте MSDN. Но, с установкой Windows Mobile 6.5.3 DTK, вы получаете доступ к документации по Windows Mobile в виде локальной отдельной версии справки (Пуск Все программы Windows Mobile 6.5.3 DTK Documentation Windows Mobile 6.5.3 DTK Help). Это достаточно удобное решение, если у вас нет соединения с интернетом.

Пример Mobile Mapping Framework

В пакет Windows Mobile 6.5.3 DTK был добавлен новый пример, использующий Mobile Mapping Framework (папка ...\Samples\Common\CS\MMF). Что это такое и с чем его едят, я, честно говоря, не знаю. Если кто-то владеет информацией, то поделитесь, плиз.

Новый тип проекта - Widgets for Window Mobile

В Visual Studio 2008 появился новый тип проекта - Widgets for Window Mobile, позволяющий быстро создавать виджеты для Windows Mobile 6.5. О нем чуть ниже.

Образы эмуляторов

Вкусная новость - в состав Windows Mobile 6.5.3 DTK входят несколько новых эмуляторов для Windows Mobile 6.5.3. Я перечислю образы только для профессиональной версии (серия Standard мне не интересна, да и в продаже практически их нет):

  • Windows Mobile 6.5.3 Professional Emulator
  • Windows Mobile 6.5.3 Professional Square QVGA Emulator
  • Windows Mobile 6.5.3 Professional Square VGA Emulator
  • Windows Mobile 6.5.3 Professional VGA Emulator
  • Windows Mobile 6.5.3 Professional WQVGA Emulator
  • Windows Mobile 6.5.3 Professional WVGA Emulator

Новые сертификаты

Также были добавлены новые сертификаты, которые заменяют устаревшие сертификаты, у который сроки истекли в 2009 году. Новые сертификаты будут действительны до 2015 года и доступны в папке ...\Tools\Security\SDK Development Certificates. Так как я не пользуюсь сертификатами, то мне от этого ни горячо, ни холодно.

Новая утилита xHopper

Опытные разработчики знают о программе Hopper, помогающей тестировать приложения в стрессовых ситуациях. Теперь появилась еще одна утилита xHopper. По описанию, новой утилитой пользоваться стало еще удобнее. В ближайшее время я планирую изучить работу утилиты. Также вы можете найти дополнительную информацию о xHopper в документации к Windows Mobile 6.5.3 DTK, о которой говорилось выше.

Новый вид Windows Mobile 6.5.3

Посмотрим, что изменилось в Windows Mobile 6.5.3 по сравнению с Windows Mobile 6.5. Сразу хочу предупредить, что запустить отладку своей программы в Windows Mobile 6.5.3 не получится - в окне выбора эмуляторов при запуске отладки программы нужных версий эмуляторов вы не увидите. Поэтому, чтобы увидеть новую платформу, необходимо запустить менеджер эмуляторов (Tools Device Emulator Manager...) и в диалоговом окне выбрать нужный эмулятор.

Например, выберем Windows Mobile 6.5.3 Professional VGA Emulator (Actions Connect). Чтобы было легче сравнивать, запустим также эмулятор Windows Mobile 6.5 Professional VGA Emulator.

Первое, что бросается в глаза - кнопка Пуск стала большой и круглой и находится в нижней части экрана, как на десктопных Windows и напоминает кнопку Пуск в Windows 7, только в черно-белом варианте. Соответственно, и панель задач тоже находится внизу. Если вы запустите какую-нибудь программу, то увидите, что кнопка закрытия (крестик Х) тоже стала большой и круглой. Эти изменения очень удобны для пользователя, которому теперь проще дотянуться пальцами одной руки до часто используемых кнопок. Также я заметил, что в Windows Mobile 6.5.3 исчезла игра Bubble Breaker. Могу только предположить, что игра расчитана на использование пера, а это теперь считается дурным тоном (к сожалению).




Разработка виджетов

Теперь поговорим о разработке виджетов в Windows Mobile 6.5.3. Я уже затрагивал эту тему на своем сайте (http://developer.alexanderklimov.ru/winmobile/widget.php), а также на страницах Хакера. Тогда речь шла о ручном создании виджетов в текстовом редакторе. Теперь можно заниматься разработкой в привычной среде Visual Studio. После установки Windows Mobile 6.5.3 DTK в шаблонах проектов появится новый тип проекта - Widgets for Window Mobile. Я не сразу нашел этот тип на своем компьютере. По привычке я искал новый тип в разделе Smart Device, но там ничего нового не было. Сначала подумал, что DTK криво встала и хотел уже переставлять все заново. Но, к счастью, я вовремя заметил, что новый тип проекта находится в корневом разделе. Не повторяйте моих ошибок. Для примера я выбрал шаблон SimpleWidget, который содержит все необходимые файлы для создания простого виджета.


Когда проект загрузился в Visual Studio, то стало видно, что проект содержит значок в формате PNG, веб-страницу, конфигурационный файл XML, а также папки с сценариями JavaScript и стилями CSS.

Я стал щелкать по всем файлам, чтобы просмотреть их содержимое. И тут меня ждал приятный сюрприз - когда я щелкнул на файле config.xml, то открылось окно редактора Manifest Editor. Заполнить все поля в таком редакторе - дело нескольких секунд. Впрочем, вы можете выбрать из контекстного меню файла пункт View Source и вручную прописать все необходимые данные.


Второй сюрприз меня ждал, когда я решил запустить проект. Нажав на зеленый треугольник, я ожидал увидеть запуск стандартного эмулятора. Как бы не так! У меня запустился Internet Explorer с встроенным Widget Debugger for Windows Mobile 6.5.

В окне дебаггера можно поиграться с некоторыми настройками.

И, напоследок, даю бесплатный совет. Когда я попытался в сценарии JavaScript добавить для кнопок меню и сообщений слова на русском, то на выходе получил кракозябры. К моему удивлению, файл сценария хранился в ANSI-кодировке. Инструментов для настройки кодировки я не нашел, поэтому я просто открыл JS-файл в блокноте и пересохранил его в UTF-8. Visual Studio заметил, что файл был изменен во внешнем редакторе и спросил, нужно ли его открыть заново (да, нужно). После этого русские символы стали отображаться корректно.

Таким образом, используя новинки, пришедшие к нам с Windows Mobile 6.5.3 DTK, мы можем создавать и тестировать приложения для Windows Mobile 6.5.3. А также мы ждем новостей, как будет происходить разработка приложениий для Windows Phone 7 Series. Ждать осталось недолго.

вторник, 9 февраля 2010 г.

Получить информацию о BMP-файле

Если вам приходится работать с графическими файлами, то, возможно, у вас появится задача получить дополнительную информацию - узнать размеры файла, глубину цвета и т.п. Безусловно, вы можете загрузить картинку из файла на форму или подходящий элемент управления (PictureBox) и получить требуемую информацию. Но, предположим, ваш проект предназначен только для сбора информации о файлах. В этом случае загружать 10-мегапиксельный рисунок в форму неоправданно - получается слишком большой расход памяти. Есть другой способ получения нужной информации. О нем и пойдет речь сегодня.

Графические файлы являются бинарными файлами с определенной структурой. Так вот, в файле уже содержатся необходимые нам данные. Наша задача - уметь извлечь данную информацию. Не будем углубляться в технические детали форматов графических файлов. Достаточно знать, что, например, ширина картинки записана всегда в строго определенном месте от начала файла. Поэтому, нам нужно только открыть файл для считывания байтов, отсчитать нужное количество байт и получить необходимое число. Кстати, по такому принципу устроены не только графические файлы, но и многие другие файлы, например, музыкальные.

Но, вернемся к файлам BMP. В начале каждого файла в формате BMP идет так называемый заголовок файла. В документации он описывается структурой BITMAPFILEHEADER, которая имеет общую длину 14 байтов: три UInt16 и два UInt32. Нас не интересует данный заголовок, поэтому вы его должны просто проигнорировать. Таким образом в коде нам нужно открыть файл и пропустить 14 байт:

reader.ReadBytes(14);

Обратите внимание, что функцию sizeof в данном случае использовать нельзя. Функция sizeof работает только с неуправляемыми ресурсами. После структуры BITMAPFILEHEADER идет структура BITMAPINFOHEADER. Именно, в этой структуре хранится необходимая информация, которую необходимо извлечь (кстати, описание структуры можно найти в справочнике по функциям Windows API для Visual Basic). Вот как будет выглядеть код извлечения информации из файла:

private void ShowBMPInfo(String file)
{
FileStream fs = new FileStream(file, FileMode.Open);
BinaryReader reader = new BinaryReader(fs);

// Пропускаем заголовок файла (14 байтов)
reader.ReadBytes(14);

// Пропускаем размер структуры BITMAPINFOHEADER
reader.ReadUInt32();

// Получаем ширину и высоту
int width = reader.ReadInt32();
int height = reader.ReadInt32();

// опять пропускаем часть байтов
reader.ReadInt16();

// Получаем глубину цвета (битов на пиксел)
Int16 bitsPerPixel = reader.ReadInt16();

// Освобождаем ресурсы
reader.Close();
fs.Close();

// Выводим информацию
MessageBox.Show(width + " x " + height + " x " + bitsPerPixel);
}

private void button1_Click(object sender, EventArgs e)
{
ShowBMPInfo(textBox1.Text); // подставляем путь к файлу
}

Тут есть одна тонкость. Пропускаемые в коде байты на самом деле все равно считываются. Чтобы действительно перепрыгнуть через заданное число байтов, вы должны использовать методы и свойства объекта потока (stream object). Например, получить текущий поток через свойство BaseStream и пропустить первые 14 байтов можно так:


reader.BaseStream.Seek(14, SeekOrigin.Begin);

Кроме того, можно передвинуть внутренний указатель на заданное смещение от конца потока или от текущей позиции. Вот как пропустить короткое целое (2 байта):


reader.BaseStream.Seek(2, SeekOrigin.Current);

С учетом этих особенностей я написал второй вариант извлечения данных из файла.


private void ShowBMPInfo2(String file)
{
FileStream fs = new FileStream(file, FileMode.Open);
BinaryReader reader = new BinaryReader(fs);

// Пропускаем заголовок файла (14 байтов) без считывания
reader.BaseStream.Seek(14, SeekOrigin.Begin);

// Пропускаем размер структуры без считывания
reader.BaseStream.Seek(4, SeekOrigin.Current);

// Получаем ширину и высоту
int width = reader.ReadInt32();
int height = reader.ReadInt32();

// Пропускаем
reader.ReadInt16();

// Получаем глубину цвета (битов на пиксел)
Int16 bitsPerPixel = reader.ReadInt16();

reader.Close();
fs.Close();

// Выводим информацию
MessageBox.Show(width + " x " + height + " x " + bitsPerPixel * planes);
}

private void button2_Click(object sender, EventArgs e)
{
ShowBMPInfo2(textBox1.Text);
}

Толчком к написаню данного топика послужила статья из журнала MSDN за август 2002 года. Там же вы можете найти код для Visual Basic.NET.

Данный совет также будет помещен в раздел Графика на моем сайте.

Удачного вам программирования!