Авторские статьи Пишем софт для КПК сами

Discussion in 'Статьи' started by Pr0mo, 2 Sep 2010.

  1. Pr0mo

    Pr0mo Member

    Joined:
    26 Nov 2009
    Messages:
    29
    Likes Received:
    31
    Reputations:
    4
    1. Предисловие

    Как можно заметить из количества моих постов - я молчалив, а это моя первая статья. Очевидно многим она ничего нового не расскажет, однако нельзя забывать, что по форуму "гуляют" новички. Итак, если у тебя есть КПК и ты устал качать и искать нужный тебе софт под своего зверька, пора задуматься: А не попробовать ли написать его самому?!


    2. Приступаем

    Скажу сразу - на моем КПК установлена Windows Mobile 6 (WM6) и в качестве тестового плацдарма выступает именно она. Однако безусловно подойдет и более раняя версия WM5. Не будем рассматривать поздние ОС (Windows CE X.XX, Pocket PC 200x) - они устарели и в новых КПК их конечно же не стоит.
    Конечно программирование под КПК, как и под ПК предполагает знание Вами хотя бы одного из языков программирования: C++, C#, VB.NET. Я предпочитаю C#.NET. Для меня он более удобен и, что немаловажно, прост. Поэтому и новичкам я советую поиграться с ним для начала, а уж если и надумаете далее писать что-то серьезное (к примеру системные вещи) - перейдете на C++. Но не пугайтесь, если программирование для Вас еще темный лес, сейчас Вы увидете на сколько оказывается это просто и для КПК.

    Для старта у нас на ПК должны быть установлены:

    * В статье используется русскоязычная Visual Studio. Вы можете использовать и англоязычную, но прийдется искать в меню аналоги перевода с английского на русский.


    Примечательно то, что в Visual Studio уже встроен эмулятор устройства КПК. Поэтому работать можно что называется "неотходя от кассы", а протестированный вариант программы уже потом загрузить на КПК и довольствоваться проделанной работой. Тем не менее у эмулятора есть ряд ограничений:

    • Протокол связи с внешними устройствами только TCP/IP
    • Поддерживает только один процессор x86
    • Не поддерживает контактный экран (да и не особо нужно)
    • Нет записи звука
    • Поддерживает только английскую раскладку (На мой взгляд самое весомое ограничение)


    3. Простой пример

    От слов к делу. Запускаем Visual Studio. Если это Ваш первый запуск, то выбираем запуск Visual Studio c обычными параметрами. Создаем новый проект: Файл -> Создать -> Проект... . В левом углу раскрываем тип проекта Visual C# -> Смарт-устройство. В правом углу выбираем шаблон: Проект интеллектуавльных устройств. Снизу можно задать имя проекта и указать в какой папке он будет сохранен и нажимаем Ок. (см картинку).

    [​IMG]

    Далее видим диалоговое окно добавления нового проекта. В качестве конечной платформы выбираем Windows Mobile 5.0 Pocket PC SDK, а версию фреймворка поставим .Net Compact Framework 2.0. Из шаблонов выбирем: Приложение для устройства. Жмем Ок.

    [​IMG]

    И перед нами окно разработки приложения. Слева редактируем форму, справа список подключенных модулей. Почти вся работа может осуществлятся редактированием формы: Добавил компонент и обработал его событие. Вот и сейчас давайте просто добавим кнопку (Button) из выдвигающейся панели инструменов, кидаем на форму, дважды кликаем, чтобы обработать ее нажатие и попасть в область редактирования кода. Впишем всеми любимый и простой "Hello world!"
    Code:
    private void button1_Click(object sender, EventArgs e)
            {
                MessageBox.Show("Hello world! This is antichat!");
            }
    
    После этого в меню выбираем Построение -> Построить решение (или же Ctrl+Shift+B). Таким образом Вы откомпилируете написанный программный код и все модули соберутся воедино. Если все сделано правильно (а разве можно в таком простом примере ошибиться?) в выводе (в нижней части Visual Studio) будет написано что-то вроде:
    Компиляция завершена -- ошибок: 0, предупреждений: 0
    SmartDeviceProject1 -> C:\Users\Admin\Documents\Visual Studio2005\Project\SmartDeviceProject1\SmartDeviceProject1\bin\Debug\SmartDeviceProject1.exe
    ========== Построение: успешно и без изменений: 1, с ошибками: 0, пропущено: 0 ==========​

    В принципе уже готовый SmartDeviceProject1.exe файл можно искать в папке сохранения. Но давайте сэмитируем запуск не на ПК, а на КПК.
    Для этого в меню: Отладка -> Начать отладку. И в новом диалоговом окне выбираем эмулятор: USA WM 5.0 Pocket PC R2 Emulator. Нажимаем кнопку Развернуть.

    [​IMG]

    Некоторое время эмулятор будет подготавливать все для запуска программы, после чего появится окно программы (форма). Нажимаем на нашу кнопку и в результате выдается сообщение: Hello world! This is antichat! То есть эмулятор сэмитировал нажатие по сенсорному экрану, как Вы бы это делали стилусом, пальцем или еще чем :)



    4. Подключаем фантазию

    По большому стчету на простом примере можно было и закончить статью, ведь дальше все ограничивается знанием языка C#. Однако я приведу еще тоже довольно простой пример, демонстрирующий как легко и быстро можно писать полезные для себя вещи.
    Как-то была у нас в универе (на лекциях же скучно) была игра в слова. Ну та самая игра, где из большого слова нужно как можно больше составить мелких. Однокурсники долго не понимали откуда я знаю столько слов и все время выигрываю, пока я не раскрыл секрет. Дак вот, была написана простенькая программа для КПК, которая все это делала за меня и вот её не сложный код (обработка клика кнопки Start):


    Code:
     private void menuItem1_Click(object sender, EventArgs e)
            {
                int count;
                bool found;
                int k;
                String InWord;
                char letter;
                FileStream stream = null;
                StreamReader reader = null;
                String DicPath;
    
                // DicPath = "dic.txt";
                // if (openFileDialog1.ShowDialog() == DialogResult.OK)
                //     DicPath = openFileDialog1.FileName;
    
                DicPath = AppPath + "Dictionaries\\" + comboBox1.SelectedItem; //указываем директорию к словарю 
                count = 0; // Найдено 0 файлов изначально
                listBox1.Items.Clear(); //Очищаем список найденных слов
                if ((textBox1.Text != String.Empty) && (comboBox1.SelectedIndex >= 0)) // Если поля ввода заполнены
                {
                    try
                    {
                        stream = new FileStream(                              // Открываем файл для чтения
                            DicPath, FileMode.Open, FileAccess.Read,
                            FileShare.Read
                        );
                        reader = new StreamReader(stream, Encoding.Default); // Reader читает из потока данные 
    
                        // Или иначе можно так:
                        // reader = new StreamReader(args[0]);
                        // reader = File.OpenText(filename);
    
                        String line = reader.ReadLine(); //Читаем первую строчку-слово из словаря
                        while (line != null) // Так сказать, если не конец файла, читаем в цикле все остальное
                        {
                            InWord = textBox1.Text; // Введенное слово
                            found = false;
                            for (int i = 0; i < line.Length; i++) // В цикле смотрим, есть ли в прочитанном слове те же буквы, что и в введенном, 
                                                                    //если да, то слово найдено
                            {
                                letter = line[i];
                                if (checkBox1.Checked)
                                {
                                    if (Convert.ToString(line[i]) == "й")  //Так же учитываем "и" за "й" и "е" за "ё" при необходимости
                                        letter = Convert.ToChar("и");
                                    if (Convert.ToString(line[i]) == "ё")
                                        letter = Convert.ToChar("е");
                                }
                                k = InWord.IndexOf(letter, 0, InWord.Length);
                                if (k >= 0)
                                {
                                    found = true;
                                    InWord = InWord.Remove(k, 1);
                                }
                                else
                                {
                                    found = false;
                                    break;
                                }
    
                            }
                            if (found)
                            {
                                if (line != textBox1.Text)
                                {
                                    count++; 
                                    listBox1.Items.Add(line);
                                }
                            }
                            line = reader.ReadLine();
                            Application.DoEvents();  // Чтобы приложение не зависало во время выполнения цыкла
                        }
                    }
                    catch (Exception error)
                    {
                        MessageBox.Show(error.Message); // Обработка ошибок
                    }
                    finally
                    {
                        if (stream != null) // Обработка конца потока и закрытие его (файла)
                        {
                            stream.Close();
                            statusBar1.Text = "Найдено : " + Convert.ToString(count); // Выводим количество найденных слов
                        }
                    }
                }
                else
                    MessageBox.Show("Не все данные введены!");
            }
    Полный исходный код проекта в купе со словарем можно скачать ТУТ

    5. Заключение


    Конечно в статье всего не расскажешь и не покажешь, я лишь указал Вам направление, потому как, возможно, имея КПК и некоторое представление о программировании, Вы и не задумывались о наполнении его своими "фенечками". Если говорить о том, на сколько это перспективно и актуально - все зависит Вас. В интернете полно ПО для КПК, но за частую то, что приходится по душе мало. Спасибо за внимание.

    © Pr0mo
     
    #1 Pr0mo, 2 Sep 2010
    Last edited: 2 Sep 2010
    7 people like this.
  2. Derec

    Derec Elder - Старейшина

    Joined:
    8 Nov 2007
    Messages:
    74
    Likes Received:
    4
    Reputations:
    0
    Лучше бы с примером работы через сеть на КПК, можно было бы троянчика написать. А так статья гуд :)
     
  3. 0pTik

    0pTik Banned

    Joined:
    18 Jul 2010
    Messages:
    240
    Likes Received:
    85
    Reputations:
    17
    Хорошая статья
     
  4. dupD0M

    dupD0M Elder - Старейшина

    Joined:
    18 May 2010
    Messages:
    1,130
    Likes Received:
    74
    Reputations:
    34
    было бы не плохо если бы статейку про написание софта на смарты выложили!
     
  5. transserg

    transserg Elder - Старейшина

    Joined:
    2 Jul 2008
    Messages:
    147
    Likes Received:
    25
    Reputations:
    2
    все бы ничего но дот нет на КПК это все еще оч тормознуто. хотя в будующем думаю дело изменится.
     
  6. Pr0mo

    Pr0mo Member

    Joined:
    26 Nov 2009
    Messages:
    29
    Likes Received:
    31
    Reputations:
    4
    Сначала в статью хотел включить написание Hello world, но привел еще пример для большей информативности. Работа с сетью довольно сложное начало для новичка.

    Спасибо :)

    Хотел кстати в качестве продолжения и для Symbian написать, но по-моему видел что-то подобное на antichat уже.

    Используемый .Net Compact Framework - урезанная версия, как этого следовало ожидать и она специально создавалась из расчета мощностей КПК. Конечно на слабеньких КПК тормоза заметны (коих на ПК вообще нет). Поэтому лаги уменьшаются пропорционально увеличению мощности КПК (на прилавки поступают более новые и мощные). Есть еще один выход, чтобы избежать ресурсоемкости - писать ПО на C++ :)
     
    1 person likes this.
  7. Keltos

    Keltos Banned

    Joined:
    8 Jul 2009
    Messages:
    1,558
    Likes Received:
    920
    Reputations:
    520
    выкладывай для примера.
     
  8. Liv13

    Liv13 Active Member

    Joined:
    23 Jun 2009
    Messages:
    60
    Likes Received:
    171
    Reputations:
    40
    да полезная статейка))
     
  9. Bers

    Bers Member

    Joined:
    17 May 2010
    Messages:
    78
    Likes Received:
    30
    Reputations:
    26
    Вообще-то эмулятор идет в составе Windows Mobile SDK. Т.е. потребуется поставить еще и SDK.

    Не вполне ясно, при чем тут процессор. Эмулятор прекрасно работает на x64 двухядернике, а КПК с многоядерными процессорами мне лично неизвестны.
    А под контактным экраном подразумевается тачскрин или что? Если тачскрин - он прекрасно поддерживается, и он очень даже нужен.

    Вообще версия 3.5 на данный момент более актуальна. Хотя в принципе это не суть важно.

    А зачем вначале говорить про WM6, а потом брать эмулятор от WM5? Понятно, что обратная совестимость, но все-таки :)

    +10! У нас еще балда была :)

    Ужас. Это же делается гораздо проще:

    Code:
    letter = line[i];
    if (checkBox1.Checked)
    {
       // Так же учитываем "и"
       if(letter == 'й')
         letter = 'и';
       // Так же учитываем "ё"
       if(letter == 'ё')
         letter = 'е';
    }
    
    В твоем коде будут создаваться лишние строки, а это - нагрузка на GC.

    Чтобы приложение не зависало - переноси обработку в отдельный поток:
    Code:
    private void Button1_Click(object _, EventArgs e)
    {
       var text = TextBox1.Text;
       System.Threading.ThreadPool.QueueUseWorkItem(_ =>
       {
        // Process text there
       });
    }
    
     
  10. SwordMaster

    SwordMaster Banned

    Joined:
    12 Aug 2009
    Messages:
    98
    Likes Received:
    9
    Reputations:
    0
    отличная статья !
     
  11. Sajeys

    Sajeys Banned

    Joined:
    24 Aug 2010
    Messages:
    206
    Likes Received:
    35
    Reputations:
    5
    Весьма полезно...
    Как будет время попробуем-с)))