На этом шаге мы рассмотрим общую структуру Windows-приложения.
Опишем основные элементы архитектуры 32-разрядных ОС Windows.
Windows-приложения состоят как минимум из одного процесса. Процесс - это экземпляр выполняющейся программы. Ему выделяются адресное пространство и ресурсы. В рамках одного процесса может быть запущено несколько потоков.
Поток - это минимальная программная единица, для выполнения которой планировщик выделяет процессорное время. Поток запускается в адресном пространстве процесса и использует его ресурсы.
Процесс имеет как минимум один исполняемый поток, называемый первичным потоком. Для выполнения фоновых задач можно создавать вторичные потоки, используя таким образом преимущества многозадачности. Приложения, применяющие несколько потоков, называются многопоточными.
При запуске приложения операционная система создает процесс и начинает выполнение его первичного потока. Когда поток заканчиает свою работу, заканчивается и процесс. Информация о первичном потоке передается операционной системе в виде адреса функции. Поэтому все Windows-приложения содержат вызываемую при запуске функцию WinMain(), адрес которой и передается в качестве адреса первичного потока.
Затем приложение создает окно. Но до его отображения на экране в операционной системе должны быть зарегистрированы оконные классы - шаблоны, содержащие информацию о свойствах окна. В процессе регистрации окно связывается с оконной процедурой, которая позволяет задать отображаемую этим окном информацию, а также его реакцию на действия пользователя посредством обработки сообщений системы.
Окно служит для взаимодействия пользователя с приложением, а для взаимодействия операционной системы, приложения и его компонентов предназначены системные сообщения. Например, при создании экземпляра приложения операционная система посылает ему серию сообщений, отвечающих за его инициализацию. Клавиатура и мышь тоже генерируют сообщения и отправляют их в соответствующее приложение. Таким образом, основная задача программы - обработать получаемые сообщения, то есть передать их ожидающему окну и выполнить некоторые действия, зависящие от типа сообщения и его параметров. Разработчик должен связать сообщения с функциями, которые будут запускаться на них в ответ.
Каждый поток, создающий окно, имеет очередь сообщений - структуру данных, в которой операционная система хранит сообщения. У всех Windows-приложений есть главное окно, имеющее в свою очередь цикл обработки сообщений - часть программы, извлекающую сообщения из очереди и посылающую их в соответствующую оконную процедуру. Эта процедура обрабатывает сообщение или передает его стандартной оконной процедуре, содержащей стандартный обработчик сообщений. Например, сообщение о свертывании окна будет обработано почти всеми приложениями одинаково, так как для этого подходит стандартная оконная процедура.
На рисунке 1 изображено, как сообщения ставятся в очередь и обрабатываются приложением. Обратите внимание на то, как средствами функций PostMessage() и SendMessage() можно послать сообщение. Обратившись к этим функциям или их двойникам из библиотеки MFC - CWnd::PostMessage() и CWnd::SendMessage(), - приложение посылает или принимает сообщения.
Рис.1.Обработка сообщений
Функция PostMessage() помещает сообщение в очередь, связанную с окном, и сразу же завершается, не дожидаясь его обработки (асинхронное сообщение). А функция SendMessage() после помещения сообщения в очередь ждет его обработки (синхронное сообщение).
Для создания Win32-приложения необходимо:
Создадим простое Windows-приложение без использования MFC.
Рис.2. Выбор типа проекта
Рис.3. Первый шаг Мастера
Рис.4. Перечень исходных файлов
Со следующего шага мы начнем рассматривать структуру MFC-приложения.