Работа с файлами и мультимедиа


Компоненты Timer и PaintBox


Download 361.5 Kb.
bet7/9
Sana20.10.2023
Hajmi361.5 Kb.
#1711567
TuriЛекции
1   2   3   4   5   6   7   8   9
Bog'liq
Работа с файлами и мультимедиа

Компоненты Timer и PaintBox
По соседству с MediaPlayer на закладке System располагаются еще несколько компонентов, среди которых - Timer и PaintBox. Компонент PaintBox, или область рисования, являются упрощенным вариантом компонента Image: на нем можно рисовать, но он не содержит свойств, при помощи которых можно было бы ассоциировать с ним изображение. Фактически, основным предназначением этого компонента является вывод графики через его холст (свойство Canvas). Собственно говоря, никаких иных свойств, кроме унаследованных от класса TGraphicControl, этот компонент и не имеет, так что можно считать его практическим воплощением этого класса.
Другой компонент - Timer, или таймер - это невизуальный компонент, который инкапсулирует в себе функции Windows API по взаимодействию с системным таймером. Он имеет всего 2 свойства - Enabled и Interval. Свойство Enabled делает таймер активным или неактивным, а свойство Interval задает промежуток времени (в миллисекундах), через который будет возникать событие OnTimer. Событие OnTimer - это единственное событие этого компонента, оно происходит, через промежуток времени, заданный свойством Interval, если свойство Enabled установлено в истину.
Применение таймера может быть самым разнообразным, но первое, что приходит на ум - это реализация часов. Некоторые старожилы, возможно, помнят те времена, когда на компьютерах устанавливалась система Windows 3.1. Нас она в данном случае интересует с той точки зрения, что в ней была программа, представляющая собой часы, выглядящие как аналоговые. Попробуем реализовать такую программу для современных версий Windows, воспользовавшись компонентами Timer и PaintBox.
Для начала создадим новое приложение, назовем его Clock, а главную форму, по традиции - MainFrm. Затем поместим на форму метку, чтобы видеть время в цифровом формате (назовем ее DigitalLbl), и область рисования для отображения времени в аналоговом формате (AnalogPB). Зададим для метки крупный шрифт, а для области рисования установим размер 110 на 110 точек. Ну и, разумеется, нужен еще и сам таймер - назовем его ClockTmr.
Начнем с самого простого - вывода времени в цифровом формате. Для этого в обработчике события OnTimer достаточно написать всего одну строчку:
DigitalLbl.Caption:=TimeToStr(now);
Если учитывать, что по умолчанию принят интервал в 1 секунду, а сам таймер активен, то мы получим работающие часы. Кроме того, можно добавить вывод времени непосредственно в заголовок приложения, чтобы даже в свернутом виде можно было узнать время, взглянув на панель задач. Для этого достаточно изменять значение свойства Title глобального объекта Application:
Application.Title:=DigitalLbl.Caption;
Но, разумеется, гораздо больше кода потребуется написать для того, чтобы выводить время в аналоговом формате. Создадим для этих целей отдельную функцию-метод формы, которая будет принимать значение времени и выводить его на циферблате. Соответственно, она будет находиться в части public класса TMainFrm и будет определяться следующим образом:
procedure DrawClock(t: TTime);
Теперь займемся этой процедурой вплотную. Прежде всего, нам понадобится выводить циферблат часов. В принципе, можно его нарисовать в графическом редакторе и выводить при помощи метода Draw. Тем не менее, мы пойдем другим путем и будем его чертить программными методами. Поскольку мы имеем дело с окружностью, то для начала выведем эллипс, предварительно выбрав цвет фона:
AnalogPB.Canvas.Brush.Color:=clWhite; AnalogPB.Canvas.Ellipse(3,3,108,108);
Затем начертим метки, но для начала определим интервал шага по окружности. Раз мы делаем часы, то пусть этот шаг будет равен 60. Соответственно, по известной формуле, мы получим размер шага (назовем его step, это должна быть переменная типа Double), равный 2?/60:
step:=2*pi/60;
Теперь можно вывести сами метки, начертим их в виде линий с интервалом в 5 минут или, если придерживаться более традиционной, часовой терминологии - по одной на каждый час. Для этого создадим цикл, который 12 раз будет чертить линию от центра окружности к ее периметру:
for i:=0 to 11 do begin AnalogPB.Canvas.MoveTo(55,55); x:=55+Round(52*sin(i*step*5)); //55 - центр окружности, 52 - длина линии y:=55-Round(52*cos(i*step*5)); AnalogPB.Canvas.LineTo(x,y); end;
В результате мы получим "пирог", поделенный на 12 частей (рис. 15.5, слева). Скроем часть линий, нарисовав поверх них еще одну окружность меньшего диаметра, чтобы получить более похожее на настоящее часы оформление (рис. 15.5, справа):
AnalogPB.Canvas.Ellipse(7,7,104,104);

Рис. 15.5. Подготовка циферблата аналоговых часов
Итак, циферблат готов, можно приступить к стрелкам. В качестве подготовительной работы разложим полученное процедурой время (t) на составляющие - часы, минуты и секунды, для чего нам понадобятся 4 целых переменных типа Word:
var h,m,s,ms: word; ... DecodeTime(t,h,m,s,ms);
Теперь нарисуем самое простое - секундную стрелку: она должна перемещаться безо всяких дополнительных коэффициентов, строго по вычисленному шагу (step). При этом она еще и должна быть самой длинной и самой тонкой. Толщину можно уменьшить визуально при помощи более светлого, по сравнению с черным цвета, например, темно-серого. В результате мы получим следующий код:
AnalogPB.Canvas.MoveTo(55,55); x:=55+Round(49*sin(s*step)); y:=55-Round(49*cos(s*step)); AnalogPB.Canvas.Pen.Color:=clGray; AnalogPB.Canvas.LineTo(x,y);
Следующей будет минутная стрелка. Поскольку минут тоже 60, то, в простейшем случае, для вычисления координат окончания линии мы могли бы воспользоваться той же формулой, что и для секунд, заменив лишь переменную s на m. Но если для секундной стрелки дискретное движение нормально, то для минутной не совсем годится (а для часовой будет вообще не приемлемо). Поэтому нам придется вычислять промежуточное значение, чтобы учитывать секунды, прошедшие с начала минуты:
c:=(m*60+s)/60;
Соответственно, после этого останется вычислить координаты на основе получившегося значения, не забыв вернуть черный цвет и сделать стрелку короче:
x:=55+Round(43*sin(c*step)); y:=55-Round(43*cos(c*step)); AnalogPB.Canvas.Pen.Color:=clBlack; AnalogPB.Canvas.LineTo(x,y);
На последок определимся с часами. Здесь, помимо уже известного решения проблемы с плавным перемещением стрелки, имеется еще 2 вопроса, а именно - необходимость повышающего коэффициента перемещения (т.к. часов меньше 60), и перевод 24-часового формата в 12-часовой. Вопрос с форматом решается просто: достаточно проверять переменную h на то, не больше ли она 12, и если да - то уменьшать ее на 12. На этом основании можно будет вводить коэффициент, равный 5 (60/12):
if h>12 then h:=h-12; c:=(h*60+m)/60*5;
После этого остается вычислить значения и нарисовать короткую толстую стрелку, не забыв после этого вернуть толщину линии обратно:
x:=55+Round(33*sin(c*step)); y:=55-Round(33*cos(c*step)); AnalogPB.Canvas.Pen.Width:=2; AnalogPB.Canvas.LineTo(x,y); AnalogPB.Canvas.Pen.Width:=1;
Последним штрихом может быть изменение оформление окна - для такого приложения лучше всего будет установить свойство BorderStyle в bsToolWindow (рис. 15.6).

Рис. 15.6. Работающие "аналоговые" часы, написанные на Delphi
Еще одним дополнением может стать размещение окна с часами в нижнем левом углу экрана, для чего в обработчике OnCreate главной формы следует предусмотреть соответствующий код. Итоговый код программы приведен в листинге 15.2.

Download 361.5 Kb.

Do'stlaringiz bilan baham:
1   2   3   4   5   6   7   8   9




Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling