练手WPF(一)——模拟时钟与数字时钟的制作(中)
今天接着制作数字时钟
数字时钟主要用到Path控件,主要用于定义数字笔划的形状。
(1)添加一个DigitLine类
数字时钟的数字8由7笔组成,看如下定义的字段字符串数组PathDatas,每个string代表其中一笔。最后一个string是数字表的冒号。
/// <summary>
/// 数字表数字类
/// </summary>
public class DigitLine
{
// 数字7个笔划路径数据数组
string[] PathDatas = new string[]
{
"M3,0 L53,0 L38,15 L18,15 Z", // -
"M0,3 L15,18 L15,38 L0,53 Z", // |
"M41,18 L56,3 L56,53 L41,38 Z", // |
"M10,48.5 L18,41 L38,41 L46,48.5 L38,56 L18,56 Z", // -
"M0,44 L15,60 L15,80 L0,94 Z", // |
"M41,59 L56,44 L56,94 L41,79 Z", // |
"M18,82 L38,82 L53,97 L3,97 Z", // _
"M0,0 L15,0 L15,15 L0,15Z M0,40 L15,40 L15,55 L0,55 Z" // :
}; // 路径数组(公共)
public Path[] Path0_9 = new Path[];
public Path PathColon = new Path();
}
(2)设置0-9这10个数字的笔划,添加到上述类
/// <summary>
/// 根据digit设置(分配)数字路径数据
/// </summary>
/// <param name="digit">数字</param>
private void SetDigit(int digit)
{
StringBuilder sbData = new StringBuilder(); switch (digit)
{
case :
for (int i = ; i < ; i++)
{
if (i == )
continue;
sbData.Append(PathDatas[i]);
}
break;
case :
for (int i = ; i < ; i++)
{
if (i == || i == || i == || i == || i == )
{
continue;
}
sbData.Append(PathDatas[i]);
}
break; case :
for (int i = ; i < ; i++)
{
if (i == || i == )
{
continue;
}
sbData.Append(PathDatas[i]);
}
break;
case :
for (int i = ; i < ; i++)
{
if (i == || i == )
{
continue;
}
sbData.Append(PathDatas[i]);
}
break;
case :
for (int i = ; i < ; i++)
{
if (i == || i == || i == )
{
continue;
}
sbData.Append(PathDatas[i]);
}
break; case :
for (int i = ; i < ; i++)
{
if (i == || i == )
{
continue;
}
sbData.Append(PathDatas[i]);
}
break; case :
for (int i = ; i < ; i++)
{
if (i == )
{
continue;
}
sbData.Append(PathDatas[i]);
}
break; case :
for (int i = ; i < ; i++)
{
if (i == || i == || i == || i == )
{
continue;
}
sbData.Append(PathDatas[i]);
}
break; case :
for (int i = ; i < ; i++)
{
sbData.Append(PathDatas[i]);
}
break;
case :
for (int i = ; i < ; i++)
{
if (i == )
{
continue;
}
sbData.Append(PathDatas[i]);
}
break; } Path0_9[digit].Data = Geometry.Parse(sbData.ToString());
}
除了数字8需要画出所有7笔外,其他数字都会少画相应的笔划,看一下for里的if就清楚了。
/// <summary>
/// 设置冒号
/// </summary>
/// <param name="color"></param>
private void SetColon(Brush color)
{
PathColon.Fill = color;
PathColon.Data = Geometry.Parse(PathDatas[]);
}
还有这冒号要定义。
(3)该类的构造方法
/// <summary>
/// 构造
/// </summary>
/// <param name="brush"></param>
public DigitLine(Brush brush)
{
// 初始化路径数组
for (int i=; i<; i++)
{
Path0_9[i] = new Path();
Path0_9[i].Fill = brush; SetDigit(i);
} SetColon(brush);
}
将定义好的0-9数字的形状分别保存在Path型字段数组变量Path0_9的Data中,待后调用。
(4)如果要设置倾斜数字,可以使用下面方法进行设置。
public void SetDigitSkewTransform(double angleX)
{
SkewTransform stf = new SkewTransform(angleX, ); for (int i=; i<; i++)
{
Path0_9[i].RenderTransform = stf;
}
} public void SetColonSkewTransform(double angleX)
{
SkewTransform stf = new SkewTransform(angleX, );
PathColon.RenderTransform = stf;
}
要设置X方向的倾斜角度,然后进行变换操作。
这个类就这样了,下一步就可以使用该类将相关的数字和冒号放入Canvas中显示出来了。
练手WPF(一)——模拟时钟与数字时钟的制作(中)的更多相关文章
- 练手WPF(一)——模拟时钟与数字时钟的制作(上)
一.Visual Studio创建一个WPF项目. 简单调整一下MainWindow.xaml文件.主要使用了两个Canvas控件,分别用于显示模拟和数字时钟,命名为AnalogCanvas.digi ...
- 练手WPF(一)——模拟时钟与数字时钟的制作(下)
继续数字时钟.上一篇写好了数字笔划专用的DigitLine类.现在是时候使用它了.下面对一些主要代码进行说明. 打开MainWindow.xaml.cs文件: (1)添加字段变量 // 数字时钟字段定 ...
- 练手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"> ...
随机推荐
- python爬取网页数据
一.利用webbrowser.open()打开一个网站: ? 1 2 3 >>> import webbrowser >>> webbrowser.open('ht ...
- [译]Vulkan教程(10)交换链
[译]Vulkan教程(10)交换链 Vulkan does not have the concept of a "default framebuffer", hence it r ...
- php 判断空
结果: 结论:$a != false 这种判断方式比empty() 速度更快
- VS出现未加载wntdll.pdb的解决办法
无缘无故出现了未加载wntdll.pdb的的错误,不知道原因是什么,但找到了解决方法.在调试中选择选项,然后选择调试->符号,勾选Microsoft符号服务器,确定.重新生成项目时会有各种加载, ...
- Spring Cloud Alibaba 实战(十三) - Sleuth调用链监控
本文概要:大白话剖析调用链监控原理,然后学习Sleuth,Zipkin,然后将Sleuth整合Zipkin,最后学习Zipkin数据持久化(Elasticsearch)以及Zipkin依赖关系图 实战 ...
- laravel 5.5.39 升级到 5.5.45 出现 cookie 序列化异常问题的解决
把项目里的 laravel 5.5.39 升级到 5.5.45 后,出现如下报错: ErrorExceptionopenssl_encrypt() expects parameter 1 to be ...
- Java描述设计模式(07):适配器模式
本文源码:GitHub·点这里 || GitEE·点这里 一.适配器模式简介 1.基础概念 适配器模式把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在 ...
- ABP之Logging
服务器端 ABP使用Castle Windsor的日志设施.它可以使用不同的日志库:Log4Net.NLog.Serilog等等.Castle为所有日志程序库提供了一个公共接口,这样,我们可以独立的使 ...
- Java - IO 扫描流:Scanner
IO_扫描流:Scanner 在改进输出功能不足方面提供了打印流(PrintSream):利用BufferedReader类(缓冲输入流)解决了大文本数据的输入和读取操作,但是BufferedRead ...
- ES6中Class的用法及在微信小程序中的应用实例
1.ES6的基本用法 ES6 提供了更接近传统语言的写法,引入了 Class(类)这个概念,作为对象的模板.通过class关键字,可以定义类.基本上,ES6 的class可以看作只是一个语法糖,它的绝 ...