Базовые концепции функционирования приложений для Windows 2000

Содержание

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

WinMain()


Все Windows 2000-приложения начинают свою работу с вызова функции WinMain(). (В распоряжении Windows-программ отсутствует ее «не оконный» работающий по командам вариант — функция main()). WinMain() обладает специальными свойствами, которые отличают ее от других функций в вашем приложении. Во-первых, она должна быть скомпилирована в соответствии с WinAPI-соглашением о вызовах. По умолчанию функции используют С-соглашение о вызовах, но имеется возможность компилировать функцию так, чтобы она использовала другое соглашение. Например, широко распространенным вариантом является применение Pascal-соглашения о вызовах. По различным техническим причинам операционной системой Windows 2000 для вызова функции WinMain() применяется WinAPI-соглашение о вызовах. Результат, возвращаемый функцией WinMain(), должен иметь тип int.

Процедура окна


Все Windows-программы должны содержать специальную функцию, которая вызывается не вашей программой, а самой Windows. Эта функция обычно называется процедурой окна (window procedure) или функцией окна (window function). Именно посредством этой функции Windows 2000 взаимодействует с прикладными программами. Функция окна вызывается системой Windows 2000 в тех случаях, когда ей необходимо передать сообщение прикладной программе. Это сообщение функция окна принимает через свои параметры. Все функции окна должны быть объявлены таким образом, чтобы возвращаемое ими значение соответствовало типу LRESULT CALLBACK. Тип LRESULT представляет собой 32-разрядное целое число. Модель вызова функций CALLBACK используется в тех случаях, когда функцию вызывает сама Windows. В Windows-терминологии любая функция, вызываемая самой системой Windows, относится к классу функций обратного вызова.

К тому же, кроме получения сообщений, посланных операционной системой Windows 2000, функция окна должна инициировать выполнение действий, соответствующих содержащимся в сообщении указаниям. Как правило, в теле функции окна содержится оператор switch, который связывает конкретное ответное действие с тем сообщением, на которое программа будет реагировать. Прикладной программе не обязательно реагировать на все полученные сообщения. Те сообщения, которые не несут полезной информации для прикладной программы, вы можете отослать обратно в Windows 2000 для стандартной обработки, осуществляемой по умолчанию. Так как Windows может генерировать сотни различных сообщений, вполне естественно, что большинство сообщений обрабатывает Windows, а не прикладная программа.

Все сообщения представляют собой 32-разрядные целые значения. Кроме того, все сообщения сопровождаются некоторой дополнительной информацией, характерной для каждого сообщения.

Классы окон


Когда программа стартует под Windows 2000, первое, что ей необходимо сделать, так это определить и зарегистрировать класс окна (window class), который подразумевает стиль или тип этого окна. Когда прикладная программа регистрирует класс окна, она сообщает Windows сведения о форме (т. е. внешнем виде) и функции окна. Однако регистрация класса окна еще не приводит к его появлению на экране. Чтобы действительно создать окно, необходимо выполнить дополнительную работу.

Цикл обработки сообщений


Как уже упоминалось, Windows 2000 взаимодействует с прикладной программой посредством отправки ей сообщений. Все Windows-програмы должны содержать цикл обработки сообщений внутри функции WinMain(). Этот цикл извлекает приходящее сообщение из очереди сообщений приложения, после чего отсылает его обратно в Windows. Операционная система, в свою очередь, вызывает функцию окна вашей программы, причем с этим же сообщением в качестве параметра. Это может показаться чересчур запутанным методом передачи сообщений, но, тем не менее, это единственный путь, которого должны придерживаться все Windows-программы. (Частично причина такого положения состоит в том, чтобы оперативно возвращать управление Windows. В этом случае планировщик заданий операционной системы может распределять время работы центрального процессора так, как он считает целесообразным, а не ожидать, когда закончится промежуток времени, выделенный для прикладной программы.)

Типы данных Windows


В функциях Windows API не очень часто используются стандартные типы данных языка программирования С, например int или char*. Вместо этого многие типы данных, применяемых в Windows, должны быть определены с помощью оператора typedef в файле WINDOWS.H и (или) в связанных с ним файлах. Этот файл поставляется компанией Microsoft (а также другими компаниями, выпускающими компиляторы С для платформы Windows) и должен включаться во все Windows-программы. Вот примеры наиболее употребительных типов данных: HANDLE, HWND, UINT, BYTE, WORD, DWORD, LONG, BOOL, LPSTR и LPCSTR. Тип HANDLE — это 32-разрядное целое число, которое используется как дескриптор. Существует множество типов дескрипторов, но все они имеют такой же размер, как и HANDLE. Дескриптор является просто значением, которое используется для уникальной идентификации некоторого объекта или ресурса. Например, тип HWND является 32-разрядным целым числом, которое используется в качестве дескриптора окна. К тому же, имена дескрипторов всех типов начинаются с буквы Н. Тип BYTE является 8-разрядным целым без знака (unsigned); WORD — 16-разрядное короткое целое без знака; DWORD — 32-разрядное целое без знака; UINT — 32-разрядное целое без знака; LONG — 32-разрядное целое со знаком; BOOL — целый тип, используемый для указания величин, которые могут принимать значения, которые интерпретируются как ИСТИНА или ЛОЖЬ; LPSTR — указатель на строку, а тип LPCSTR — константный (const) указатель на строку.

В дополнение описанным выше базовым типам, в Windows 2000 определены еще несколько структур. Две из них, MSG и WNDCLASSEX, необходимы для создания скелета программы. Структура MSG содержит в себе сообщение Windows 2000, а WNDCLASSEX — структура, которая определяет класс окна. Позже в данной главе эти структуры будут обсуждаться более подробно.