{**********************************************************************} {* Иллюстрация к книге "OpenGL в проектах Delphi" *} {* Краснов М.В. softgl@chat.ru *} {**********************************************************************} {************ М.И.Н.И.М.А.Л.Ь.Н.А.Я. П.Р.О.Г.Р.А.М.М.А. *****************} {* Среда Windows управляет программой посредством посылки сообщений. *} {* Прикладная программа, обрабатывая посылаемые ей сообщения, выполняет *} {* необходимые действия, заложенные её функциональным назначением. *} {* Windows - программа состоит из трёх частей: *} {* - инициализация: регистрация класса окна, создание и отображение окна.*} {* - выполнение - цикл обработки сообщений. *} {* - завершение - закрытие окна и возврат в среду Windows. *} {************************************************************************} program WinMin; uses Windows, Messages; const AppName = 'WinMin'; Var Window : HWnd; {Ссылка на окно, позволяет однозначно определить каждое окно.} Message : TMsg; {Сообщение - реакция ядра Windows на какое-либо событие.} WindowClass : TWndClass; {Структура класса окна, включает адрес "оконной" функции, обрабатывающей поступающие от Windows сообщения, атрибуты всех окон, принадлежащих этому классу, т.е. задаются основные свойства класса.} // Специальная "оконная" функция, обрабатывающая сообщения, посылаемые окну. // Вызывается непосредственно ядром Windows (косвенно-вызываемая - callback function). // Параметры эквивалентны полям структуры типа TMsg. function WindowProc (Window : HWnd; Message, WParam : Word; LParam : LongInt) : LongInt; stdcall; begin WindowProc := 0; // Здесь указывается реакция оконной функции на сообщения Windows. case Message of wm_Destroy : begin {Ядро Windows пытается закрыть окно - обработку этого сообщения нельзя опускать.} PostQuitMessage (0); {Посылает прикладной программе сообщение wm_Quit код 0 - успешное завершение.} Exit; {Выход из текущей процедуры.} end; end; // case // Все сообщения, не обрабатываемые оконной функцией, передаются функции ядра Windows DefWindowProc. WindowProc := DefWindowProc (Window, Message, WParam, LParam); {DefWindowProc обеспечивает обработку тех сообщений окна, которые не обрабатывает прикладная программа.} end; // Точка входа в программу, которая получает управление от ядра Windows. begin // Всем полям структуры присваиваются определённые значения (определяются атрибуты окна). with WindowClass do begin Style := cs_HRedraw or cs_VRedraw; {Стиль окна класса: окно будет перерисовываться при изменении его горизонтальных и вертикальных размеров.} lpfnWndProc := @WindowProc; {Указатель на оконную функцию, которая будет обрабатывать все сообщения, посылаемые окну.} cbClsExtra := 0; {Выделенная память, используемая программой по своему усмотрению.} cbWndExtra := 0; {Выделенная память, используемая программой по своему усмотрению.} hInstance := 0; {Ссылка на экземпляр программы, используется ядром Windows для однозначного определения сегмента данных экземпляра программы.} hIcon := LoadIcon (0, idi_Application); {Ссылка на иконку для окна, для отображения минимизированного окна, сейчас - иконка, соответствующая приложению.} hCursor := LoadCursor (0, idc_Arrow); {Ссылка на курсор, сейчас - в виде стрелки.} hbrBackground := GetStockObject (White_Brush); {Ссылка на шаблон заполнения фона для окна.} lpszMenuName := ''; {Ссылка на строку имени меню.} lpszClassName := AppName; {Имя класса.} end; // Регистрация окна с заданными атрибутами. // Параметр функции - структура типа TWndClass, содержащая атрибуты окон данного класса. If RegisterClass (WindowClass) = 0 then Halt (255); {Регистрация невозможна, завершение работы программы.} Window := CreateWindow {Создает окно и возвращает ссылку на окно типа HWnd.} (AppName, {Имя класса, к которому принадлежит создаваемое окно.} 'Win_Min', {Заголовок окна.} ws_OverlappedWindow, {Стиль окна, сейчас - комбинация стилей.} cw_UseDefault, {X - начальная позиция верхнего левого угла, сейчас - значение по умолчанию.} cw_UseDefault, {Y - начальная позиция верхнего левого угла, сейчас - значение по умолчанию.} cw_UseDefault, {Width - начальная ширина окна, сейчас - значение по умолчанию.} cw_UseDefault, {Height - начальная ширина окна, сейчас - значение по умолчанию.} 0, {WndParent - родительское окно данного окна.} 0, {Menu - меню, используемое данным окном.} HInstance, {Instance - указывает на экземпляр программы. этот параметр указывается, чтобы оконная функция имела доступ к сегменту данных программы.} nil); {Param - определяет дополнительную информацию, посылаемую через сообщение wm_Create.} // Окно создано, его необходимо отбразить на экране. ShowWindow (Window, CmdShow); {Отображает или делает невидимым указанное окно.} UpdateWindow (Window); {Указывает прикладной программе, что часть окна нуждается в перерисовке.} // После того, как окно отбражено на экране, управление передаётся циклу обработки сообщений. // GetMessage извлекает сообщения из очереди и помещается в структуру типа TMsg. // Для всех сообщений, отличных от wm_Quit (завершение работы программы), эта // функция возвращает ненулевое значение и цикл продолжает обработку сообщений. while GetMessage (Message, 0, 0, 0) do { GetMessage возвращает сообщение из очереди GetMessagePos } begin // TranslateMessage передает структуру типа TMsg ядру Windows для преобразования сообщений о введенных символах TranslateMessage (Message); {Переводит сообщение виртуальных клавиш в символьное сообщение.} DispatchMessage (Message); {Передает сообщение оконной функции указанного окна.} {После того, как оконная функция обработала сообщение, управление возвращается} {в цикл обработки сообщений.} end;// конец цикла обработки сообщений Halt (Message.wParam); {Программа завершается.} end.