"My cat, as it turns out, is an excellent debugger, and she has helped me solve a number of nasty bugs when I talked to her about them."
John Robbins, Debugging Applications, Microsoft Press, 2000
/* Моя кошка замечательно разбирается в программировании. Стоит мне объяснить проблему ей - и все становится ясно. */

Колокольчик для коровы

Вступление

Наигравшись в игру Guitar Hero, было решено использовать мобильный телефон в качестве особенного музыкального инструмента - колокольчика, который привязывают коровам, чтобы они не потерялись.

Программа очень проста. Мы тыкаем пером в разных местах сенсорного экрана, извлекая таким образом звуки разной громкости. Также в статье будет рассказано, как распространять созданное приложение на другие устройства Windows Mobile, чтобы можно было собрать собственную группу, играющих на колокольчиках. Кроме этого, приложение может подстраиваться под различные размеры экрана, масштабируя изображение.

Первые шаги

Для этого приложения использовался Windows Mobile 6 SDK, поэтому загрузите его в случае необходимости.

Итак, создадим новый проект для мобильных устройств Smart Device Project и выбираем платформу Windows Mobile 6 Professional SDK.

Изменение громкости

На данный момент в .NET Compact Framework для изменения громкости звука приходится прибегать к вызовам системным функциям API (неуправляемый код). Описание функций Windows API и использование технологии Pinvoke имеются в справочнике по функциям Windows API для .NET Framework. Мы создадим новый класс Audio и поместим в него все функции, связанные со звуком. Класс будет содержать функции для воспроизведения звуковых файлов и изменения громкости звука. Сначала рассмотрим пример воспроизведения звука. Так как мы будем воспроизводить звук из ресурсов, то воспользуемся объектом MemoryStream для преобразования последовательности байтов в поток. Также необходимо включить в проект пространства имен System.Media и System.Runtime.InteropServices.


private readonly SoundPlayer sp;

    public Audio(byte[] AudioResource)
    {
        sp = new SoundPlayer(new MemoryStream(AudioResource));
        sp.Load();
    }

    public void Play()
    {
        sp.Play();
    }

    public void PlayLoop()
    {
        sp.PlayLooping();
    }

    public void Stop()
    {
        sp.Stop();
    }

Теперь, чтобы обратиться к звуковому файлу в приложении, нужно сделать следующее:


private readonly Audio audio = new Audio(Properties.Resources.CowBellAudio);

Теперь займемся изменением громкости звука. Создадим методы-обертки get/set для вызовов PInvoke.


    [DllImport("coredll.dll")]
    private static extern int waveOutGetVolume(IntPtr hwo, out uint dwVolume);

    [DllImport("coredll.dll")]
    private static extern int waveOutSetVolume(IntPtr hwo, uint dwVolume);

    public static uint Volume
    {
        get
        {
            uint _volume;
            waveOutGetVolume(IntPtr.Zero, out _volume);
            return _volume;
        }

        set
        {
            waveOutSetVolume(IntPtr.Zero, value);
        }
    }

    public enum Volumes
    {
        OFF = 0,
        LOW = 858993459,
        NORMAL = 1717986918,
        MEDIUM = -1717986919,
        HIGH = -858993460,
        VERY_HIGH = -1
    }

Создание колокольчика

Для нашего приложения нужна картинка с настоящим колокольчиком. После поиска в интернете мы выбрали нужную картинку, а также присмотрели значок X для закрытия программы на сайте Famfamfam Silk.

Для удобства мы поместим наши изображения в ресурсы программы, чтобы облегчить его распространение. Для этого откроем меню Project | Properties (или щелкните правой кнопкой на имени проекта в Solution Explorer и выберите команду Properties).

В открывшемся окне выберите вкладку Resources, далее секцию Images, в которой нам понадобятся элементы Images и Audio.

Выбрав нужные разделы, щелкните кнопку Add Resource и выберите нужные файлы. Ссылаться на нужный ресурс очень просто.


Properties.Resources.cowBellImage;

Элементы на форме

Настроим внешний вид приложения. Установите свойство WindowState в значение Maximum, TopMost в True, MinimizeBox в False и FormBorder в None.

Поместите на форме два поля рисунков picCowbell и picClose и установите их фон в прозрачный цвет. Создадим код для события Click. Для элемента picClose это будет метод Close() для закрытия приложения.

Теперь создадим код для события MouseDown элемента picCowbell. Здесь мы будем определять уровень звука и воспроизводить звук. Для этого мы создадим объект Audio при создании формы, чтобы он был уже загружен в память.


private readonly Audio audio = new Audio(Properties.Resources.CowBellAudio);

private void picCowbell_MouseDown(object sender, MouseEventArgs e)
{
    Audio.Volumes value;
    switch ((int)Math.Round((e.Y / (Height * 1.0)) * 5))
    {
        //case 0: // implied with default;
        //case 1:
        default:
            value = Audio.Volumes.LOW;
            break;
        case 2:
            value = Audio.Volumes.NORMAL;
            break;
        case 3:
            value = Audio.Volumes.MEDIUM;
            break;
        case 4:
            value = Audio.Volumes.HIGH;
            break;
        case 5:
            value = Audio.Volumes.VERY_HIGH;
            break;
    }

    // no need to take the performance hit of changing the volume
    // if the values aren't different
    if( oldValue != value)
    {
        Audio.Volume = (uint) value;
        oldValue = value;
    }
    audio.Play();
}

Создание CAB-файла для установки

Щелкните правой кнопкой на решении в Solution Explorer или выберите меню File | New |Project. Далее выберите пункт Create a new solution или Add to Solution.

Для установки приложения из CAB-файла выберите Other Project Types, а затем Setup and Deployment | Smart Device CAB Project. Далее щелкните правой кнопкой на Application Folder и выберите Add, далее Primary Output.

В окне File System щелкаем правой кнопкой на File System on Target Machine и перейдите на Add Special Folder, где нужно выбрать Start Menu Folder.

Возвращаемся в Application Menu и щелкаем правой кнопкой на Primary output from Cowbell. Выберем Create Shortcut и перетащим ярлык в свою папку меню Пуск. Желательно переименовать ярлык для удобства.

Теперь вы можете построить свое решение, скопировать CAB-файл на устройство и установить разработанное приложение.

Перевод: Василий Котов и Александр Климов

Реклама

Online cryptocurrency exchanger