Sep
04

DialogBlocks – Странный, но очень удобный способ создания интерфейса пользователя для Windows Mobile

Google Buzz

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

Итак, запускаем DialogBlocks и создаем новый проект (File -> New Project…)

В мастере указываем название проекта и каталог, в котором будет создан файл проекта.

На вкладке настройки параметров класса приложения указываем имя класса приложения, а также задаем имена файлов, в которые будет записан код класса приложения.

На вкладке настройки кодировки проекта указываем кодировки для файла проекта, файлов исходного кода и файлов ресурсов. Лучше всего указать .

Отлично, проект создан и в него добавлен класс приложения. Теперь необходимо создать главное окно приложения. Для этого на панели инструментов жмем кнопку Element и в выпадающем меню выбираем пункт Add Frame.

В окне настройки параметров новой формы указываем имя класса формы и задаем имена файлов исходного кода для новой формы.

Теперь нам необходимо указать классу приложения, какая форма является главной. Для этого в дереве структуры проекта выбираем класс приложения и в окне настройки параметров в свойстве Main window указываем созданную ранее форму.

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

После того как компоненты добавлены, можно приступить к настройке их параметров.

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

Переходим на вкладку Sizer, выставляем значение свойства Stretch factor в 1, поле Border в 0 и убираем флажки напротив свойств wxLEFT, wxRIGHT, wxTOP, wxBOTTOM. После всех этих манипуляций наша панель будет занимать все свободное пространство на форме.

В дереве структуры проекта выбираем текстовое поле, в окне свойств текстового поля переходим на вкладку Main и свойству Member variable name задаем значение m_MyTextCtrl.

Переходим на вкладку Sizer и свойство Stretch factor выставляем в 1. Этим мы указываем что текстовое поле должно занимать все свободное место на панели.

В дереве структуры проекта по очереди выбираем пункты меню Open и Exit и для каждого из них на вкладке Event handlers добавляем обработчик события wxEVT_COMMAND_MENU_SELECTED. Это событие выбора пункта меню.

Далее переходим на вкладку cpp и пишем код обработчиков событий для пунктов меню.

void MyMainFrame::OnEXITClick( wxCommandEvent & event )
{
    Close();
}

void MyMainFrame::OnOPENClick( wxCommandEvent & event )
{
    wxFileDialog dlg(this);
    if(dlg.ShowModal() == wxID_OK)
    {
        m_MyTextCtrl->LoadFile(dlg.GetPath());
    }
}

На этом работа непосредственно в DialogBlocks для нас закончена. Сохраняем все и открываем Visual Studio. Создаем новый проект (о том как это сделать я писал ранее) и добавляем в него файлы с исходным кодом, которые были созданы с помощью DialogBlocks.

Настраиваем свойства проекта и все, можно собирать.

Да, тут вот еще какая штука. DialogBlocks отображает создаваемые окна так, как они выглядят в ОС, в которой ведется работа. Т.е. если вы работаете в десктопной версии Windows, то, например, строка меню будет находиться вверху формы, в то время как в Windows Mobile строка меню будет размещаться внизу. Это своего рода неудобство, но со временем на него перестаешь обращать внимание, т.к. строка меню не мешает размещению остальных компонентов на форме и никак на них не влияет.

Вот так выглядит созданная нами форма в дизайнере DialogBlocks.

А вот так она выглядит на устройстве.


Ну вот, собственно, и все.

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

17 Comments

Make A Comment
  • Dimon550 Said:

    Увы, что-то я наверное не так сделал(( Выдал:

    1>LINK : warning LNK4068: /MACHINE not specified; defaulting to X86

  • T-Rex Said:

    мм.. посмотри в habrasnake в настройках линкера на последней вкладке там внизу дополнительные параметры линкера. Надо чтобы были такие же.
    Или сделай скринов всех настроек компилятора и линкера и выложи куда-нибудь, может подскажу чего.
    А вобще надо просто чтбы у wxWidgets и твоего проекта настройки были одинаковые.

  • Dimon550 Said:

    “А вобще надо просто чтбы у wxWidgets и твоего проекта настройки были одинаковые.”

    Ну смотри: в предыдущей “серии” ты рассказал, как можно сотворить приложение, используя собранную библиотеку wxWinCE, пользуясь только руками(т.е. только VSC++). И у меня все собралось на УРА))
    Конечно если ничего не поможет, то wxWinCE пересоберу(может и впрямь накосячил)

    “посмотри в habrasnake”
    Пардон за серось… ГДЕ??)))

  • Dimon550 Said:

    Так… Поковырялся и теперь выводит 16 ошибок вида:

    1>wx_monod.lib(imagjpeg.obj) : error LNK2019: unresolved external symbol jpeg_resync_to_restart referenced in function “void __cdecl wx_jpeg_io_src(struct jpeg_decompress_struct *,class wxInputStream &)” (?wx_jpeg_io_src@@YAXPAUjpeg_decompress_struct@@AAVwxInputStream@@@Z)

  • T-Rex Said:

    По поводу HabraSnake я думал это я тебе отвечал со ссылкой на нее
    https://sourceforge.net/projects/habrasnake/

    По поводу последнего поста, это надо wx_jpeg собрать. Или там у тебя в wxApp::OnInit добавляются handler’ы для форматов изображений, в том числе и для JPEG, вот удали те строчки и этой ошибки не будет.

  • Dimon550 Said:

    да, с JPEGом я разобрался(все собрал и подсунул линкеру). Теперь осталось разобраться с

    1>LINK : warning LNK4068: /MACHINE not specified; defaulting to X86

  • Dimon550 Said:

    Сравнил по коммандной строке линкера ХабраКобры и МоегоПроекта. Отличия минимальны:
    - в Хабре больше ЛИБов прикручено
    - в доп.опциях у хабры было дописано “/machine:ARM”

    Подправил у себя проектик. Теперь такое:

    1>coredll.lib(COREDLL.dll) : fatal error LNK1112: module machine type ‘THUMB’ conflicts with target machine type ‘ARM’

    P.S. у меня не скомпилировался ни проект по твоей ссылке, ни тот, что у тебя в след. статье =((

  • T-Rex Said:

    ну вот, говорю ж, в настройках линкера на последней вкладке “Command Line” в проекте библиотеки wx_mono посмотри там текстовое поле сдополнительными параметрами. Там и архитектура указана. Вот эту строку скопируй на то же место себе в проект. там по умолчанию другая стоит.

  • T-Rex Said:

    >coredll.lib(COREDLL.dll) : fatal error LNK1112: module machine type ‘THUMB’ conflicts with target machine type ‘ARM’
    Эээ.. а у тебя точно wx под 2003ю WM собрана? и проект тоже под 2003ю? А то для WM5 там другие настройки.

    В общем наверное наделай скринов настроек проекта своего раздел С/С++, Preprocessor, Advanced, Command Line, в линкере General, Input, Command Line

  • Gornostai Said:

    1>coredll.lib(COREDLL.dll) : fatal error LNK1112: module machine type ‘THUMB’ conflicts with target machine type ‘ARM’

    Та же ошибка. wxWidgets и приложение собрано под WinMob 6, как устранить конфликт?

  • T-Rex Said:

    проверить чтобы в настройках линкера в разделе Advanced было указано что это ARM и в разделе Command Line было то, что и у библиотеки wx_mono

  • Gornostai Said:

    Видимо я не допонимаю, у библиотеки wx_mono нет линкера, есть librarian. В Librarian->Command Line строка другая. Что в разделе Command Line линкера приложения должно быть таким же как у библиотеки wx_mono? wxwidgets 2.8.10

  • T-Rex Said:

    Да, именно так. То что в Librarian ->Command Line у библиотеки, должно быть в Linker->Command Lineу приложения

  • Gornostai Said:

    В Librarian->Command Line только одна строка:
    /OUT:”..\..\lib\evc_armv4t_lib\wx_monod.lib” /NOLOGO
    Ее добавление в Linker приложения ничего не меняет. Остается ошибка 1>coredll.lib(COREDLL.dll) : fatal error LNK1112: module machine type ‘THUMB’ conflicts with target machine type ‘ARM’
    Сравнил строку линкера своего приложения со строкой линкера HabraSnake, то же самое. Может что с библиотекой не так? Свою строку Librarian написал выше.

  • T-Rex Said:

    выложи проект куда-то, я посмотрю.

  • Gornostai Said:

    Вроде разобрался, все работает, только с меню опять проблема. Не работают пункты, особенно выход. Возвращаюсь в тему про первое приложение на WinMobile.

  • T-Rex Said:

    Не работают меню… 2.8.10? Это баг в wx. Где-то в комментариях было как пофиксить. Если лень, то перейти на 2.8.9

Comments RSS Feed   TrackBack URL

Leave a comment

Please leave these two fields as-is:
Найти такси - быстро и дешево. Заказ дешевое такси. ; Реализовать наборы кастрюль немецких фирм продажа . ; стабилизатор напряжения лидер ; купить купальник ; узкий шкаф для одежды

top