练手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"> ...
随机推荐
- Redis缓存系列
一.缓存雪崩 缓存雪崩我们可以简单的理解为:由于原有缓存失效,新缓存未到期间(例如:我们设置缓存时采用了相同的过期时间,在同一时刻出现大面积的缓存过期),所有原本应该访问缓存的请求都去查询数据库了, ...
- vue浏览器全屏实现
1.项目中使用的是sreenfull插件,执行命令安装 npm install --save screenfull 2.安装好后,引入项目,用一个按钮进行控制即可,按钮方法如下: toggleFull ...
- curl http libcurl 功能使用
/* * This example shows a HTTP PUT operation. PUTs a file given as a command * line argument to the ...
- 从server.xml看Tomcat容器的层次结构
先来看一下server.xml的结构: <Server> <Listener/> <GlobalNamingResources> <Resourc ...
- elasticsearch的window的安装和启动
1.下载elasticserch的window和kibana的安装包 2.解压 进入elasticseach的bin目录下elasticsearch.bat 启动页面localhost:9200 3 ...
- BayaiM__SQLLDR_linux_shell高级版
BayaiM__SQLLDR_linux_shell高级版 备注:1.因公司在职,商业机密,顾IP地方加了"*"号,你可以任意写一个数字做IP做就好.2.不要瞎BB,哥自己写的 ...
- SSDB数据库笔记
目录 环境 配置文件 启动服务器 客户端 SSDB:一个高性能的支持丰富数据结构的 NoSQL 数据库, 用于替代 Redis. 参考文献: SSDB官网 环境 win10 下 wsl 环境 ubun ...
- CodeForces - 1251E2 (思维+贪心)
题意 https://vjudge.net/problem/CodeForces-1251E2 一共有 n 个选民,你可以付出 pi 的代价让第 i 个选民为你投票,或者,在为你投票的人数达到 mi ...
- Linux 中find命令
1.在当前目录下找以txt结尾的文件 find . -name '*.txt' 2.在当前目录下找以所有字母开头的文件 find . -name '[a-z]*' 3.在/etc 目录下找以host开 ...
- Tensorflow之MNIST手写数字识别:分类问题(1)
一.MNIST数据集读取 one hot 独热编码独热编码是一种稀疏向量,其中:一个向量设为1,其他元素均设为0.独热编码常用于表示拥有有限个可能值的字符串或标识符优点: 1.将离散特征的取值扩展 ...