program WinMin;
{************ М.И.Н.И.М.А.Л.Ь.Н.А.Я. П.Р.О.Г.Р.А.М.М.А. *****************}
{* Среда Windows управляет программой посредством посылки сообщений. *}
{* Прикладная программа, обрабатывая посылаемые ей сообщения, выполняет *}
{* необходимые действия, заложенные её функциональным назначением. *}
{* Windows - программа состоит из трёх частей: *}
{* Инициализация - регистрация класса окна, создание и отображение окна.*}
{* Выполнение - цикл обработки сообщений. *}
{* Завершение - закрытие окна и возврат в среду Windows. *}
{************************************************************************}
uses
Windows,Messages;
const
AppName = 'WinMin';
Var
Window : HWnd; { ссылка на окно, позволяет однозначно определить каждое окно. HWND = type LongWord }
Message : TMsg; { сообщение - реакция ядра Windows на какое-либо событие }
WindowClass : TWndClass; { структура класса окна, включает адрес "оконной" функции, обрабатывающей
поступающие от Windows сообщения, атрибуты всех окон, принадлежащих
этому классу, т.е. задаются основные свойства класса }
// Специальная "оконная" функция, обрабатывающая сообщения, посылаемые окну.
// Вызывается непосредственно ядром Windows (косвенно-вызываемая - callback function).
// Параметры эквивалентны полям структуры типа TMsg.
function WindowProc (Window : HWnd; Message, WParam : Word;
LParam : LongInt) : LongInt; stdcall;
Var
dc : HDC; { ссылка на контекст, должна использоваться для работы с окном }
Begin
WindowProc := 0;
// Здесь указывается реакция оконной функции на сообщения Windows.
case Message of
wm_Destroy : begin { ядро Windows пытается закрыть окно - обработку этого сообщения нельзя опускать }
PostQuitMessage (0); { посылает прикладной программе сообщение wm_Quit код 0 - успешное завершение }
Exit; { выход из текущей процедуры}
end;
wm_Create: begin { ядро Windows пытается создать окно } (* если контекст окна больше не используется, это сообщение можно не обрабатывать *)
dc := GetDC (Window); { GetDC возвращает контекст рабочей области окна }
ReleaseDC (Window, dc); { освобождает контекст }
end;
end; // case
// Все сообщения, не обрабатываемые оконной функцией, передаются функции ядра Windows DefWindowProc.
WindowProc := DefWindowProc (Window, Message, WParam, LParam); { DefWindowProc обеспечивает обработку тех сообщений окна, которые не обрабатывает прикладная программа }
End;
// Процедура WinMain создает и регистрирует класс окна,
// затем создаёт и отображает окно на экране и активизирует цикл
// работы с сообщениями.
procedure WinMain;
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;
// Процедура WinMain - точка входа в программу, которая получает
// управление от ядра Windows.
begin
WinMain;
end.
|