Aug
28

Первое приложение для Windows Mobile на C++/wxWinCE

Google Buzz

В прошлый раз я рассказывал о том как собрать библиотеку wxWinCE для разработки приложений для Windows Mobile.

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

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

  • $(WXWIN)/lib/evc_armv4_lib для платформы PocketPC 2003
  • $(WXWIN)/lib/evc_armv4t_lib для платформы Windows Mobile 6

Для начала нам необходимо создать новый проект. Для этого в Visual Studio выбираем пункт меню File -> New -> Project… В диалоговом окне создания нового проекта переходим в раздел Visual C++ -> Smart Device и указываем тип проекта Win32 Smart Device Project.

В мастере настройки свойств проекта выбираем платформы, для которых нам необходимо собрать наше приложение.

В разделе Application Settings выбираем тип проекта Windows Application и в Additional Options устанавливаем маркер на Empty Project.

Жмем Finish.

В созданный проект добавляем новый cpp-файл и пишем в нем следующее:

#include 

class wxWinCETestMainFrame : public wxFrame
{
protected:
        void OnExit(wxCommandEvent & event)
        {
                Close();
        }
public:
        wxWinCETestMainFrame()
                : wxFrame(NULL, wxID_ANY, _("wxWinCE Test"))
        {
                wxMenuBar * menuBar = new wxMenuBar;
                wxMenu * fileMenu = new wxMenu;
                fileMenu->Append(wxID_EXIT, _("Exit"));
                menuBar->Append(fileMenu, _("File"));
                SetMenuBar(menuBar);

                Connect(wxID_EXIT, wxEVT_COMMAND_MENU_SELECTED,
                        wxCommandEventHandler(wxWinCETestMainFrame::OnExit));
        }
};

class wxWinCETestApp : public wxApp
{
public:
        virtual bool OnInit()
        {
                wxWinCETestMainFrame * frame = new wxWinCETestMainFrame;
                SetTopWindow(frame);
                frame->Show();
                return true;
        }
};

IMPLEMENT_APP(wxWinCETestApp)

Открываем окно свойств проекта, переходим в раздел C/C++ -> General и в список каталогов для поиска заголовочных файлов (Additional Include Directories) добавляем следующие значения:

  • Для платформы PocketPC 2003
    • Debug
      • $(WXWIN)\include
      • $(WXWIN)\lib\evc_armv4_lib\winced
    • Release
      • $(WXWIN)\include
      • $(WXWIN)\lib\evc_armv4_lib\wince
  • Для платформы Windows Mobile 6
    • Debug
      • $(WXWIN)\include
      • $(WXWIN)\lib\evc_armv4t_lib\winced
    • Release
      • $(WXWIN)\include
      • $(WXWIN)\lib\evc_armv4t_lib\wince

В разделе Linker -> General в свойстве Additional Library Directories дописываем путь к статическим библиотекам wxWinCE:

  • $(WXWIN)\lib\evc_armv4_lib для платформы PocketPC 2003
  • $(WXWIN)\lib\evc_armv4t_lib для платформы Windows Mobile 6

В разделе C/C++ -> Code Generation устанавливаем свойство Enable C++ Exceptions в No (то же значение что и в проекте самой библиотеки wxWinCE) и для каждой конфигурации каждой платформы значение свойства Runtime Library устанавливаем в то значение, которое оно имеет в проекте библиотеки wxWinCE. Значение обоих этих свойств у нашего проекта и у проекта библиотеки должны быть одинаковыми.

В разделе C/C++ -> Preprocessor значение свойства Preprocessor Definitions для каждой конфигурации для каждой платформы устанавливаем то, которое оно имеет в проекте библиотеки wxWinCE. Лучше всего значение этого свойства скопировать с одного проекта в другой.

Теперь нам необходимо добавить в проект файл ресурсов (.rc) и в нем прописать следующее:


#include 

Это очень важный шаг настройки проекта, но о нем очень часто забывают. Зачем же это нужно? Затем что файл wx/msw/wx.rc содержит описание некоторых ресурсов приложения, которые используются при создании строк меню и панелей инструментов. Если этот файл не включить в сборку, то при создании строк меню будут постоянно возникать ошибки.

После того, как мы добавили файл ресурсов, в свойствах проекта идем в раздел Resources -> General и в Additional Include Directories добавляем значение $(WXWIN)\include.

Ну вот, но этом настройка проекта завершена. Можно собирать наше приложение.

После того как приложение успешно собрано, мы должны получить что-то подобное:

Скриншот минимального приложения для wxWinCE

Скриншот минимального приложения для wxWinCE

Мы получили приложение с одной формой, у которой есть меню с единственным пунктом Exit, при выборе которого приложение закрывается.

Напоследок хотелось бы сказать вот что: процесс настройки проекта на первом этапе знакомства с wxWidgets может показаться довольно сложным, но так кажется только вначале. Сам же процесс написания кода, добавления новых компонентов на формы, создание обработчиков событий довольно прост, намного проще чем с использованием MFC, особенно если для создания графического интерфейса использовать DialogBlocks, о котором я расскажу в следующий раз.

Еще интересные посты о программировании для мобильных устройств:

53 Comments

Make A Comment
  • tramontana Said:

    Спасибо, статья понравилась. Мне как начинающему очень полезна. Хотелось бы побыстрее продолжение.
    Осталось несколько вопросов:
    1. в строке 06 – скорее всего закралась ошибка при преобразовании исходника “в текст с подсветкой”. У меня “void OnExit(wxCommandEvent &event)”, иначе ошибки.

    2. При сборке выдает 262 ошибки типа “Error 9 error LNK2019: unresolved external symbol “public: void __cdecl wxStringData::Free(void)” (?Free@wxStringData@@QAAXXZ) referenced in function “public: void __cdecl wxStringData::Unlock(void)” (?Unlock@wxStringData@@QAAXXZ) main.obj”
    Кажется не линкует mono.lib. Хотя сделал все по шагам.
    Добавил:
    #ifdef DEBUG
    #pragma comment (lib,”monod.lib”)
    #else
    #pragma comment (lib,”mono.lib”)
    #endif
    Сборка прошла успешно.
    Поясните пожалуйста по этому вопросу, что я сделал не так.

    3. Размер файла в release версии 872 кб, это нормально? Пустой (аналогичный) проект на MFC занимает гораздо меньше.

  • T-Rex Said:

    1. Спасибо, исправил

    2. У меня библиотека для Debug называется wx_monod.lib а для Release wx_mono.lib По умолчанию в проекте wxWidgets указано название wx_mono.lib для обеих конфигураций, поэтому надо внимательно смотреть чтобы названия были корректными

    3. Да, 872 это нормально, за удобство приходится платить вот таким образом, размером исполняемого файла. Но тут можно исполняемый файл например UPX’ом запаковать, на сколько я помню, он ARM-архитектуру поддерживает.

  • slav0nic Said:

    не знал что wx и до кпк добрался
    обидно что нет нормальных примеров – фреймворков (хотя wx можно им назвать) для реализации полноценной MVC концепции на базе wx

  • T-Rex Said:

    MVC? А для каких задач? Можно ведь и что-то самописное наколбасить.

  • Mobile Developer» Blog Archive » DialogBlocks - Странный но очень удобный способ создания интерфейса пользователя для Windows Mobile Said:

    [...] Последние комментарии T-Rex commented on Первое приложение для Windows Mobile на C++/wxWinCE [...]

  • Игорь Said:

    Для PocketPC скомпилилось и заработало, а вот для M$Smartphone не находит commdlg.lib….

  • Игорь Said:

    ЗЫ: Эт я полпытался под смартфон слинковать с либой скомпиленой под PPC. Ща побилжу либу под смартфон – посмотрим чё выйдет…

  • T-Rex Said:

    Эээ.. а ты директивы препроцессора скопировал из проекта wx_mono в тестовую прилогу под Smartphone-платформу? Я под Smartphone вроде не собирал. В общем для каждой платформы директивы препроцессора свои и надо из проекта wx’овых библов их в точности копировать. И не забудь везде поубирать галки про C++ exceptions, как в библе так и в проекте

  • Игорь Said:

    Побилдил либину под смартфон – проект слинковался и заработал на эмуляторе смартфона *YAHOO*.

    Никаких больше настроек не менял.

    Осталось выяснить, получится ли бинарь побилженый, скажем, для PPC, запустить на MSP…

  • Игорь Said:

    ЗЫ: Я юзал не 2.8.8, а 2.8.9
    там ещё пофиксить малость надо для того, чтобы либа собиралась.

  • Игорь Said:

    ЙО! Бинарь, побилжженый под MSP отлично заработал на PPC.
    Ну всё, срочно перехожу на wxWidgets, а WTL идёт в пень :-D

  • T-Rex Said:

    WTL по-своему хорош, он маленький. Зато у wxWidgets скорость разработки быстрее.. Тут лучше сразу определиться что приоритетнее. Есть определенный ряд утилит, которые, если бы они весили, допустим, метр, я бы никогда не поставил.

  • Игорь Said:

    Ну вобщем да… дебажный бинарь весит за два метра..это не есть гут… посмотрим, сколько это всё в релизе весить будет, када у меня руки дойдут

  • Игорь Said:

    Так же, как и в WTL, у SpinButton нету фокуса :(
    Т.е. на смартфонах этот контрол бессмысленен. Есть у кого какие идеи на сей счёт?

  • T-Rex Said:

    Мм.. ну так SpinButton ведь в обоих библиотеках используется нативный, который в ОС идет как стандартній контрол. Можешь попробовать поиспользовать Generic-версию контрола в wxWinCE, она owner-drawn и если вдруг фокус не ловит, то
    - 1. можно доработать напильником.
    - 2. можно доработать напильником навигацию по форме, есть событие navigate event в wxWidgets.

  • Игорь Said:

    Доработать напильником можно было и WTL….
    эх… зря я радовался :’(

  • Игорь Said:

    generic-версия spin’а, как я понял, не для семейства виндов :(

  • T-Rex Said:

    Ну, GUI на платформе Smartphone 2003 меня вобще вводит в ступор под эмулятором, тут уж спасибо разработчикам :)

  • Marlboro Said:

    Вылезли вот такие грабли (при компиле вот этого примера):
    1>LINK : fatal error LNK1104: cannot open file ‘ccrtrtti.lib’
    Добавление в проэкт через директиву этого либа ведет к ошибкам, а если перечислить путь к ней в опциях компиляции – к очень большому количеству ошибок.

  • T-Rex Said:

    http://support.microsoft.com/kb/830482

  • Marlboro Said:

    Во! В том-то и дело, я по этому документу делал, все равно сообщает, что в модулях порядка 500 ерроров.

  • T-Rex Said:

    Проверь чтобы у проекта wx_mono (ну и у остальных wx’овых библиотек) и у твоего проекта біли одинаковіе настройки C/C++ -> Code Generation. В идеале вобще RTTI там надо отключить

  • Marlboro Said:

    Я совсем уже не понимаю эту библиотеку.
    В опциях приложения c/c++ -> language : enable Run-time type info – no (/GR-)
    Настройки Code Generation выставлены абсолютно одинаково.
    И все равно требует библиотеку (точнеее пишет, что не может зацепить)

  • T-Rex Said:

    И все равно требует библиотеку (точнеее пишет, что не может зацепить)
    Что конкретно пишет?

  • Marlboro Said:

    “>LINK : fatal error LNK1104: cannot open file ‘ccrtrtti.lib’”
    Если отключить RTTI.

  • T-Rex Said:

  • Marlboro Said:

    T-Rex, Вы не поверите… Видимо неправильно сложились звезды или еще чего-то… Но единственное что пришлось изменить по инструкции, было Additional Dependencies, и то, Студия лишь попросила собрать wx_wxpngd.lib и все вернулось в тоже состояние после сборки. Упорно твердит
    “>LINK : fatal error LNK1104: cannot open file ‘ccrtrtti.lib’”

  • T-Rex Said:

    Выложил wxWinCE проекты все и проект сампла
    http://depositfiles.com/files/ricvdw0dd

  • Marlboro Said:

    Итак. Удачно собрал все библиотеки (из поста выше), собираю проэкт – та же ересь лезет.
    Снес студию, поставил из другого дистриба. Библиотеки собрались так же просто. Пример тоже собрался (при этом с пятого раза и так каждый раз теперь после модификации кода, удачный билд только после 7го F7). Хоть это и не очень, но уже радует.

    Однако полностью отсутствует меню (в примере) и единственное что делает приложение это запускается. Ни заголовка, ни чего другого нет. Как на эмуляторе так и на железяке.

    Внемлю о помощи, а то видимо придется плевать на эту библиотеку и быстренько учить Шарп…

  • T-Rex Said:

    Эээ.. если нету меню, значит не заинклудил wx/msw/wx.rc в ресурсы. Если нету строки заголовка то или у окна нет стиля для заголовка… или одно из двух.
    Если хочешь, можешь сделать учетку в LogMeIn, я могу тебе собрать библу на твоей машине удаленно (можешь сделать VMWare тачку, поставить туда студию и распаковать wx, и потом дать доступ к ней через LogMeIn), там в общем-то 15 минут.

  • Marlboro Said:

    Однако…
    Спасибо, помогло. Только добавление в ресурсный файл проэкта ни к чему как не приводило, так и не привело. Я просто добавил в ресурсы wx.rc, собралось.

  • Marlboro Said:

    T-Rex, не подскажешь? Возникли такие грабли: Пытаюсь юзать сокет. И грабли встают тут же.
    Сообщает что “error LNK2019: unresolved external symbol WSAStartup” – хотя прописан winsock2.h и даже специально сверялся с MSDN и сэмплами к WM6 SDK вызываются так же. Хотя не работает…

  • T-Rex Said:

    http://msdn.microsoft.com/en-us/library/aa921082.aspx

    При чем здесь .h к тому что твоя прога не знает откуда функцию брать? .lib файл укажи

  • rrock.ru Said:

    Заметил одну проблему – перешения не нашел.. при вызове menuBar->SetLabelTop не происходит изменение заголовка меню.. при этом если использовать menuBar->GetLabelTop то функция возвратит установленное значение…

  • Marlboro Said:

    Мда, совсем тупым чебя чувствую. Слона и не заметил..

  • rrock.ru Said:

    Все.. на мой вопрос можете не отвечать.. уже разобрался

  • al.zatv Said:

    трабл возник. собранные wxWinCE под платформу PocketPC 2003 нормально работают под эмулятором, но глючат на WM5-устройстве. А именно, не показывают диалоговых окошек, причём как показанных с помощью

    wxMessageDialog(0,L”hi!”).ShowModal();

    так и сделанных через меню в примере wxFileDownloader.
    Вообще, похоже, меню там не работает или ещё что?

  • T-Rex Said:

    Ммм.. вобще не отображаются? А wx/msw/wx.rc в проект добавлен?
    Вобще есть определенные проблемы при отображении форм в различных SDK поэтому бывает ингода лучше собирать отдельную версию под каждую платформу (отдельный бинарий для WM2003/5/6), но так чтобы вобще не отображалось, такого не помню.
    Ну и wxMessageDialog(0,L"hi!").ShowModal(); – некрасиво. Чем wxMessageBox() не устроило?

  • al.zatv Said:

    Да, wx/msw/wx.rc добавлен. А wxMessageDialog там или wmMessageBox ему, кажется,всё равно – он ни в один из менюшных обработчиков даже не входит.

    А у моих бинарников,собранных для wm5 – точно та же проблема. Меню не работает ни в эмуляторе вм5, ни на устройстве. Похоже, проблема где-то в ДНК:)

    Использую wxWinCE 2.8.10 и ms visual studio team edition 2008.

  • al.zatv Said:

    (для гуглящих: проблема из предыдущего поста решилась откатом с wxwinCE 2.8.10 на 2.8.9. Причину не изучал)

  • al.zatv Said:

    У меня вопрос чайниковский возник по поводу присоединения обработчиков сообщений с помощью Connect. Как они там в таблицах сообщений определяют, метод какого конкретно объекта вызывать?

    Например,вот у меня есть окно типа MyFrame и второе окно XOtherFrame. Внутри MyFrame сидит панелька и я этой панельке OnPaint пересылаю “в другое место” вот так:
    bool MyFrame::OnInit() {
    myPanel1->Connect(wxEVT_PAINT,wxPaintEventHandler(XOtherFrame::MyOnPaint));
    return true;}

    И потом в XOtherFrame::MyOnPaint обращаюсь к каким-то членам XOtherFrame. При этом я ведь не указал в Connect’е конкретный экземпляр XOtherFrame’а, который будет это всё подбирать и обрабатывать! Бред получится, выходит?

  • T-Rex Said:

    myPanel1->Connect(wxEVT_PAINT,wxPaintEventHandler(XOtherFrame::MyOnPaint));

    не делай так. Это неправильно. Хочешь общую функцию для отрисовки – сделай класс рендерера и его вызывай. Хочешь кастомный обработчик отрисовки для панели – отнаследуй от нее свой контрол и там сделай обработчик. А то у тебя в коде каша получается.

    И потом в XOtherFrame::MyOnPaint обращаюсь к каким-то членам XOtherFrame.
    И вот поэтому получается каша потому что в MyOnPaint у тебя this будет указывать не на объект XOtherFrame а на объект myPanel1 (я так понял это объект другого класса).
    Бред получится, выходит?
    Угу. именно.
    Я вроде постил где-то, кажись на forum.vingrad.ru как вешать обработчики другого класса к объектам.

  • al.zatv Said:

    А вот чего ещё хотел спросить: как ловить длинное нажатие стилуса? Сделал скролируемое окно, а оно на него никак не реагирует, даже не рисует зелёный кружочек вокруг точки нажатия стилусом.

  • T-Rex Said:

    Так а длинное нажатие стилуса обрабатывается как нажатие правой кнопкой. А “скроллируемое окно” это какой именно контрол в данном случае?

  • al.zatv Said:

    > Так а длинное нажатие стилуса обрабатывается как нажатие правой кнопкой.

    Не, чего-то не обрабатывается. И зелёных “часиков” не появляется когда долго держишь.

    >А “скроллируемое окно” это какой именно контрол в данном случае?

    wxScrolledWindow поверх wxFrame’а

  • T-Rex Said:

    Может запостишь код на http://paste.org.ru как ты контролы создаешь на форме и в сайзеры добавляешь?

  • Gornostai Said:

    Не могу разобраться с проблемой описаной в первом посте. Выдает 262 ошибки. Делал все по описанию несколько раз, но результат тот же. Что сделать чтоб ошибок не было?

  • T-Rex Said:

    Выкладывай билд лог сюда.

  • Gornostai Said:

    260 ошибок типа:
    proj.obj : error LNK2001: unresolved external symbol “protected: static class wxAppConsole * (__cdecl* wxAppConsole::ms_appInitFn)(void)” (?ms_appInitFn@wxAppConsole@@1P6APAV1@XZA)
    На сколько я понял проблема с библиотеками mono & monod?

  • T-Rex Said:

    да. похоже на то. дай весь билд лог? Точно настройки приложения совпадают во всех вкладках с настройками собранной wx? А VS знает откуда брать wx_monod.lib ?

  • T-Rex Said:

    Судя по билдлогу http://paste.org.ru/?36jcm0
    ты забыл линкеру скормить lib файл

  • Gornostai Said:

    Еще раз собрал библиотеку и проект приложения по пунктам из твоих постов. Build log скинул на paste.org.ru. Ошибки те же , a в linker->general->additional library directories = “$(WXWIN)\lib\evc_armv4t_lib”
    Как именно нужно скормить линкеру lib файл?

  • T-Rex Said:

    Linker -> Input -> Additional Dependencies – добавить wx_monod.lib

Comments RSS Feed   TrackBack URL

Leave a comment

Please leave these two fields as-is:
календарь венчания 2010 ; Видеонаблюдение, сигнализация: Видеонаблюдение. Ищешь Видеонаблюдение? ; Заявка на полис ОСАГО - полис осаго. ; Анал негритянки видео бесплатно.

top