如果只是要顯示數字形式的Digital Clock很簡單,但如果是想要做指針形式的Analog Clock 的話,就要加一些數學去算圖案的旋轉角度。
second、minute、hour 算出來的角度,分別對應到秒針、分針跟時針的圖案。
先準備好三張指針的圖片,分別是秒針、分針跟時針。
用DispatcherTimer 設定計時器的寫法之前有寫過(參考這篇)
在計時器中利用以下函式,分別去抓目前系統的時間(秒、分、時)
sec = DateTime.Now.Second; min = DateTime.Now.Minute; hr = DateTime.Now.Hour;
注意,這邊因為圖案設計的關係,在一開始必須先把旋轉的中心點設定在圖片的中間底部,
用RenderTransformOrigin 來設定,這樣轉才會正確。
secondPointer.RenderTransformOrigin = new Point(0.5, 1); minutePointer.RenderTransformOrigin = new Point(0.5, 1); hourPointer.RenderTransformOrigin = new Point(0.5, 1);
接著把得到的值,分別算成對應旋轉的角度,然後去旋轉對應的圖片物件
secondPointer.RenderTransform = new RotateTransform((sec / 60) * 360); minutePointer.RenderTransform = new RotateTransform((min * 360 / 60) + ((sec / 60) * 6)); hourPointer.RenderTransform = new RotateTransform((hr * 360 / 12) + (min / 2));
附上完整的程式碼參考
MainWindow.cs:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Windows.Threading;
namespace ClockApp
{
public partial class MainWindow : Window
{
double sec, min, hr;
DispatcherTimer clock = new DispatcherTimer();
public MainWindow()
{
InitializeComponent();
// set RenderTransformOrigin
secondPointer.RenderTransformOrigin = new Point(0.5, 1);
minutePointer.RenderTransformOrigin = new Point(0.5, 1);
hourPointer.RenderTransformOrigin = new Point(0.5, 1);
// set timer
clock.Interval = TimeSpan.FromSeconds(1);
clock.Tick += clock_Tick;
clock.Start();
setCurrentTime();
}
void clock_Tick(object sender, EventArgs e)
{
setCurrentTime();
}
private void setCurrentTime()
{
// get current time
sec = DateTime.Now.Second;
min = DateTime.Now.Minute;
hr = DateTime.Now.Hour;
// rotate pointer image
secondPointer.RenderTransform = new RotateTransform((sec / 60) * 360);
minutePointer.RenderTransform = new RotateTransform((min * 360 / 60) + ((sec / 60) * 6));
hourPointer.RenderTransform = new RotateTransform((hr * 360 / 12) + (min / 2));
}
}
}
MainWindow.xaml:
<Window x:Name="mMainWindow" x:Class="ClockApp.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:ClockApp"
mc:Ignorable="d"
Title="MainWindow" Height="768" Width="1024" Left="0" Top="0" WindowStyle="None" Topmost="True" AllowsTransparency="True">
<Grid>
<Image x:Name="clockface" Source="images/bg_1280x720-01.png" Height="768" Width="1024"/>
<Image x:Name="hourPointer" Source="images/pointer_hr.png" Height="200" Width="41" Stretch="Fill" Margin="0,-200,0,0"/>
<Image x:Name="minutePointer" Source="images/pointer_min.png" Height="200" Width="16" Stretch="Fill" Margin="0,-200,0,0"/>
<Image x:Name="secondPointer" Source="images/pointer_sec.png" Height="200" Width="7" Stretch="Fill" Margin="0,-200,0,0"/>
</Grid>
</Window>
END
沒有留言:
張貼留言