如果只是要顯示數字形式的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
沒有留言:
張貼留言