继续数字时钟。上一篇写好了数字笔划专用的DigitLine类。现在是时候使用它了。下面对一些主要代码进行说明。

打开MainWindow.xaml.cs文件:

(1)添加字段变量

// 数字时钟字段定义
DigitLine[] digitLine = new DigitLine[];
DigitLine[] digitLineBack = new DigitLine[]; DigitLine[] digitColon = new DigitLine[];
DigitLine[] digitColonBack = new DigitLine[];

第一对类数组变量用于6个数字及其背景字样,第二对是冒号用的。

(2)在构造方法中进行变量初始化

// 初始化数字
for (int i=; i<; i++)
{
digitLine[i] = new DigitLine(Brushes.Black);
digitLineBack[i] = new DigitLine(new SolidColorBrush(Color.FromArgb(, , , )));
} // 初始化冒号
for (int i=; i<; i++)
{
digitColon[i] = new DigitLine(Brushes.Black);
digitColonBack[i] = new DigitLine(new SolidColorBrush(Color.FromArgb(, , , )));
}

(3)开始设置显示元素

这个方法用于显示数字表外边框:

/// <summary>
/// 显示数字表矩形外框
/// </summary>
/// <param name="pos"></param>
/// <param name="width"></param>
/// <param name="height"></param>
/// <param name="color"></param>
private void DrawDigitRect(Point pos, double width, double height, Brush color)
{
Rectangle rect = new Rectangle();
rect.Width = width;
rect.Height = height;
rect.Fill = color;
Canvas.SetLeft(rect, pos.X);
Canvas.SetTop(rect, pos.Y);
digitCanvas.Children.Add(rect); }

显示数字和冒号的背景,数字的话时只要画6个8就可以了,这个很容易理解,看一下真实的电子表就清楚了。

/// <summary>
/// 显示背景数字(底色)
/// </summary>
/// <param name="brush"></param>
private void DrawDigitTimeBack(Brush brush)
{
// 第1、2位--小时
Canvas.SetLeft(digitLineBack[].Path0_9[], );
Canvas.SetTop(digitLineBack[].Path0_9[], );
digitCanvas.Children.Add(digitLineBack[].Path0_9[]); Canvas.SetLeft(digitLineBack[].Path0_9[], );
Canvas.SetTop(digitLineBack[].Path0_9[], );
digitCanvas.Children.Add(digitLineBack[].Path0_9[]); // 冒号
Canvas.SetLeft(digitColonBack[].PathColon, );
Canvas.SetTop(digitColonBack[].PathColon, );
digitCanvas.Children.Add(digitColonBack[].PathColon); // 第二冒号
Canvas.SetLeft(digitColonBack[].PathColon, );
Canvas.SetTop(digitColonBack[].PathColon, );
digitCanvas.Children.Add(digitColonBack[].PathColon); // 3、4位--分钟
Canvas.SetLeft(digitLineBack[].Path0_9[], );
Canvas.SetTop(digitLineBack[].Path0_9[], );
digitCanvas.Children.Add(digitLineBack[].Path0_9[]); Canvas.SetLeft(digitLineBack[].Path0_9[], );
Canvas.SetTop(digitLineBack[].Path0_9[], );
digitCanvas.Children.Add(digitLineBack[].Path0_9[]); // 5、6位--秒钟
Canvas.SetLeft(digitLineBack[].Path0_9[], );
Canvas.SetTop(digitLineBack[].Path0_9[], );
digitCanvas.Children.Add(digitLineBack[].Path0_9[]); Canvas.SetLeft(digitLineBack[].Path0_9[], );
Canvas.SetTop(digitLineBack[].Path0_9[], );
digitCanvas.Children.Add(digitLineBack[].Path0_9[]);
}

将画外框和背景底色功能添加到构造方法的最后部分:

// 画数字表背景矩形
DrawDigitRect(new Point(-, ), , , Brushes.Black);
DrawDigitRect(new Point(-, ), , , Brushes.Gray); // 画数字底色
DrawDigitTimeBack(new SolidColorBrush(Color.FromArgb(, , , )));

(4)最重要的显示时间数字和冒号的方法:

/// <summary>
/// 显示数字时间
/// </summary>
private void DrawDigitTime()
{
// 删除已在画图区的数字
for (int i=; i<; i++)
{
for (int j=; j<; j++)
{
if (digitCanvas.Children.Contains(digitLine[i].Path0_9[j]))
{
digitCanvas.Children.Remove(digitLine[i].Path0_9[j]);
}
}
} // 小时
int hour = CurrTime.Hour;
int hour1 = hour / ;
int hour2 = hour % ;
Canvas.SetLeft(digitLine[].Path0_9[hour1], );
Canvas.SetTop(digitLine[].Path0_9[hour1], );
digitCanvas.Children.Add(digitLine[].Path0_9[hour1]); Canvas.SetLeft(digitLine[].Path0_9[hour2], );
Canvas.SetTop(digitLine[].Path0_9[hour2], );
digitCanvas.Children.Add(digitLine[].Path0_9[hour2]); // 冒号闪烁
if (CurrTime.Second % == )
{
digitColon[].PathColon.Visibility = Visibility.Visible;
digitColon[].PathColon.Visibility = Visibility.Visible;
}
else
{
digitColon[].PathColon.Visibility = Visibility.Hidden;
digitColon[].PathColon.Visibility = Visibility.Hidden;
} // 分钟
int minute = CurrTime.Minute;
int minu1 = minute / ;
int minu2 = minute % ;
Canvas.SetLeft(digitLine[].Path0_9[minu1], );
Canvas.SetTop(digitLine[].Path0_9[minu1], );
digitCanvas.Children.Add(digitLine[].Path0_9[minu1]); Canvas.SetLeft(digitLine[].Path0_9[minu2], );
Canvas.SetTop(digitLine[].Path0_9[minu2], );
digitCanvas.Children.Add(digitLine[].Path0_9[minu2]); // 秒钟
int second = CurrTime.Second;
int sec1 = second / ;
int sec2 = second % ;
Canvas.SetLeft(digitLine[].Path0_9[sec1], );
Canvas.SetTop(digitLine[].Path0_9[sec1], );
digitCanvas.Children.Add(digitLine[].Path0_9[sec1]); Canvas.SetLeft(digitLine[].Path0_9[sec2], );
Canvas.SetTop(digitLine[].Path0_9[sec2], );
digitCanvas.Children.Add(digitLine[].Path0_9[sec2]);
}

根据当前时间,显示相应数字,很容易懂。

(5)更新时间

将上面的DrawDigitTime()方法调用添加到(上)篇的计时器事件方法中即可。现在该方法如下:

/// <summary>
/// 计时器事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void Timer_Tick(object sender, EventArgs e)
{
// 更新当前时间
CurrTime = DateTime.Now; // 更新数字时钟数字
DrawDigitTime(); // 更新圆盘时针
Update();
}

(6)大致如此,看看最后效果吧。

最后来一个合影 :)

练手WPF(一)——模拟时钟与数字时钟的制作(下)的更多相关文章

  1. 练手WPF(一)——模拟时钟与数字时钟的制作(上)

    一.Visual Studio创建一个WPF项目. 简单调整一下MainWindow.xaml文件.主要使用了两个Canvas控件,分别用于显示模拟和数字时钟,命名为AnalogCanvas.digi ...

  2. 练手WPF(一)——模拟时钟与数字时钟的制作(中)

    今天接着制作数字时钟 数字时钟主要用到Path控件,主要用于定义数字笔划的形状. (1)添加一个DigitLine类 数字时钟的数字8由7笔组成,看如下定义的字段字符串数组PathDatas,每个st ...

  3. 练手WPF(三)——扫雷小游戏的简易实现(上)

    一.创建项目1.创建WPF项目,设置初始化窗口大小(初级难度):高x宽为430x350.2.添加文件夹Images,并添加相关图片. 3.xaml中引入图片资源. <Window.Resourc ...

  4. 练手WPF(二)——2048游戏的简易实现(上)

    1.创建游戏界面编辑MainWindow.xaml,修改代码如下: <Window.Resources> <Style TargetType="Label"> ...

  5. python3 练手实例5 做一个简单电子时钟

    import time,sys,os while(1): t = time.strftime('%Y-%m-%d\n%H:%M:%S',time.localtime(time.time())) pri ...

  6. 练手WPF(三)——扫雷小游戏的简易实现(下)

    十四.响应鼠标点击事件    (1)设置对应坐标位置为相应的前景状态 /// <summary> /// 设置单元格图样 /// </summary> /// <para ...

  7. 练手WPF(四)——贪吃蛇小游戏的简易实现(下)

    八.生成新的单节蛇身我们这里先说说游戏小原理好了,游戏运行后,通过计时器事件不断生成新的单节蛇身类SnakeNode,添加到List中的0位置,原来的蛇头变成了第二节.该节新蛇头的坐标通过蛇头前进方向 ...

  8. 练手WPF(四)——贪吃蛇小游戏的简易实现(上)

    一. 游戏界面首先,按照惯例,编辑MainWindow.xaml,先将游戏界面制作好.非常简单:(1)主游戏区依然使用我们熟悉的Canvas控件,大小为640X480像素,设定每小格子为20px,所以 ...

  9. 练手WPF(三)——扫雷小游戏的简易实现(中)

    八.随机布雷 /// <summary> /// 随机布地雷 /// </summary> /// <param name="mineNum"> ...

随机推荐

  1. 关于EFCore线程内唯一

    EntityFramework的线程内唯一 EntityFramework的线程内唯一是通过httpcontext来实现的 public static DbContext DbContext() { ...

  2. centos 7 搭建vsftp

    一.FTP简介 1.ftp 概述                                                FTP:(file  transfer  protocol文件传输协议) ...

  3. Java之IO模型

    首先来看一下同步与异步的概念: 1.同步是指当前端发起一次操作请求时,只有后台执行完所有的代码操作才会给前端返回值. 2.异步是将前端发回的消息加入消息队列,并且立刻给前端返回请求,告诉用户可以离开当 ...

  4. RPM包安装——手动安装

    RPM包安装 手动安装 挂载光盘 首先查看光盘是否挂载(使用mount命令) RPM包存放位置 在你光盘挂载点的Packages目录下 使用 ll | grep 关键字 可以快速找到你想要的RPM包 ...

  5. Word模板注入攻击

    Word模板注入攻击 0x00 工具准备 phishery:https://github.com/ryhanson/phishery/releases office版本:office 2010 0x0 ...

  6. iOS 高效的分页加载(TableView、CollectionView)

    一.tableview的分页加载的代码对比 没有优化之前的代码如下 [strongSelf.tableView.mj_footer endRefreshing]: [strongSelf.articl ...

  7. [C4] 前馈神经网络(Feedforward Neural Network)

    前馈神经网络(Feedforward Neural Network - BP) 常见的前馈神经网络 感知器网络 感知器(又叫感知机)是最简单的前馈网络,它主要用于模式分类,也可用在基于模式分类的学习控 ...

  8. Vue的实例对象(三)

    一.创建一个 Vue 实例 每个 Vue 应用都是通过用 Vue 函数创建一个新的 Vue 实例开始的: var vm = new Vue({ // 选项 }) 当创建一个 Vue 实例时,你可以传入 ...

  9. 洛谷 AT1350 深さ優先探索

    洛谷 AT1350 深さ優先探索 洛谷传送门 题意翻译 高桥先生住的小区是长方形的,被划分成一个个格子.高桥先生想从家里去鱼店,高桥先生每次可以走到他前后左右四个格子中的其中一个,但不能斜着走,也不能 ...

  10. angular父子组件传值和ngOnChanges的使用

    父组件中定义:  public detailbaseinfo = {}; //详情基本信息 其中detailbaseinfo 数据会通过请求获取 父组件传值给子组件如下: 子组件接收父组件传值 imp ...