Главным элементом программы в среде Windows является окно. Для каждого окна определяется своя процедура обработки сообщений. Подобные процедуры, вызываемые самой системой, называются процедурами обратного вызова (CALLBACK).
Окно может содержать элементы управления: кнопки, списки, окна редактирования и др. Эти элементы, по сути, также являются окнами, но обладающими особыми свойствами. События, происходящие с этими элементами (и самим окном), приводят к приходу сообщений в процедуру окна. У каждого окна имеется свой идентификатор (дескриптор, handle) окна.
ОС Windows является событийно-управляемой операционной системой [1].Т.е. выполнение той или иной процедуры в приложении инициируется при наступлении определенного события (щелчка мыши, нажатия клавиши и т.п.). Для оповещения приложений о наступлении того или иного события используется механизм сообщений. Таким образом, приложение должно постоянно обрабатывать посланные ему сообщения: какие-то из этих сообщений будут обрабатываться с помощью определенных процедур, какие-то игнорироваться.
Для того чтобы приложение могло определить, какому окну было послано сообщение, в каждом сообщении передается идентификатор окна, которому адресуется данное сообщение.
В общем случае, при посылке сообщения приложению, ОС передает следующую информацию [2].
typedef struct tagMSG { // msg
HWND hwnd;
UINT message;
WPARAM wParam;
LPARAM lParam;
DWORD time;
POINT pt;
} MSG;
где
hwnd - идентификатор окна, оконная процедура которого получает сообщение
message - определяет номер (код) сообщения.
wParam - определяет дополнительную информацию о сообщении. Точное значение этого поля зависит от кода сообщения (значения поля message).
lParam - определяет дополнительную информацию о сообщении. Точное значение этого поля зависит от кода сообщения (значения поля message).
time - определяет время, когда было размещено сообщение в очереди сообщений окна.
pt - определяет позицию курсора, в координатах экрана, в момент, когда было размещено сообщение.
Однако, микропроцессор не обрабатывает типы данных под названием " HWND ", " UINT ", " WPARAM " и т.д. - это так называемые логические типы данных. Микропроцессор оперирует двоичными числами, и с этой точки зрения, большинство параметров являются 32-х разрядными двоичными числами[1].
Необходимо отметить, что при обработке строк символов (заголовков окна, текстов сообщений) в качестве параметра передается указатель на строку. С учетом того, что в ОС Windows в основном используется плоская модель памяти (см. раздел 2), указатель является 32-х разрядным числом5. При этом, согласно все ключевые функции создания окон, вывода текста, манипулирования строками и т.п. обрабатывают строки в кодировке Unicode (в Unicode для кодирования символов может использоваться от 1 до 4 байт - UTF-8, однако в Windows используется кодировка UTF-16, предполагающая кодирование любого символа 16 битами). Если какой-либо функции Windows передать при вызове строку в кодировке ANSI (для кодирования символа используется 1 байт), то эта строка сначала будет преобразована в строку в кодировке Unicode, и лишь затем обработана. Поэтому, для повышения производительности приложений предпочтительней использовать строки в кодировке Unicode.
Классическая структура программы под Windows состоит из следующих разделов кода [2]:
· Регистрация класса окон
· Создание главного окна
· Цикл обработки очереди сообщений
· Процедура главного окна
В программе могут присутствовать и другие разделы, но вышеперечисленные разделы образуют основной скелет программы. Пример программы приведен в приложении А.