继续数字时钟。上一篇写好了数字笔划专用的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. Python【day 14-3】二分法查找

    #二分法查找 #方法1 循环+左右边界变动,两者差减半 #方法2 递归+新列表长度减半 #方法3 递归+左右边界变动,两者差减半 #方法1 循环+左右边界变动,两者差减半 def recursion1 ...

  2. PDF怎么转换为CAD文件?这两种方法你的会

    在日常的办公中,我们最常见的文件格式就是PDF格式的,因为PDF文件的安全性是比较高的,可以防止不小心触碰到键盘修改文件内容,而且PDF文件便于进行文件的传输.但是有时候也需要将PDF转换成CAD,那 ...

  3. FCC---Make Motion More Natural Using a Bezier Curve--- juggling movement

    This challenge animates an element to replicate the movement of a ball being juggled. Prior challeng ...

  4. WC个人项目

    一.Github项目地址: https://github.com/JakeYi/WC 二.PSP表格 PSP2.1 Personal Software Process Stages 预估耗时(分钟) ...

  5. 论文学习-wlg-基于二维材料的肖特基异质结构的通用尺度定律

    目录 主要公式: 各个段落的内容 第一页 第二页 第三页 名词的含义 功函数: 电子亲和力 肖特基势垒 肖特基二极管的原理 非相对论性电子气:未知 Rashba自旋电子系统: 参考链接: 主要公式: ...

  6. linux基础学习(一)常用命令:date、pwd、cd、cal、who、wc等等

    目录 @(基础命令) Tab键是linux系统中最重要的键之一了,它的功能是命令自动补全== [root@localhost ~]#date 1.用于显示当前的日期和时间 2/用于显示当前的日历 [r ...

  7. hisi mmz模块驱动讲解

    一.概述 如图所示,在海思平台上将内存分为两个部分:os内存和mmz内存.os内存指:由linux操作系统管理的内存:mmz内存:由mmz驱动模块进行管理供媒体业务单独使用的内存,在驱动加载时可以指定 ...

  8. liteos CPU占用率(十六)

    1. 概述 1.1 基本概念 CPU(中央处理器, Central Processing Unit)占用率可以分为系统CPU占用率和任务CPU占用率两种. 系统CPU占用率(CPU Percent)是 ...

  9. c语言程序设计第1章

    开始记录自己学习c语言的过程,选用的教材是浙江大学何钦铭.颜晖编写的<c语言程序设计>(第3版). 一.第一个程序 /*求阶乘问题.输入一个正整数n,输出n!*/ #include< ...

  10. 28.Java基础_抽象类

    抽象类的成员特点 public abstract class Animal { private String name; private int age; public Animal() { } pu ...