Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Alexaev_OS_1.doc
Скачиваний:
3
Добавлен:
27.09.2019
Размер:
276.99 Кб
Скачать

1. Создайте новое приложение в Delphi и назовите его TestMessages, а главную форму Test, изменив свойство Name.

В результате создания VCL приложения, получился следующий код формы:

unit Unit1;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs;

type

TTest = class(TForm)

private

{ Private declarations }

public

{ Public declarations }

end;

var

Test: TTest;

implementation

{$R *.dfm}

end.

Исходный код приложения имеет вид:

program TestMessages;

uses

Forms,

Unit1 in 'Unit1.pas' {Test};

{$R *.res}

begin

Application.Initialize;

Application.CreateForm(TTest, Test);

Application.Run;

end.

Компиляция данной программы прошла успешно, результат ее выполнения представлен на рис.1.

рис.1. Результат работы программы

2. Напишите Windows-приложение с нуля. Для этого удалите из исходного текста приложения все кроме program, begin, end.

program TestMessages;

begin

end.

3. Запустите и посмотрите размер исполняемого файла (около 15 Кб).

Компиляция программы прошла успешно, после запуска ничего не произошло, размер исполняемого файла составляет 17 Кб, что чуть больше, чем ожидалось.

4. Добавьте цикл обработки сообщений – главное для Windows-приложений. Минимальный код программы см. В Приложении а.

program TestMessages;

uses

Windows, Messages;

const

AppName = 'Test';

Var

Window: HWnd; {Ссылка на окно, позволяет однозначно определить каждое окно}

Message: TMsg; {Сообщение – реакция ядра Windows на какое-либо событие}

WindowClass: TWndClass; {Структура класса окна, включает адрес оконной функции, обрабатывающей поступающие от Windows сообщения, атрибуты всех окон, принадлежащих этому классу, т.е. задаются основные свойства класса}

{Специальная оконная функция, обрабатывающая сообщения, посылаемые окну. Вызывается непосредственно ядром Windows (косвенно-вызываемая – callback function). Параметры эквивалентны полям структуры типа TMsg}

function WindowProc (Window : HWnd; Message, WParam : LongInt; LParam : LongInt) : LongInt; stdcall;

begin

WindowProc := 0;

{Здесь указывается реакция оконной функции на сообщения Windows:}

case Message of

{Ядро Windows пытается закрыть окно – обработку этого сообщения нельзя опускать}

wm_Destroy:

begin

{Посылает прикладной программе сообщение wm_Quit код 0 – успешное завершение}

PostQuitMessage (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, {Имя класса, к которому принадлежит создаваемое окно}

'Моя форма', {Заголовок окна}

ws_OverlappedWindow, {Стиль окна, в данном случае – комбинация стилей}

cw_UseDefault, {X – начальная позиция верхнего левого угла, в данном случае – значение по умолчанию}

cw_UseDefault, {Y – начальная позиция верхнего левого угла, в данном случае – значение по умолчанию}

800, {Width – начальная ширина окна, в данном случае – значение по умолчанию}

600, {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.

рис.2. Результат работы программы

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]