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

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

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

дании таймера. Более подробно таймер будет рассмотрен ниже
WMCOMMANDT Посылается, когда был выбран какой-либо пункт меню, обработан акселератор или когда дочерний элемент управления отправляет сообщение роди-__тельскому окну _
Код сообщения передается в оконную процедуру в качестве параметра uMsg. Обычная оконная процедура обрабатывает отдельные сообщения, а те, что не обрабатывает сама, передает в оконную процедуру по умолчанию, которая имеет прототип:
LRESULT DefWindowProc(HWND hWnd. UINT Msg. WPARAM wParam. LPARAM IParam);
Обратите внимание, что оконная процедура по умолчанию имеет тот же тип возвращаемого результата и тот же список параметров, что и обыкновенная оконная процедура. Различие состоит в том, что код «умолчательной» оконной процедуры располагается в Windows и эта процедура умеет обрабатывать все сообщения кроме WM DESTROY. Данное сообщение должно обрабатываться явно, так как в ответ на него в очередь сообщений необходимо поместить WM QUIT, чего DefWindowProc не делает. Естественно, то, что умеет делать DefWindowProc, это лишь действия по умолчанию. В большинстве случаев «действие по умолчанию» означает «ничего». Тем не менее любое не обработанное явным образом сообщение необходимо передавать в оконную процедуру по умолчанию.
Рассмотрим обычную для Windows-программ оконную процедуру. Она несколько отличается от того, что мы видели в листинге 1.1, однако выполняет абсолютно те же самые действия.
LRESULT CALLBACK WndProc(HWND hWnd. UINT msg. WPARAM wParam. LPARAM lParam){ switch(msg)
{
Базовое приложение для Windows 9X/NT
37
case WM CREATE:
i f (! SetTi mer (hWnd .TIMERID, TIMERRATE. NULL)) return (-1L); return (OL); case WMTIMER:
MessageBeep(OxFFFFFFFF); return (OL): case WM DESTROY:
KillTimer(hWnd, TIMERID);
PostQuitMessage(O): return (OL); default:
return DefWi ndowProc(hWnd,msg,wParam,1Param);
}
}
В этой оконной процедуре явно обрабатываются лишь сообщения WM CREATE, WMJ1MER и WM DESTROY.
Распаковщики сообщений
Уже этот небольшой листинг дает представление о том, во что может превратиться оконная процедура при обработке хотя бы 5-6 сообщений. Но этого мало. Каждое из сообщений несет дополнительную информацию в параметрах wParam и lParam, которые в данной процедуре в силу ее простоты не используются. В результате оконная процедура программы средней сложности превращается в устрашающего вида оператор switch, трудно модифицируемый и еще труднее читаемый. Кроме того, для каждого сообщения дополнительная информация пакуется в wParam и lParam совершенно различными способами (чтобы их узнать, необходимо читать документацию). Ко всему прочему, способ упаковки, что не столь важно, однако неприятно, зависит еще и от версии Windows: Winl6 и Win32 делают это для некоторых сообщений по-разному.
Для решения этих проблем и предназначены распаковщики сообщений (message crackers). Эти специальные макросы содержатся в заголовочном файле WINDOWSX.H и позволяют оформлять обработку каждого оконного сообщения в виде отдельной функции. Прототипы этих функций можно найти в том же файле WINDOWSX.H. Для этого отыскивается распаковщик для соответствующего сообщения и в комментарии, расположенном выше макроса, узнаемся необходимый прототип. Рассмотрим, например, такой фрагмент WINDOWSX.H:
/*B00L Cls_OnCreate(HWND hwnd. LPCREATESTRUfit lpCreateStruct)*/
#define HANDLE_WM_CREATE(hwnd, wParam, lParam, fn) \
((fnK(hwnd), (LPCREATESTRUCT)(lParam)) ? OL,: (LRESULT)-IL)
В комментарии, расположенном над распаковщиком, указан прототип функции, которую нужно использовать для обработки сообщения WM CREATE. Естественно, название функции можно изменять (хотя зачем, кроме приставки Cls_?), но список параметров должен оставаться прежним. Один из возможных способов использования этого распаковщика в оконной процедуре имеет следующий вид: case WM CREATE:
return HANDLE WM CREATE(hWnd, wParam, lParam, FirstAppOnCreate); при условии, что прототип функции FirstApp OnCreate выглядит, как показано в комментарии. Обратите внимание на то, что функция возвращает значение типа B00L, а распаковщик, в зависимости от возвращаемого функцией значения, делает результатом своей работы либо 0L, либо -1L. То есть именно те значения, кото-
38
Урок 1 • Основы программирования на C/C++ для Windows 9X/NT
рые требует документация. Программист же может работать с более естественным для него логическим типом и использовать TRUE для создания окна, либо FALSE, если окно не должно быть создано. Распаковщик преобразует 1 Рагаш к типу LPCREATESTRUCT и передает переменную этого типа внутрь функции FirstApp_ OnCreate.
Но самое приятное, что предыдущий пример можно записать гораздо короче и понятнее:
HANDLE_MSG(hWnd. WMCREATE. Fi г stApp_OnCreate);
Именно так и было сделано в программе, представленной в листинге 1.1. Макрос, который позволяет это делать:
#define HANDLE_MSG(hwnd, message, fn) \
case (message): return HANDLE_##message((hwnd), (wParam), (IParam), (fn))
является всего лишь надстройкой над распаковщиками сообщений, но, согласитесь, очень удобной надстройкой. Это отчасти напоминает знаменитые MESSAGE^ МАР, которыми так гордятся сторонники объектно-ориентированного подхода к разработке программ от MFC. Используя распаковщики из WINDOWSX.H, можно писать структурированные, легко понимаемые и сопровождаемые, а значит, и более надежные программы. И что немаловажно, распаковщики являются всего лишь макросами, которые удаляются из текста программы еще на этапе препроцессор-ной обработки, не добавляют никакой лишней работы компилятору и не сказываются на эффективности программы.
Предыдущая << 1 .. 10 11 12 13 14 15 < 16 > 17 18 19 20 21 22 .. 229 >> Следующая
Книги
Web-программирован-
ие
Аппаратное обеспечение Графика Руководство по П.О. Самоучитель Теория программирования Фотошоп Языки программирования
Новые книги
Вирт Н. "Систематическое программирование " (Теория программирования)

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

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

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

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