
- •1. Создайте новое приложение в Delphi и назовите его TestMessages, а главную форму Test, изменив свойство Name.
- •2. Напишите Windows-приложение с нуля. Для этого удалите из исходного текста приложения все кроме program, begin, end.
- •3. Запустите и посмотрите размер исполняемого файла (около 15 Кб).
- •4. Добавьте цикл обработки сообщений – главное для Windows-приложений. Минимальный код программы см. В Приложении а.
- •5. Задайте окну серый цвет, переписав функцию обработки сообщений следующим образом:
- •7. Задайте различные цвета форме на событие создания окна, то есть на сообщение wm_create.
- •8. Получите высоту и ширину окна, обработав сообщение wm_size, и выведите их значения на форму (с помощью TextOut) или в виде сообщения (с помощью ShowMessage).
- •9. Выведите на форму (TextOut), текущий нажатый символ на клавиатуре (сообщение wm_char).
- •10. Модифицируйте свое приложение, так, чтобы при нажатии на форме левой кнопки мыши рисовался эллипс красного цвета, а при нажатии правой кнопки он исчезал.
- •Дайте определения событию и сообщению.
- •Перечислите основные действия, которые должно выполнять любое Windows-приложение.
- •Что понимается под диспетчированием?
- •Лабораторная работа
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. Результат работы программы