Показать сообщение отдельно
Старый 29.04.2014, 01:09   #1
broveymimo
Эксперт
Аватар для broveymimo
OFFLINE
Регистрация: 30.03.2009
Возраст: 47
Сообщений: 905
Благодарностей:
839 всего
Мнения: + 2185
Репутация: 2468

[FMX] Стильные часики


Надоело мне ковыряться с VCL библиотеками и решил я попробовать что есть такое FireMonkey.

Для примерчика попробовал оживить вот такие вот часики.



Решил не заморачиваться с фигурным вырезанием стрелок, а просто удалил их в фотошопе. Потом вырезал сами часы из фона и сохранил их как png с прозрачным фоном.



Далее, создал новый проект FireMonkey Desctop Application



На форму кидаем объект TImage. Но у него не оказалось свойства Picture, как у аналогичного в VCL. Зато есть MultiResBitmap. Значит сюда и загрузим наш циферблат.

Далее, во вкладке Shapes находим объекты TRectangle.



Рисуем из них стрелки (часовую, минутную и секундную).
Для их позиционирования вместо привычных Top и Left используем проперти Position (x, y). Должно получиться что-то в этом роде:



Стрелки я для удобства переименовал в aHour, aMin, aSec.

Теперь для каждой стрелки в свойстве RotationAngle создаем TFloatAnimation. И выставляем для следующие проперти. Enabled=true; Loop=true; StartValue=0; StopValue=360. Duration для секундной стрелки 60, для минутной 3600, для часовой 86400.

Анимации я переименовал в anHour, anMin, anSec.

У меня получилась вот такая структура объектов на форме.



Не забываем указать центр вращения стрелок в пропертях RotationCenter x=0,5 y=0,98.

Пока не забыли, ставим проперти формы Transparency=true.

Наши часы готовы. Теперь необходимо выставить на них правильное время.

Код:
unsigned short wHour, wMin, wSec, wMSec;
	DecodeTime(Now(), wHour, wMin, wSec, wMSec);

	anSec->StartValue = wSec*360/60;
	anSec->StopValue = anSec->StartValue + 360;

	anMin->StartValue = wMin*360/60;
	anMin->StopValue = anMin->StartValue + 360;

	anHour->StartValue = wHour%12*360/12 + wMin*360/720;
	anHour->StopValue = anHour->StartValue + 360;
Так как вы делаем форму невидимой, то кнопки закрытия окна у нас тоже отсутсвуют. Я решил закрывать программу по двойному клику мышкой на часах. Соответственно в событии OnblClick прописал Close();

Также я решил чтобы мои часы распологались в правом верхнем углу. Соответственно в проперти формы Top я записал ноль, а в проперти Left нужно записать значение (ширина разрешения экрана минус ширина формы). Но вот незадача, так просто, как в VCL (Screen->Width) определить разрешение экрана не получится. Пришлось брать ширину экрана из структуры TSize.

Код:
Form1->Top = 0;
	TSize monSize = Screen->Size();
	Form1->Left = monSize.cx - Form1->Width;
В итоге получился вот такой код.



Ну и вот готовый пример.

http://yadi.sk/d/ali09zXENatPZ

ВирусТотал

Последний раз редактировалось broveymimo; 29.04.2014 в 01:29.


Мои скрипты: PMSpamer PVPHelper
Важны темы: Разбор пакетов
Реклама: Учебный центр - Best Profi, Днепропетровск
ЯД: 41001932890078
 
Ответить с цитированием
Сказали спасибо:
УбейсоАпКлаву (30.04.2014), Paladin (29.04.2014), MASTERMIND (29.04.2014), dark (29.04.2014)