|
Программирование >> Процедурные приложения
Основным компонентом любого приложения Windowsявляется цикл обработки сообщений. В процедурном приложении местонахождение этого цикла нетрудно определить. В программах, написанных с использованием библиотеки MFC , цикл обработки сообщений скрыт в классе cwinApp. Если говорить в целом, работа приложения организуется следующим образом. Приложение сначала создает и открывает свои окна, затем запускается цикл обработки сообщений и, в конце концов, при получении сообщения типа WM CLOSE, работа программы завершается. Цикл обработки сообщений ответственен за передачу поступающих от Windowsсообщений соответствующим оконным процедурам. На последовательность обработки сообщений влияют два фактора: очередь, в которой находится сообщение, и приоритет его самого. Сообщения могут поступать из двух очередей: системной и очереди приложения. Но даже если сообщение поступило от самого приложения, оно все равно будет помещено в системную очередь. Когда подойдет черед сообщения, оно будет направлено в очередь соответствующего приложения. Такая организация работы системной очереди позволяет Windows контролировать прохождение всех сообщений и ограничивает ответственность приложений обработкой только тех сообщений, которые относятся непосредственно к ним. Сообщения обычно помещаются в очередь по принципу FIFO (firstin, firstout- первым поступил, первым обслужен). Такие сообщения называются синхронными. Но иногда Windowsвставляет сообщение сразу в голову очереди. Сообщения такого типа, изменяющие нормальный ход выполнения программы, называются асинхронными. Существует несколько видов асинхронных сообщений, среди них - сообщения о перерисовке, сообщения таймера и сообщения о завершении программы. Например, сообщение таймера может запускать некоторое действие в определенный момент времени независимо от того, какие сообщения сейчас находятся в очереди; оно имеет наивысший приоритет и передается раньше всех других сообщений. У вас может возникнуть вопрос, как Windows выходит из положения в том случае, если сообщения поступают одновременно нескольким приложениям. Эта проблема решается одним из двух способов. Первый состоит в задании приоритетов. Когда загружается некоторое приложение, для него автоматически устанавливается нулевой приоритет. В процессе работы приложения его приоритет может быть изменен. Любые конфликты разрешаются в пользу того приложения, чей приоритет выше. Изменять приоритет приложения, заданный по умолчанию, обычно не рекомендуется. Тем более что в распоряжении Windows есть еще один метод, определяющий очередность передачи сообщений группе приложений с одинаковым приоритетом. Если Windows видит, что у приложения образовался длинный список необработанных сообщений, то она автоматически приостанавливает передачу этому приложению новых сообщений, хотя продолжает передавать сообщения другим, более свободным приложениям. Вызов системных функций Как известно, Windows содержит сотни встроенных функций, таких как DispatchMessage() , PostMessage(), RegisterWindowMessage(), SetActiveWindow() и т.д. При создании приложений на C++ с использованием библиотеки MFC большинство этих функций инкапсулируются в базовых классах и выполняются автоматически. Соглашение о вызове функций В Windows3.x описания функций включали спецификатор PASCAL, который в 32-разрядных версиях Windowsне используется. Параметры функций здесь передаются посредством системных стеков и считываются в обычном для C/C++ режиме - в направлений Справа налево. После завершения функции вызвавшая ее процедура должна модифицировать указатель стека с учетом количества байтов, занимаемых параметрами функции. Файл WINDOWS.H Файл заголовков WINDOWS.H открывает доступ к тысячам описаний констант, структур, типов данных и прототипов функций. Он включается в большинство приложений Windowsи содержит директивы включения множества других файлов заголовков. (Одна из причин, почему приложения Windows компилируются так долго, состоит не только в относительно больших размерах самих программ, но и в том, что к ним подключаются большие файлы заголовков.) В случае использования библиотеки MFC файл WINDOWS.H подключается к программе косвенно, Через файл AFXWIN.H. Обычно в директивах #define, встречающихся в файлах заголовков, за текстовым идентификатором следует числовая константа. Например: #define WM CREATE 0x0001 Для VisualC++ данная запись означает, что на этапе компиляции идентификатор сообщения WM CREATE следует заменить шестнадцатеричной константой 0x0001. Некоторые директивы #define могут выглядеть довольно необычно: #define NEAR near #define FAR far Данные команды позволяют использовать в приложении ключевые слова near и far, набираемые как в верхнем, так и в нижнем регистре, что дает программе ряд преимуществ. Не стоит забывать, что проще изменить объявления в файле заголовков, чем отыскивать и менять ключевые слова по всей программе. Этапы создания приложения Разработку приложений Windowsможно разбить на несколько общих этапов. Перечислим их. Создание функции winMain() и других базовых функций. При использовании MFC эти действия выполняются автоматически в классе cwinApp. Создание меню и других необходимых ресурсов, включение их в файл сценария ресурсов. Создание с помощью редактора ресурсов уникальных указателей мыши, значков и других растровых изображений. (Не обязательный.) Создание с помощью редактора ресурсов дополнительных диалоговых окон. (Не обязательный.) Компиляция проекта. Создание ресурсов приложений средствами VisualC++ Компилятор VisualC++ содержит ряд встроенных редакторов ресурсов. Чтобы открыть список доступных редакторов, в меню Insert нужно выбрать команду Resource. Редакторы ресурсов позволяют быстро создавать и изменять собственные значки, указатели мыши, точечные рисунки, диалоговые окна и многое другое. Каждый ресурс представляет собой блок данных, который добавляется в исполняемый файл приложения. Но если разобраться в технических деталях, то окажется, что эти данные размещаются не в сегменте данных программы. Когда программа загружается в память для выполнения, ресурсы остаются на диске. В качестве примера приведем ситуацию, когда пользователь первый раз вызывает окно About. Прежде чем Windows сможет отобразить это окно, система должна обратиться к жесткому диску и загрузить соответствующие данные из выполняемого файла в память. Если в приложении планируется использовать такие ресурсы, как диалоговые окна, меню и значки, то каждый из них предварительно должен быть описан в файле сценария ресурсов. Этот файл создается, модифицируется и дополняется с помощью редакторов ресурсов, о которых говорилось выше. Посредством компилятора ресурсов файл сценария преобразуется в файл скомпилированных ресурсов, данные из которого вставляются затем в исполняемый файл приложения. Такой метод обработки ресурсов позволяет приложениям хранить информацию обо всех своих ресурсах непосредственно в исполняемом файле. Файлы проектов Файлы проектов служат средством контроля за ходом компиляции ресурсов и программного кода приложения. Они позволяют отслеживать взаимосвязь программы и исходных файлов, учитывать время создания файлов. В файлах проектов содержится информация о компиляции и компоновке текущего приложения с учетом подключаемых библиотек, аппаратной платформы и системной среды. В большинстве случаев с целью сокращения времени создания нового проекта можно выбрать один из готовых шаблонов, предлагаемых компилятором VisualC++. С помощью файлов проектов можно также организовать ступенчатую компиляцию и компоновку, когда перекомпиляции подвергаются только те части программы, которые были модифицированы. Это позволяет существенно сократить время построения исполняемого файла. Редакторы ресурсов В VisualC++ встроен целый набор редакторов ресурсов, каждый из которых ориентирован на определенный тип ресурсов. В следующих параграфах вы узнаете, как с их помощью создавать значки, указатели мыши, меню и диалоговые окна. Значки, указатели мыши и точечные рисунки Хотя ресурсы данного типа разрабатываются с помощью разных редакторов, в основу их создания положен один принцип, так как все они относятся к растровым изображениям. Отличие состоит лишь в том, что редакторы значков и указателей мыши позволяют создавать аппаратно-независимые изображения - в том смысле, что их внешний вид не будет зависеть от разрешения монитора. Так, значок может иметь четыре описания: одно - для черно-белого монитора, другое - для CGA-системы, третье - для EGA, четвертое - для VGA. Обращение к значку во всех случаях производится одинаково - по имени. При этом Windowsавтоматически выбирает то описание, которое-в наибольшей степени соответствует реальному типу монитора, установленного на данном компьютере. Окно редактора в процессе создания нового значка показано на рис. 16.8. Рис. 16.8. Окно разработки нового значка В центре окна находится область редактирования, где можно создать значок, указатель мыши или точечный рисунок. Изначально размер этой области составляет 32x32 ячейки. В левой
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |