Чтение онлайн

ЖАНРЫ

Программирование для карманных компьютеров

Волков Владимир

Шрифт:

8. Запустить проект. Все должно работать, кроме выпадающего списка. Когда пользователь нажимает кнопку со стрелкой, щелчок на самой кнопке очень легко обработать в ветви WM_COMMAND, выловив идентификатор кнопки. Но вот как обработать щелчок на стрелке, чтобы появился выпадающий список? Теоретически, щелчок на этой стрелке должен генерировать константу TBN_DROPDOWN внутри поля lParam сообщения WM_NOTIFY, но, как выясняется, такой константы в этом поле нет. На самом деле в поле lParam помещается указатель на структуру LPTBNOTIFY, в которой есть поле hdr, в структуру которого входит поле code, в которое и помещается соответствующая константа. Значит, всего-то нужно выловить наличие константы в этом поле. Соответствующий код, располагающийся в процедуре WinProc, приведен в листинге 4.29. Листинг 4.29

case WM_NOTIFY:

//Ловим событие щелчка на стрелке к кнопке

if (((LPTBNOTIFY) lParam)->hdr.code == TBN_DROPDOWN)

{

//Находим углы кнопки, помещаем их в структуру lprc

SendMessage (g_hwndCB, TB_GETRECT, ((LPTBNOTIFY) lParam)->iItem, (LPARAM)(LPRECT)lprc);

//Находим место, где заканчивается окно, и начинается CB

i=CommandBar_Height(g_hwndCB);

//По найденным координатам выводим всплывающее меню так, чтобы оно

//в этой точке оказалось своим нижним правым углом (это задается

//константами TPM_RIGHTALIGN|TPM_BOTTOMALIGN

TrackPopupMenuEx(g_hmCB,TPM_RIGHTALIGN|TPM_BOTTOMALIGN, lprc->right, i, hWnd, NULL);

}

break;

9. Программу можно запустить и посмотреть на результат ее работы.

Диалоговые окна

В предыдущем упражнении диалоговое окно уже добавлялось к проекту. Но это было сделано только для того, чтобы использовать помещенный на него компонент Combo Box для встраивания в Command Bar. Тем не менее, если в проекте необходимо использовать окна, выводимые на экран командами меню, то следует придерживаться определенной последовательности действий.

10. Добавить диалоговое окно к ресурсам проекта, как это было сделано в предыдущем упражнении.

11. Разместить на окне элементы управления с панели Controls окна редактирования диалога,

как показано на рис. 4.13.

Рис. 4.13. Редактирование диалогового окна, компоновка элементов управления.

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

13. Связать диалоговое окно с командой меню и обеспечить его создание так, как это сделано в шаблонном проекте. Следует обратить внимание на то, как обеспечивается создание диалогового окна (вызов функции DialogBox из обработчика сообщения команды меню IDM_HELP_ABOUT), организуется анализ очереди сообщений (функция LRESULT CALLBACK About) и как окно ликвидируется после использования (обработчик сообщения команды щелчка на кнопке OK диалогового окна, который находится в функции анализа очереди сообщений и вызывает функцию EndDialog). Все эти операции придется проделать с каждым создаваемым диалоговым окном.

14. Обеспечить обработку необходимых сообщений, посылаемых элементами управления, расположенными на диалоговом окне. Естественно, формат книги не позволяет подробно разобрать работу с каждым элементом управления, но это уже сделано в примерах, которые поставляются вместе с SDK. По умолчанию они располагаются в папке C: \Windows СЕ Tools\wce300\Pocket PC 2002\samples\win32.

Примеры, которые поставляются вместе с SDK, приведены в следующем списке.

? CalendarAndDTP – использование элементов управления Calendar и Date Time Picker.

? Cmdbar – использование элемента CommandBar и динамическое изменение кнопок на нем.

? ComCtls – посылка сообщений элементам управления, синхронизированная с «тиками» таймера.

? DirTree работа с компонентом Tree Control.

? Dynamenu – пример вывода и сокрытия пунктов меню во время работы приложения.

? HandleSIP – программное управление режимами и поведением виртуальной клавиатуры.

? Keytest2 – пример того, как перехватываются и обрабатываются сообщения от клавиатуры и стилуса.

? ListView и ListView2 – разные способы применения компонента ListView со значками и организация большого списка с горизонтальной прокруткой.

? ReBar – работа с компонентами ReBar и ToolBar.

? Toolbar – демонстрация работы с компонентом ToolBar.

? TrackStylus – отслеживание и обработка событий стилуса.

Отладка

Несмотря на то что, по логике вещей, любая программа должна быть сначала создана, а потом отлажена, на самом деле отладка проекта обычно происходит параллельно его созданию. Разработчик пишет часть кода, компилирует проект, устраняет ошибки, которые выявляет компилятор и сборщик, затем запускает проект на выполнение и пытается выполнить только что написанный код. Если все работает как положено, то ничего отлаживать не придется. Но бывает так, что при попытке выполнить написанный и скомпилированный код либо генерируется ошибка времени выполнения, либо код работает без ошибок, но делает совсем не то, что предполагалось. В этом случае без отладки не обойтись.

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

Компиляция и сборка для отладки

Чтобы можно было выполнять все необходимые для отладки операции и иметь доступ ко всем используемым в программе именам, программу надо скомпилировать в отладочном варианте. Для компиляции программы под отладку необходимо соответствующим образом настроить среду. Проще всего для этого установить необходимые параметры на панели инструментов WCE configuration, как показано на рис. 4.14.

Рис. 4.14. Панель инструментов WCE configuration.

В первом выпадающем списке этой панели задается имя активного проекта в заданном рабочем пространстве. Во втором выпадающем списке указывается устройство, для которой создается проект. В третьем списке можно выбрать одну из конфигураций, согласно которой будет происходить компиляция и сборка текущего проекта. Обычно в списке есть несколько предустановленных конфигураций, но разработчик может создать свою конфигурацию при помощи команды меню Build ?Configurations… ?Add… и настроить ее согласно своим требованиям при помощи команды меню Project ? Settings…. Четвертый список позволяет задать устройство, на котором будет запускаться скомпилированная программа.

ПРИМЕЧАНИЕ. Для запуска программы на устройстве Pocket PC конфигурацию необходимо выбирать из списка конфигураций для WCE ARM, а для запуска на эмуляторе – из списка WCE x86. Такова суровая правда жизни – эмулятор для Pocket PC не эмулирует машинные команды и не в полной мере эмулирует архетиктуру микропроцессора ARM, на котором собрано устройство Pocket PC. Это можно считать серьезным недостатком, поскольку невозможно установить на эмулятор бинарные файлы для Pocket PC.

Естественно, если вы хотите отлаживать свою программу, вам необходимо выбрать одну из отладочных конфигураций. К ним относятся Win32 (WCEx86) Debug и Win32 (WCE ARM) Debug. Точки останова (breakpoints) и пошаговое выполнение программы

Для того чтобы в нужном месте выполнить программу пошагово, необходимо на этой строке кода установить точку останова. Точка останова ставится либо при помощи команды Insert\Remove Breakpoint из контекстного меню, либо при нажатии соответствующей кнопки панели инструментов WCE Configuration. Кроме этого, установку точки останова можно выполнить, нажав клавишу F9 на клавиатуре. В левом поле окна редактора кода напротив строки, в которой задана точка останова, появится маркер – кружок коричнево-красного цвета. Когда программа останавливается в заранее заданной точке, внутри этого кружка появляется желтая стрелка, как показано на рис. 4.15.

Рис. 4.15. Программа, остановленная в точке останова.

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

? F11 – отладка с заходом в тело функций. Если очередной командой при пошаговом выполнении оказывается вызов функции, то следующий шаг будет сделан уже внутри тела этой функции.

? F10 – отладка без захода в тело функций. Если очередной командой оказывается вызов функции, то эта строка проходится так же точно, как и все остальные. Функция выполняется за один шаг.

? Shift+F11 – выход из тела функции. Если, войдя в функцию в процессе пошагового выполнения программы, разработчик увидел все, что ему было нужно, и необходимость дальше продолжать пошаговое выполнение внутри функции отпала, то это сочетание клавиш выполнит оставшиеся шаги за один раз и передаст управление следующему за функцией оператору.

? Ctrl+F10 – нажатие этого сочетания клавиш приведет к выполнению кода в обычном режиме и остановке в строке, в которой в редакторе кода находится в данный момент текстовый курсор.

Перемещение желтой стрелки по левому полю редактора кода указывает, на какую строку в исходном коде передается управление ходом выполнения программы.

Отображение и модификация значений переменных

Смысл пошагового выполнения программы не только в том, чтобы проследить, правильно ли передается управление ходом выполнения кода, но и в том, чтобы проверить, какие значения принимают те или иные переменные. Для этого среда eVC предоставляет в распоряжение программиста окна Watches и Variables.

В окне Variables отображаются локальные переменные той функции, в которой сейчас происходит выполнение программы (рис. 4.16).

Рис. 4.16. Окно Variables.

Содержимое окна может меняться в процессе выполнения программы. Это окно позволяет как просматривать, так и редактировать значения переменных. Окно имеет три вкладки. На вкладке Auto отображаются переменные, имеющие смысл в текущей и предыдущей строке кода. На вкладке Locals отображаются все локальные переменные, которые активны в данный момент. На вкладке This отображается информация обо всех переменных, именах и значениях, доступ к которым может быть осуществлен через указатель на переменную this.

? На вкладке Auto отображаются также значения, возвращаемые функциями. Эти значения появляются при передаче управления инструкции, следующей за вызовом функции.

? Окно Watches предназначено для контроля и изменения значений произвольных переменных (рис 4.17):

Рис. 4.17. Окно Watches.

? Чтобы добавить в окно переменную, значение которой нужно отслеживать в ходе выполнения программы, достаточно ввести ее имя в колонку Name. Но можно и просто щелкнуть в коде на имени переменной правой клавишей мыши, а затем из контекстного меню выбрать команду QuickWatch и нажать кнопку Add Watch.

Настройки среды

? Все настройки среды осуществляются в окнах, вызываемых на экран командами Tools ? Customize… и Tools ? Options…. Команда Customize уже рассматривалась ранее, поэтому сейчас нужно сосредоточить свое внимание на команде Options. По этой команде на экран выводится следующее окно с множеством вкладок (рис. 4.18).

Рис. 4.18. Окно настройки среды Options.

? Назначение вкладок и элементов управления в этом окне рассматривается ниже. Вкладка Editor – настройки параметров редактора

Органы

управления, располагающиеся в группе Window settings, рассматриваются в следующем списке.

? Vertical scroll bar – отображать вертикальную полосу прокрутки.

? Automatic window recycling – использовать окно редактирования кода для отображения окон с другой функциональностью вместо открытия нового окна.

? Drag-and-drop text editing – позволять перетаскивание выделенного текста при редактировании.

? Horizontal scroll bar – показывать горизонтальную полосу прокрутки.

? Selection margin – показывать левое поле в окне редактора кода.

Чтобы задавать параметры сохранения файлов, используются органы управления, располагающиеся в группе Save Options. Они описываются в следующем списке.

? Save before running tools – сохранять файлы, открытые в редакторе, перед запуском скопмилированной программы.

? Automatic reload of externally modified files – заново открывать файлы, которые были изменены вне среды.

? Prompt before saving files – запрашивать разрешение на сохранение файла.

При работе с кодом разработчик может пользоваться автозавершением набираемых конструкций. Параметры этого механизма задаются в группе Statement complition options. Расшифровка соответствующих органов управления приведена в следующем списке.

? Auto list members – вызывать список автозавершения классов или структур при вводе знаков точки или стрелки вправо. Этот список можно вызвать в любой момент, нажав сочетание клавиш Ctrl+Alt+T.

? Auto type info – автоматически показывать на всплывающем ярлычке информацию о типе переменной при перемещении указателя мыши над именем переменной. Этого же эффекта можно добиться, поместив текстовый курсор внутрь имени переменной и нажав сочетание клавиш Ctrl+T.

? Code comments – при выводе списка автозавершения справа от него на всплывающем ярлычке будут показаны комментарии, сопровождающие объявление этого имени.

? Auto parametr info – автоматический вывод списка параметров для функции при вводе открывающей круглой скобки после имени функции.

Вкладка Tabs

На этой вкладке разработчик может установить размер и правила установки отступов для файлов разного типа.

? File Type – тип файла, для которого устанавливаются параметры.

? Tab size – размер отступа при нажатии клавиши Tab в символах.

? Indent Size – размер отступа, в символах.

? Indent Spaces\Kepp Tabs – заполнять отступы пробелами или оставлять вместо них знаки табуляции.

В группе Auto indent можно указать правила использования отступа в редакторе кода.

? none – не включать автоматический отступ.

? default – оставить значения для данного типа файла по умолчанию.

? Smart – включить «умный» отступ, который будет выглядеть, как ступенчатый отступ для вложенных блоков, и сохранять отступ предыдущей строки.

Дополнительные параметры отступа настраиваются в группе Smart indents options.

? Indent open brace – включать отступ для открывающей скобки.

? Indent closing brace – включать отступ для закрывающей скобки.

? NN pevous lines using for context – применять правила отступа, выработанные на основе анализа предыдущих строк кода.

Вкладка Debug

На этой вкладке разработчик может настраивать правила отладки приложений. Расшифровка соответствующих органов управления приводится в следующем списке.

? GUID display – типы, основывающиеся на GUID, будут названы в соответствующем окне по имени, если оно будет найдено в реестре, или в форме числового представления GUID.

? View floating-point registers – показывать содержание регистров операций с плавающей точкой в окне Register.

? Return value – показывать значение, возвращаемое функциями, в окне Variables.

? Load COFF & Exports – загружать отладочную информацию в COFF-формате и информацию об экспортируемых функциях DLL.

Параметры, позволяющие регулировать порядок отображения информации при дизассемблировании программы, находятся в группе Disassembly window. Они рассматриваются в следующем списке.

? Source annotation – сопровождать листинг на языке ассемблера строками исходного кода в соответствующих местах.

? Code bytes – показывать машинный код параллельно командам ассемблера.

? Symbols – показывать символические имена адресов переменных или имена программы.

Параметры окна вызовов устанавливаются в группе Call stack window. Флажок Parameter values отвечает за отображение значений, переданных как параметры при вызове функции, а флажок Parameter types позволяет показывать типы параметров функций.

За отображение содержимого памяти отвечают органы управления, собранные в группе Memory window. Их предназначение указано в следующем списке.

? Adress – начальный адрес для выводимого на экран блока памяти.

? Format – выбор формата, в котором будет отображено содержимое выводимого на экран блока памяти.

? Re-evaluate expression – вычислять значения вводимых в окно выражений Memory.

? Show data types – показывать данные как числовое отображение содержимого байтов помимо выбранного формата.

? Fixed width – ширина столбца для отображения данных.

Вкладка Compatibility

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

? Current source editor emulation – список популярных редакторов кода, параметры которых эмулирует eVC.

? Options – список параметров.

• Disable backspace at start of line – предотвращать непроизвольное слияние строк при помощи размещения в начале каждой строки символа Backspace.

• Enable copy without selection – включить копирование строки, в которой находится курсор, если нет выделенного фрагмента текста.

• Enable line-mode pastes – помещенные в буфер строки кода будут скопированы над текущей строкой, а не в позицию курсора.

• Enable virtual spaces – позволить курсору перемещаться за пределы конца файла.

• Include caret position in undo buffer – при отмене удаления восстанавливать позиции символов перевода строки.

• Indent separate paragraf – трактовать каждую строку, начинающуюся с символа табуляции, как новый абзац.

• Protect read-only files from editing – не редактировать файлы, помеченные атрибутом «только для чтения».

• Use BRIEF\'s regular expression syntax – использовать для символов подстановки синтаксис BRIEF.

• Double-click in dialod editor edit code (MFC only) – двойной щелчок на управляющем элементе в редакторе диалогового окна показывает относящийся к этому элементу код в окне редактора кода.

Вкладка Download

На этой вкладке задаются параметры выгрузки файлов на целевое устройство. Расшифровка соответствующих органов управления приведена в следующем списке.

? Always dounload binary to the target – при каждой перекомпиляции проекта заново загружать бинарные файлы на устройство.

? Always dounload dependencies to the target – при каждой перекомпиляции проекта загружать все связанные файлы на устройство.

? Connection timeout – позволяет указать время соединения, после которого попытка загрузить файлы на устройство считается неудачной.

Вкладка Build

На этой вкладке разработчик может задать параметры компиляции проекта.

? Export makefile when saving project file – при каждом сохранении текущего проекта экспортировать Makefile.

? Always write dependencies when writing makefiles – при сохранении Makefile сохранять файл зависимостей.

? Write Build Log – сохранять файл отчета о компиляции.

Вкладка Directories

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

? Platform – платформа, для которой настраивается конфигурация.

? CPUs – процессор, для которого настраивается конфигурация.

? Show directory for – функциональная группа файлов, для которой настраивается конфигурация.

? Directories – список соответствующих каталогов для данной группы файлов. При помощи кнопок в верхнем правом углу окна к списку могут быть добавлены новые каталоги, удалены существующие каталоги или изменен порядок их просмотра.

Вкладка Workspace

Вкладка Workspace позволяет настраивать параметры используемых рабочих пространств.

? Docking view – список окон, которые по умолчанию будут отображаться в фиксированном месте среды. Если флажок у того или иного окна снять, то соответствующее окно будет выведено в «плавающем» состоянии.

? Display status bar – отображать состояние выбранного окна в строке состояния.

? Display clock on status bar – отображать часы на строке состояния.

? Reload documents when opening workspace – восстанавливать позиции всех окон с открытыми в них документами в том состоянии, которое было зарегистрировано на момент предыдущего закрытия проекта.

? Reload last workspace on startup – при запуске среды загружать последнее рабочее пространство, с которым работал программист.

? Automatically sort window menu – часто используемые окна автоматически помещаются в начало списка меню Windows.

? Use screen reader compatible menus – использовать меню, совместимые с программами для людей с ограниченными возможностями зрения.

? Show recently used items on submenu – показывать список недавно открытых файлов и рабочих пространств на отдельных подменю.

? Window menu contains – количество окон, отображаемых в меню Windows.

? Recent file list contains – количество файлов в списке недавно открытых файлов.

? Recent workspace list contains – количество рабочих пространств в списке недавно открытых рабочих пространств.

Вкладка Macros

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

? Always reload the file – всегда загружать измененный файл.

? Never reload the file – никогда не загружать изменный файл.

? Ask whether to reload the file – запрашивать разрешение на загрузку измененного файла.

Вкладка Format

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

? Category – указывает группу элементов, к которой будет применяться выбранный формат.

? Font – имя шрифта для отображения.

? Size – размер шрифта.

? Colors – для какого элемента экрана будет применен данный цвет.

? Foreground – цвет элемента.

? Background – цвет подложки.

Дополнительные сведения о языке C++

Файлы программы и единицы компиляции

При создании программ на языке C++ следует иметь в виду, что программирование на этом языке опирается на модульный принцип построения программы. Это значит, что программа, которая в результате выглядит как один файл с расширением. exe, во время разработки может состоять из множества файлов с расширением. cpp и.h. Файлы с расширением. cpp называются исходным кодом, а файлы с расширением. h – заголовочными файлами или заголовками. Поскольку каждый файл исходного кода подается на вход компилятора и из него образуется файл промежуточного объектного кода, файлы исходного кода являются единицами компиляци. Процесс создания программы состоит из трех этапов.

Поделиться с друзьями: