练手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"> ...
随机推荐
- vuex的学习
vuex是什么? vuex是专为vue.js应用程序开发的状态管理模式 它采用集中式存储管理应用所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化 vuex也集成到vue的官方调式工具d ...
- Java 的核心目的和并发编程
读一本书,最好能从它的前言开始.那么我们就来看看<Java编程思想>作者 Bruce Eckel 在前言里都说了些什么吧. 01.Java 的核心目的是"为程序员减少复杂性&qu ...
- 如何获得大学教材的PDF版本?
最近急需一本算法书的配套答案,这本配套单独出售,好像在市面上还买不到,在淘宝上搜索也只是上一个版本,并没有最新版本,让我很无奈.加上平时肯定会有这么一种情况,想看一些书,但买回来也看不了几次,加上计算 ...
- 【转载】Android Studio Service AIDL 详解
公司产品之前IM这块存在很多问题,消息到达率低,加上协议上有些问题,丢消息频繁,所以需要重构IM,AIDL不能解决以上问题.好吧!那AIDL可以解决什么问题?什么是AIDL? 什么是AIDL? AID ...
- Android 列表对话框 使用数组
添加一个数组 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceSt ...
- gradle+shell实现自动系统签名
前言 有时候我们的应用需要系统级的权限来实现一些功能(如静默安装),这时候需要给应用打上系统签名,常规操作打包apk,解压apk,删除META-INF中CERT.RSA和 CERT.SF,然后压缩,用 ...
- Jackson version is too old 2.xx
我使用的是IDEA,很简单. 切换到project,如果下面的module版本是2.65,上面的jackson.core.xx小于2.65就会报old,如果高于2.65就会报不兼容. 所以调整成相同的 ...
- 网络编程~~~osi五层协议
物理层 / 数据链路层 / 网络层 / 传输层 / 应用层(表示层/会话层) 一 物理层 物理层指的就是网线,光纤, 双绞线等物理传输介质 物理层发送的是数据(比特流) 二 数据链路层 数据链路层对数 ...
- Resolving RMAN-06023 or RMAN-06025 (Doc ID 2038119.1)
Resolving RMAN-06023 or RMAN-06025 (Doc ID 2038119.1) APPLIES TO: Oracle Database - Enterprise Editi ...
- idea代码模板配置
1. 在settings中配置 配置快捷键和模板内容 输入syso然后按enter键就会自动生成代码