Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабы IT / ЛабаDelphi10.doc
Скачиваний:
54
Добавлен:
06.02.2015
Размер:
259.58 Кб
Скачать

3 Собственные обработчики событий

Существует третий вариант обработки сообщений. Написание своих собственных обработчиков сообщений. Это можно осуществить двумя способами. Либо заменить стандартный обработчик стандартного сообщения Windows своим собственным обработчиком, либо создать свое собственное оригинальное сообщение и написать

оригинальный обработчик для него.

Задание 3.1. Запрограммируем обработку сообщения на закрытие окна WM_CLOSE. Пусть при получении данного сообщения форма медленно “растворяется”.

В этом же проекте у Form1 установите значение 255 свойства AlphaBlendValue отвечающему за её прозрачность, а также значениеTrueсвойства AlphaBlend отвечающего за возможность “упрозрачнения” формы.

Далее скиньте Timer1 на форму. Установите его свойствоintervalравным 60, а свойствуEnabledприсвойте значение False (Таймер не должен быть активирован сначала)

Создайте обработчик таймера он должен выглядеть следующим образом:

procedure TForm1.Timer1Timer(Sender: TObject);

var R:TRect; S:string;

begin

AlphaBlendValue:=AlphaBlendValue-3;//увеличиваем прозрачность

ifAlphaBlendValue<=5thenclose;// закрываем приложение стандартной процедурой

// Close

R:=Form1.ClientRect;//Устанавливаем размер области для вывода текста

canvas.Font.Name:='Times New Roman';//Устанавливаем шрифт

canvas.Font.Color:=ClRED;// и цвет

canvas.Font.Style:=[fsItalic];// а также стиль

canvas.Font.Size:=100-AlphaBlendValue; // и меняющийся размер

S:='РАСТВОРЯЯЯ ЮСЬ'; // сам текст

canvas.TextRect(R,30,30,S); // вывод текстаSв областьRс координатами

end;

Теперь переопределим стандартный обработчик события WM_CLOSEсвоим собственным. В разделеpublicнапишите:

procedure WMCLOSE(var Message:TWMCLOSE); message WM_CLOSE; и нажмите Ctrl+Shift+C.

В появившейся обработчике просто напишите:

IfApplication.MessageBox('или стандартным способом?',

'Я закроюсь с растворением ',mb_YESNO)=IdYESthen

begin

timer1.Enabled:=true;// Активируем таймер

Message.Result:=0;// указываем ОС что приложение обрабатывает это сообщение

//для WM_CLOSEдолжно возвращать 0 если оно обрабатывается

end

else // иначе

inherited; //вызываем стандартный метод обработки данного сообщения

Таким образом, при попытке закрыть приложение, оно получит сообщение WM_CLOSEи вызовется ваш переопределённый метод, затем вы получите вопрос, если ответите ДА запустится таймер. А затем уже из таймера приложение закроется благодаря стандартному методуClose. А если ответите, НЕТ, вызовется родительский метод обработки сообщенияWM_CLOSEкоторый закроет ваше приложение.

Запустите программу. Попробуйте её закрыть. Программа должна работать правильно. Вернитесь в РП.

Функция SendMessage и PostMessage

Функция SendMessageсоздана для отправки сообщения другим объектам операционной системыWindows. ВDelphiона имеет следующий вид:

function SendMessage(hWnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;

hWnd– дескриптор объекта которому передается сообщение

Msg– само сообщение, его идентификатор

wParam– содержит дополнительную информацию

lParam– содержит дополнительную информацию

Она возвращает значение только когда приложение обработало сообщение. Этим она отличается от такой же функции PostMessageкоторая возвращается сразу как только сообщение отправлено.

Задание 3.2. Отправим сообщения закрыться, свернуться или развернуться Калькулятору и Блокноту.

Здесь же поместите на форму 3 кнопки Button, 2 кнопки с зависимой фиксациейRadioButtonустановите у одной из них значениеcheckedравнымTrue. Всё должно выглядеть примерно так:

Рис. 3Приложение запускающее, а затем сворачивающее или

разворачивающее стандартные приложения «Калькулятор» или «Блокнот»

В обработчике кнопки “Запуск Калькулятора и Блокнота” напишите:

WinExec('Calc',SW_Restore);//Запускаем Калькулятор

WinExec('Notepad',SW_Restore); //Запускаем Блокнот

Обработчик кнопки “Закрыть Калькулятор и Блокнот” должен выглядеть так:

var hWnd: THandle;

begin

hWnd:=FindWindow('SciCalc','Калькулятор'); //Определяем дескриптор окна класса

//'SciCalc' с надписью заголовка 'Калькулятор'

SendMessage(hWnd,WM_Close,0,0);//Отправляем сообщениеWM_CLOSEокну с

//данным дескриптором

hWnd:=FindWindow('Notepad',nil);// То же для Блокнота

SendMessage(hWnd,WM_Close,0,0);

end;

Обработчик кнопки “Свернуть или развернуть Всё” должен выглядеть так:

var hWnd: THandle;

begin

hWnd:=FindWindow('Notepad',nil); //Определяем дескриптор окна класса

//' Notepad' с любой надписью заголовка

if radiobutton1.Checked=true then // если выбрана первая кнопка

SendMessage(hWnd,WM_SYSCOMMAND,SC_MINIMIZE,0) // то сворачиваем

else // иначе

SendMessage(hWnd,WM_SYSCOMMAND,SC_MAXIMIZE,0); // разворачиваем

hWnd:=FindWindow('SciCalc','Калькулятор');

if radiobutton1.Checked=true then

SendMessage(hWnd,WM_SYSCOMMAND,SC_MINIMIZE,0)

else

SendMessage(hWnd,WM_SYSCOMMAND,SC_MAXIMIZE,0);

end;

Запустите программу. Программа должна работать правильно. Вернитесь в РП.

Соседние файлы в папке Лабы IT