Ёлочные игрушки, или Новый год по-дельфийски

Привет всем. Под Новый год я решил снова порадовать вас очередной порцией кодинга. Задача перед нами стоит простая – забабахать какую-нибудь милую мини-заставку, которая в любой момент создала бы так необходимую нам атмосферу новогоднего праздника.

А решил я сделать вот что — поместить на рабочий стол рождественскую ёлку, которую можно было бы поставить в любое удобное место и повесить на неё ёлочные игрушки. Ну и, конечно же, как без обратного отсчёта до заветного 23:59 31.12.

Состав блюда
Итак, чтобы приготовить нашу маленькую зелёную красавицу нам необходимо: Delphi — 1шт., прямые руки программиста — 2 шт., картинка с ёлкой — 1 шт., ёлочные игрушки и гирлянды — по вкусу.
Находим в Интернете изображение ели и помещаем её на одноцветный фон, чтобы его можно было сделать прозрачным. То же самое делаем с шариками и игрушками. У Зигмунда в Фотошопе это вышло совсем ужасно; надеюсь, вы воспользуетесь помощью художников, чтобы не портить впечатление от программы. Ну вот, теперь кажется всё готово.

Рецепт
Итак, в Delphi создаём новое приложение и сразу же делаем вот что — переходим в код проекта Project/View Source и добавляем там следующее:

Application.CreateForm(TForm1, Form1);
ShowWindow(Application.Handle,SW_HIDE);

Так мы скрыли наше приложение на панели задач — оно там совсем ни к чему и будет только вид портить.
У формы скроем рамку (свойство BorderStyle:=bsNone) и сделаем её прозрачной — TransparentColor:=True, при этом свойства Color и TransparentColorValue должны совпадать.
На самой форме разместим компонент TImage и TPopupMenu. В TImage будем загружать изображение ёлочки. Чтобы фон у изображения был прозрачным, просто установите значение Transparent:=True.
TPopupMenu — контекстное меню, которое будет всплывать, когда мы щёлкаем правой кнопкой мыши по ёлке. Я указал в меню пункты «Переставить ёлку», «Поверх всех окон», «Инфо» и «Выход». Чтобы контекстное меню вызывалось при щелчке по изображению ёлки — укажите в параметре PopupMenu компонента TImage наш компонент TPopupImage. Для каждой строки меню нам нужно прописать только процедуру Click. Думаю, событие щелчка по пунктам «Выход» и «Инфо» вы сможете прописать сами. Обратимся к реализации перемещения ёлки.
При запуске программы, мы видим только изображение ели, рамок формы нет и сама она прозрачна. Самое простое — показать рамки формы, чтобы пользователь смог её перетащить, а затем снова скрыть их. В коде: NMove — это имя пункта меню «Переставить ёлку».

NMove.Checked:=not NMove.Checked;
if NMove.Checked
 then Form1.BorderStyle:=bsToolWindow
 else Form1.BorderStyle:=bsNone;

Когда пользователь щёлкнет по «Переставлять ёлку», форма примет свой обычный вид, а напротив пункта появится галочка. При повторном щелчке — всё вернётся к изначальному состоянию.
Чтобы ёлочка стояла всегда поверх всех окон, в процедуре щелчка по соответствующему пункту пишем (NStayTop — имя пункта меню «Поверх всех окон»).

NStayTop.Checked:=not StayTop.Checked;
if N3.Checked
 then Form1.FormStyle:=fsStayOnTop
 else Form1.FormStyle:=fsNormal;

Здесь принцип такой же, как и в предыдущем случае.
Теперь самое вкусное — добавляем возможность вешать на ёлку шарики. Для этого напишем свою процедуру и будем вызывать её в событии MouseUp нашего компонента TImage (в теле события пишем PutBall(x,y);).
Вот сама процедура:

procedure TForm1.PutBall(x,y:integer);
var Ball: TBitmap;
begin
 Ball:=TBitmap.Create;
 Ball.LoadFromFile(path+’Data\ball.bmp’);
 Ball.Height:=16; Ball.Width:=16;
 Ball.Transparent:=True;
 Ball.TransparentColor:=Ball.Canvas.Pixels[0,0];
 Form1.Canvas.Draw(x,y,Ball);
end;

Создаём обычный TBitmap, грузим в него изображение шарика, делаем фон прозрачным и отрисовываем его на форме в точке щелчка мыши. Размеры я указал свои, вам возможно, придётся установить другие значения, в зависимости от размеров самого дерева.

Подаём на стол
За бортом осталось создание таймера, который бы отсчитывал время до наступления Нового года. Думаю, у вас не должно возникнуть трудностей в решении этой задачи. Нужно воспользоваться переменной типа TSystemTime, из которой мы можем извлечь все необходимые нам значения (wHour, wMinute, wDay, wMonth). Надеюсь, вы сможете найти разность между текущим временем и временем окончания года.
Ещё одна проблема, с которой вы столкнётесь, — стирание всех bitmap’ов при отрисовке формы (отрисовка произойдёт, когда мы будем показывать/скрывать рамки). Можно создать дополнительный массив с координатами всех шариков и процедуру, которая бы возвращала все игрушки на их законные места. Можно также добавить дополнительный пункт меню, который бы снимал все шарики с ёлки — в событии нужно всего лишь обратиться к процедуре перерисовки формы.

Разумеется, мы можем несколько раз запустить приложение и устроить на рабочем столе небольшой лесной массив. Have fun!


Рекомендуем почитать: