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

Как и обещалось ранее в предыдущем посте о создании простейшего приложения для 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 CommentComments RSS Feed TrackBack URL
January 29th, 2009 at 20:41
Увы, что-то я наверное не так сделал(( Выдал:
1>LINK : warning LNK4068: /MACHINE not specified; defaulting to X86
January 29th, 2009 at 22:36
мм.. посмотри в habrasnake в настройках линкера на последней вкладке там внизу дополнительные параметры линкера. Надо чтобы были такие же.
Или сделай скринов всех настроек компилятора и линкера и выложи куда-нибудь, может подскажу чего.
А вобще надо просто чтбы у wxWidgets и твоего проекта настройки были одинаковые.
January 29th, 2009 at 23:44
“А вобще надо просто чтбы у wxWidgets и твоего проекта настройки были одинаковые.”
Ну смотри: в предыдущей “серии” ты рассказал, как можно сотворить приложение, используя собранную библиотеку wxWinCE, пользуясь только руками(т.е. только VSC++). И у меня все собралось на УРА))
Конечно если ничего не поможет, то wxWinCE пересоберу(может и впрямь накосячил)
“посмотри в habrasnake”
Пардон за серось… ГДЕ??)))
January 30th, 2009 at 00:03
Так… Поковырялся и теперь выводит 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)
January 30th, 2009 at 00:07
По поводу HabraSnake я думал это я тебе отвечал со ссылкой на нее
https://sourceforge.net/projects/habrasnake/
По поводу последнего поста, это надо wx_jpeg собрать. Или там у тебя в wxApp::OnInit добавляются handler’ы для форматов изображений, в том числе и для JPEG, вот удали те строчки и этой ошибки не будет.
January 30th, 2009 at 01:27
да, с JPEGом я разобрался(все собрал и подсунул линкеру). Теперь осталось разобраться с
1>LINK : warning LNK4068: /MACHINE not specified; defaulting to X86
January 30th, 2009 at 01:36
Сравнил по коммандной строке линкера ХабраКобры и МоегоПроекта. Отличия минимальны:
- в Хабре больше ЛИБов прикручено
- в доп.опциях у хабры было дописано “/machine:ARM”
Подправил у себя проектик. Теперь такое:
1>coredll.lib(COREDLL.dll) : fatal error LNK1112: module machine type ‘THUMB’ conflicts with target machine type ‘ARM’
P.S. у меня не скомпилировался ни проект по твоей ссылке, ни тот, что у тебя в след. статье =((
January 30th, 2009 at 01:39
ну вот, говорю ж, в настройках линкера на последней вкладке “Command Line” в проекте библиотеки wx_mono посмотри там текстовое поле сдополнительными параметрами. Там и архитектура указана. Вот эту строку скопируй на то же место себе в проект. там по умолчанию другая стоит.
January 30th, 2009 at 01:50
>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
January 4th, 2010 at 14:31
1>coredll.lib(COREDLL.dll) : fatal error LNK1112: module machine type ‘THUMB’ conflicts with target machine type ‘ARM’
Та же ошибка. wxWidgets и приложение собрано под WinMob 6, как устранить конфликт?
January 4th, 2010 at 17:17
проверить чтобы в настройках линкера в разделе Advanced было указано что это ARM и в разделе Command Line было то, что и у библиотеки wx_mono
January 5th, 2010 at 17:25
Видимо я не допонимаю, у библиотеки wx_mono нет линкера, есть librarian. В Librarian->Command Line строка другая. Что в разделе Command Line линкера приложения должно быть таким же как у библиотеки wx_mono? wxwidgets 2.8.10
January 5th, 2010 at 19:03
Да, именно так. То что в Librarian ->Command Line у библиотеки, должно быть в Linker->Command Lineу приложения
January 9th, 2010 at 12:39
В 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 написал выше.
January 9th, 2010 at 15:03
выложи проект куда-то, я посмотрю.
February 3rd, 2010 at 22:36
Вроде разобрался, все работает, только с меню опять проблема. Не работают пункты, особенно выход. Возвращаюсь в тему про первое приложение на WinMobile.
February 3rd, 2010 at 23:13
Не работают меню… 2.8.10? Это баг в wx. Где-то в комментариях было как пофиксить. Если лень, то перейти на 2.8.9