Компьютерные книги
Главное меню
Главная Поиск по сайту Добавить материал О нас Карта книг Карта сайта
Реклама
computersbooks.net -> Добавить материал -> Графика -> Гончаров Д. -> "DirectX 7.0 Для программистов" -> 14

DirectX 7.0 Для программистов - Гончаров Д.

Гончаров Д., Салихо Т. DirectX 7.0 Для программистов — Спб.: Питер, 2001. — 528 c.
ISBN 5-318-00173-4
Скачать (прямая ссылка): dirext7dlyaprogrammistov2001.djvu
Предыдущая << 1 .. 8 9 10 11 12 13 < 14 > 15 16 17 18 19 20 .. 229 >> Следующая

LRESULT SendMessage(
HWND hWnd, //Дескриптор окна
UINT Msg, //Номер сообщения
WPARAM wParam, //Первый параметр LPARAM IParam //Второй параметр
);
Она посылает указанное сообщение в окно, определяемое дескриптором hWnd, и не возвращает управление до тех пор, пока сообщение не будет обработано, то есть до тех пор, пока не произойдет возврат из оконной процедуры. Синхронность в данном случае подразумевает возможность предсказать, в какой момент времени (конкретно, после какого оператора) произойдет обработка сообщения.
Асинхронный способ реализуется при помощи очереди сообщений, организуемой для каждого приложения (точнее, для каждого потока приложения, который может принимать пользовательский ввод). Операционная система помещает в эту
Базовое приложение для Windows,9X/NT
33
.очередь сообщения, которые могут касаться работающей программы. Список сообщений весьма обширен, и мы рассмотрим его чуть позже при обсуждении оконной процедуры. Приложение выбирает из своей очереди адресованные ему сообщения и обрабатывает их по мере поступления. Большую часть сообщений в очередь помещает операционная система, например, в ответ на действия пользователя, но есть функции, позволяющие это сделать и самому приложению. Среди них:
BOOL PostMessaget
HWND hWnd. //Дескриптор окна
UINT Msg. //Нонер сообщения
WPARAM wParam, //Первый параметр LPARAM lParam //Второй параметр
);
Разница между SendMessage и PostMessage состоит в том, что первая функция непосредственно вызывает оконную процедуру, передавая ей нужное сообщение, а вторая помещает это сообщение в очередь, связанную с создавшим окно программным потоком, и, не дожидаясь обработки сообщения, возвращает управление вызывающей функции. А уже приложение впоследствии извлечет сообщение из очереди и должным образом обработает. Эту схему и реализует цикл выборки сообщений.
Рассмотрим используемые в нем функции в порядке их появления.
BOOL GetMessage(
LPMSG lpMsg, //Информация о сообщении
HWND hWnd, //Дескриптор окна
UINT wMsgFilterMin, //Нижний диапазон сообщений UINT wMsgFilterMax //Верхний диапазон сообщений
);
Эта функция извлекает сообщение из очереди, связанной с вызывающим потоком, и помещает характеристики этого сообщения в структуру, адрес которой передается в параметре lpMsg. Если второй параметр равен NULL, то извлекаются сообщения, адресованные любому окну, принадлежащему данному потоку (это обычный способ). Два последних параметра представляют собой нижний и верхний диапазоны сообщений, которые необходимо извлекать из очереди. Такое возможно в силу того, что каждое сообщение идентифицируется беззнаковым числом. При извлечении любого сообщения, отличного от WMQUIT, функция GetMessage возвращает ненулевое значение. И только после извлечения WM QUIT возвращает нуль. Откуда в очереди возьмется сообщение WM QUIT, мы также обсудим при рассмотрении оконной процедуры. В заключение стоит упомянуть одну особенность функции GetMessage — ее вызов является блокирующим: если в очереди есть сообщение, то она заполняет структуру, адрес которой передается ей в первом параметре, и возвращает ненулевое значение. Если же в очереди сообщений нет, то она не вернет управление до тех пор, пока в очереди не появится сообщение. Эта особенность и позволяет написать цикл выборки сообщений в том виде, в каком он представлен в листинге 1.1.
Две другие функции значительно более просты:
BOOL TranslateMessage(CONST MSG *lpMsg);
LONG DispatchMessageCCONST MSG *1pMsg);
Обе они получают в качестве параметра адрес структуры типа MSG, поля которой заполнены предварительным вызовом функции GetMessage. Первая из нцх .трансли-
34
Урок 1 • Основы программирования на C/C++ для Windows 9X/NT
рует сообщение WMJCEYDOWN, несущее информацию о виртуальном коде нажатой клавиши, в сообщение WMCHAR, несущее информацию о соответствующем клавише символе. Поскольку в нашей программе обработка клавиатурного ввода, а тем более обработка печатаемого текста не предусмотрена, то этот оператор можно было бы спокойно пропустить. Вторая функция всего лишь вызывает оконную процедуру, передавая ей информацию о сообщении, полученную при помощи функции GetMessage.
Цикл выборки сообщений прекратится лишь тогда, когда из очереди сообщений будет извлечено сообщение WMQUIT и программе не останется ничего другого, как вернуть результирующее значение операционной системе и прекратить работу. Что и делает оператор return (msg.wParam);
На данный момент необходимо четко представлять последовательность шагов при создании Windows-приложения:
1. Зарегистрировать класс окна в Windows. Для этого нужно объявить структуру типа WNDCLASSEX, заполнить должным образом ее поля и вызвать функцию RegisterClassEx.
2. Создать на базе зарегистрированного класса окна конкретный экземпляр окна при помощи функции CreateWindowEx.
3. Вывести окно на экран при помощи функции ShowWindow. При необходимости вызвать оконную процедуру для обновления рабочей области функцией UpdateWindow.
4. Запустить цикл выборки сообщений. Обычно эти циклы не слишком отличаются для разных программ.
Предыдущая << 1 .. 8 9 10 11 12 13 < 14 > 15 16 17 18 19 20 .. 229 >> Следующая
Книги
Web-программирован-
ие
Аппаратное обеспечение Графика Руководство по П.О. Самоучитель Теория программирования Фотошоп Языки программирования
Новые книги
Вирт Н. "Систематическое программирование " (Теория программирования)

Эком "Microsoft Excel 2000 шаг за шагом Русская версия самоучитель " (Самоучитель)

Поляков А.Ю. "Методы и алгоритмы компьютерной графики в примерах Vizual C++" (Графика)

Баяковский Ю.М. "Графическая библиотека Open GL " (Графика)

Валиков А. "Технология " (Языки программирования)
Авторские права © 2013 ComputersBooks. Все права защищены.