继续数字时钟。上一篇写好了数字笔划专用的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. C# 矢量图EMF 总结

    个人知识记录.如果有用请点赞,否则勿喷.忽略. 个人站点:https://i.cnblogs.com/EditPosts.aspx?opt=1 注意:句柄的操作1.创建 代码如下: Metafile ...

  2. Python制作动态二维码只需要一行代码!炒鸡简单!

    分享一个比较有意思的项目,只需要一行Python代码就可以快捷方便生成普通二维码.艺术二维码(黑白/彩色)和动态GIF二维码. 用法比较简单,直接通过pip安装即可. pip3 install myq ...

  3. MySQL学习——操作自定义函数

    MySQL学习——操作自定义函数 摘要:本文主要学习了使用DDL语句操作自定义函数的方法. 了解自定义函数 是什么 自定义函数是一种与存储过程十分相似的过程式数据库对象.它与存储过程一样,都是由SQL ...

  4. BayaiM__ORACLE之ASM概念 --V 1.0.0

    BayaiM__ORACLE之ASM概念                                --V 1.0.0 -------------------------------------- ...

  5. 密度峰值聚类算法MATLAB程序

    密度峰值聚类算法MATLAB程序 凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/ 密度峰值聚类算法简介见:[转] 密度峰值聚类算法(DPC) 数据见:MATL ...

  6. str基本语法

    基本数据类型(int,bool,str)1.基本数据数据类型: int 整数 str 字符串. 一般不存放大量的数据 bool 布尔值. 用来判断. True, False list 列表.用来存放大 ...

  7. 第十七周博客作业 <西北师范大学| 周安伟>

    第十七周作业 助教博客链接https://home.cnblogs.com/u/zaw-315/ 作业要求链接https://www.cnblogs.com/nwnu-daizh/p/11012922 ...

  8. C++编程思想 - 对象的创建和使用

    前言 用户定义的数据类型(data type)或类(class),是C++区别于传统过程型语言的地方. 通常将创建好的类库存放在库(library)中. 本篇会使用几个C++类库(class libr ...

  9. jTopo介绍(一)

    jTopo(Javascript Topology library)是一款完全基于HTML5 Canvas的关系.拓扑图形化界面开发工具包.jTopo关注于数据的图形展示,它是面向开发人员的,需要进行 ...

  10. C++ 异或运算及其应用

    前置知识: 1.一个整数自己跟自己异或,结果为0   //因为异或的法则为,相同为0,不同为1,注意这里所说的都是二进制位. 2.任意一个整数跟0异或,结果为本身. //因为1异或0得1,0异或0,得 ...