练手WPF(一)——模拟时钟与数字时钟的制作(下)
继续数字时钟。上一篇写好了数字笔划专用的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(一)——模拟时钟与数字时钟的制作(下)的更多相关文章
- 练手WPF(一)——模拟时钟与数字时钟的制作(上)
一.Visual Studio创建一个WPF项目. 简单调整一下MainWindow.xaml文件.主要使用了两个Canvas控件,分别用于显示模拟和数字时钟,命名为AnalogCanvas.digi ...
- 练手WPF(一)——模拟时钟与数字时钟的制作(中)
今天接着制作数字时钟 数字时钟主要用到Path控件,主要用于定义数字笔划的形状. (1)添加一个DigitLine类 数字时钟的数字8由7笔组成,看如下定义的字段字符串数组PathDatas,每个st ...
- 练手WPF(三)——扫雷小游戏的简易实现(上)
一.创建项目1.创建WPF项目,设置初始化窗口大小(初级难度):高x宽为430x350.2.添加文件夹Images,并添加相关图片. 3.xaml中引入图片资源. <Window.Resourc ...
- 练手WPF(二)——2048游戏的简易实现(上)
1.创建游戏界面编辑MainWindow.xaml,修改代码如下: <Window.Resources> <Style TargetType="Label"> ...
- python3 练手实例5 做一个简单电子时钟
import time,sys,os while(1): t = time.strftime('%Y-%m-%d\n%H:%M:%S',time.localtime(time.time())) pri ...
- 练手WPF(三)——扫雷小游戏的简易实现(下)
十四.响应鼠标点击事件 (1)设置对应坐标位置为相应的前景状态 /// <summary> /// 设置单元格图样 /// </summary> /// <para ...
- 练手WPF(四)——贪吃蛇小游戏的简易实现(下)
八.生成新的单节蛇身我们这里先说说游戏小原理好了,游戏运行后,通过计时器事件不断生成新的单节蛇身类SnakeNode,添加到List中的0位置,原来的蛇头变成了第二节.该节新蛇头的坐标通过蛇头前进方向 ...
- 练手WPF(四)——贪吃蛇小游戏的简易实现(上)
一. 游戏界面首先,按照惯例,编辑MainWindow.xaml,先将游戏界面制作好.非常简单:(1)主游戏区依然使用我们熟悉的Canvas控件,大小为640X480像素,设定每小格子为20px,所以 ...
- 练手WPF(三)——扫雷小游戏的简易实现(中)
八.随机布雷 /// <summary> /// 随机布地雷 /// </summary> /// <param name="mineNum"> ...
随机推荐
- 关于EFCore线程内唯一
EntityFramework的线程内唯一 EntityFramework的线程内唯一是通过httpcontext来实现的 public static DbContext DbContext() { ...
- centos 7 搭建vsftp
一.FTP简介 1.ftp 概述 FTP:(file transfer protocol文件传输协议) ...
- Java之IO模型
首先来看一下同步与异步的概念: 1.同步是指当前端发起一次操作请求时,只有后台执行完所有的代码操作才会给前端返回值. 2.异步是将前端发回的消息加入消息队列,并且立刻给前端返回请求,告诉用户可以离开当 ...
- RPM包安装——手动安装
RPM包安装 手动安装 挂载光盘 首先查看光盘是否挂载(使用mount命令) RPM包存放位置 在你光盘挂载点的Packages目录下 使用 ll | grep 关键字 可以快速找到你想要的RPM包 ...
- Word模板注入攻击
Word模板注入攻击 0x00 工具准备 phishery:https://github.com/ryhanson/phishery/releases office版本:office 2010 0x0 ...
- iOS 高效的分页加载(TableView、CollectionView)
一.tableview的分页加载的代码对比 没有优化之前的代码如下 [strongSelf.tableView.mj_footer endRefreshing]: [strongSelf.articl ...
- [C4] 前馈神经网络(Feedforward Neural Network)
前馈神经网络(Feedforward Neural Network - BP) 常见的前馈神经网络 感知器网络 感知器(又叫感知机)是最简单的前馈网络,它主要用于模式分类,也可用在基于模式分类的学习控 ...
- Vue的实例对象(三)
一.创建一个 Vue 实例 每个 Vue 应用都是通过用 Vue 函数创建一个新的 Vue 实例开始的: var vm = new Vue({ // 选项 }) 当创建一个 Vue 实例时,你可以传入 ...
- 洛谷 AT1350 深さ優先探索
洛谷 AT1350 深さ優先探索 洛谷传送门 题意翻译 高桥先生住的小区是长方形的,被划分成一个个格子.高桥先生想从家里去鱼店,高桥先生每次可以走到他前后左右四个格子中的其中一个,但不能斜着走,也不能 ...
- angular父子组件传值和ngOnChanges的使用
父组件中定义: public detailbaseinfo = {}; //详情基本信息 其中detailbaseinfo 数据会通过请求获取 父组件传值给子组件如下: 子组件接收父组件传值 imp ...