Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ТРПС- читать.doc
Скачиваний:
1
Добавлен:
01.05.2025
Размер:
142 Кб
Скачать
☆

3. Общая схема Windows приложения. Цикл обработки сообщения, функция окна, ресурсы. (трпс)

Все программы под Windows должны содержать оконную функцию или процедуру, которая вызывается операционной системой. Оконная функция вызывается ОС, когда программе нужно послать сообщение, т.е. через эту функцию Windows взаимодействует с программой. Простейшая программа для Windows состоит из двух функций - WinMain() и оконной функции. Функция WinMain() является точкой входа в Windows – программу и должна выполнять следующие операции: Определять класс окна. Регистрировать класс окна. Создавать окно данного класса. Отображать окно. Запускать цикл обработки сообщений. . С WinMain() передаётся четыре параметра:

HINSTANCE hInstance – дескриптор экземпляра приложения. Каждому запущенному приложению ОС ставит в соответствие блок информации, которая сохраняется Windows в специальном списке все время, пока приложение находится в памяти компьютера. Указатель на этот блок является уникальным и передается приложению в качестве дескриптора. Приложение использует этот дескриптор как параметр при функциональных запросах на выделение системных ресурсов.

HINSTANCE hPrevInstance – дескриптор экземпляра приложения, запущенного ранее. ОС Windows позволяет запускать несколько копий одного и того же приложения.

LPSTR lpCmdLine – указатель на командную строку

int nCmdShow – параметр, указывающий как должно быть отображено главное окно приложения: свёрнутым в иконку, распахнутым на весь экран или нормальным образом.

Функция окна – вторая ключева точка приложения. Оконная функция должна обрабатывать все сообщения, относящиеся к данному окну. Оконная функция может иметь следующий прототип:

LRESULT CALLBACK WndProc (HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam); - функция окна является функцией обратного вызова, что подчёркивается макросом CALLBACK в её заголовке и используется для функций, вызываемых ОС. Параметры функции соответствуют первым четырём полям структуры MSG. Первый параметр функции окна подчёркивает тот факт, что данная функция будет обслуживать все окна, созданные на базе данного класса, отличая одно окно от другого по его уникальному дескриптору. Принимая сообщения посылаемые ОС, оконная функция должна выполнять действия, соответствующие типу и параметрам этих сообщений. Каждое получаемое окном сообщение идентифицируется номером, который содержится во втором параметре функции поэтому как правило, тело функции представляет собой оператор switch(message) { WM_DESTROY: PostQuitMessage(0); WM_PAINT: ….; } , определяющий тип получаемых сообщений и выполняющий соответствующие действия для типа. Сообщения не обрабатываемые в программе, должны обрабатываться Windows по умолчанию через функцию DefWindowProc(). Функция окна получает сообщения из двух источников: из цикла обработки сообщений – асинхронные сообщения и непосредсвенно от Windows –синхронные сообщения. Каждое сообщение имеет два параметра wParam и lParam, которые содержат дополнительную информацию, зависящую от типа сообщения.

Когда класс окна определён и зарегистрирован, приложение может создавать окна этого класса, используя функцию HWND СreateWindowEx(). Если создание окна выполнено успешно, функция CreateWindowEx() возвращает его дескриптор. Под дескриптором окна следует понимать уникальное, в рамках ОС, значение, которое ассоциировано с каждым окном. Именно через этот дескриптор производятся все операции с конкретным окном. В этой точке Windows, в своем ядре, создает персональную очередь сообщений для только что созданного окна. Сюда ОС будет помещать сообщения, адресованные данному окну. Параметры Для того, чтобы окно появилось на экране нужно вызвать функцию ShowWindow (hWnd, nCmdShow), которая принимает значение дескриптора окна и способ отображения окна - параметр, переданный через заголовок WinMain(). nCmdShow может принимать след. значения SW_HIDE – скрыть окно, SW_RESTORE – отобразить окно в нормальном представлении и др. Функция возвращает ненулевое значение, если до её вызова окно было отображено на экране.

После этого, мы заставляем окно перерисовать свое содержимое, обращаясь к функции UpdateWindow(hWnd), которая помещает сообщение WM_PAINT в очередь сообщений окна hWnd. За тем все сообщения которые поступили в очередь ыбираются функцией BOOL GetMessage(LPMSG msg, HWND hwnd, 0, 0); Как только в очереди сообщений появляется сообщение, функция GetMessage() заполняет структуру MSG, удаляет это сообщение из очереди и возвращает ненулевое значение. typedef struct tagMSG После этого, управление передается функции DispatchMessage(&msg), которая пересылает указатель на заполненную ранее структуру MSG обратно ядру Windows. ОС блокирует DispatchMessage() и вызывает оконную функцию с параметрами, соответствующими полям структуры MSG. Функция окна выполняет действия, которые были указаны (или не указаны) для обработки данного сообщения. После этого функция окна возвращает управление Windows, которая делает возврат из DispatchMessage(). Пока функция окна проводит обработку текущего сообщения, GetMessage() не может выбрать другое сообщение в следствии блокировки цикла в DispatchMessage(). => прежде чем перейти к обработке след. сообщения, функция окна закончит обработку предыдущего. (справедливо для асинхронных сообщений).

Так продолжается до тех пор пока в очереди сообщений не появится WM_QUIT. В этом случае GetMessage() возвращает нулевое значение, цикл while заканчивается, и приложение завершается. Функция PostQuitMessage(), посылая в очередь сообщений сообщение WM_QUIT, заставляет функцию WinMain() закончить цикл обработки сообщений и выйти в систему, завершив работу приложения.

Последовательность поступлений сообщений:

Функция окна получает сообщения из двух источников: из цикла обработки сообщений – асинхронные сообщения и непосредсвенно от Windows –синхронные сообщения. WM_CREATE – это первое сообщение, которое получает функция окна. Его особенность в том, что оконная функция получает его только один раз до возврата управления из функции CreateWindowEx(). Это означает, что окно создано не до конца и, следовательно, очередь сообщений еще отсутствует. Сообщение WM_CREATE является синхронным и посылается, минуя цикл обработки сообщений, который также еще не запущен. WM_SIZE – это второе сообщение, которое получает функция окна после создания. Кроме того, оно поступает всякий раз, когда пользователь уже изменил размеры окна. Сообщение передается через очередь сообщений. Так как в WinMain() как правило вызывается функция UpdateWindow() следовательно, Windows помещает в очередь приложения асинхронное сообщение WM_PAINT – которое возможно будет третьим сообщением которое получит функция окна после создания. Это сообщение сигнализирует окну, что вся его рабочая область или некоторая её часть становится недействительной и её следует перериросовать. При создании окна недействительна вся его рабочая область.

С другой стороны сообщение WM_PAINT является низкоприоритетным и ОС помещает его в очередь сообщений только тогда когда там нет других необработанных сообщений.

Подавляющее большинство Windows программ включает множество графических элементов, называемых ресурсами. Ресурсы – это объекты, которые используются в программе, но не определяются в ней. К ресурсам относятся: меню, диалоги, панели управления, акселераторы, иконки битмапы, курсоры, строковые таблицы и т.д. Все эти ресурсы размещаются в файле ресурсов с расширением *.rc и создаются по известным спецификациям в текстовом формате