练手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"> ...
随机推荐
- 【RTOS】基于V7开发板的最新版FreeRTOS V10.2.0程序模板,含MDK和IAR,支持串口打印任务执行情况
模板下载: 链接:https://pan.baidu.com/s/1N32Hx7cTbDoRinuzTUB3zw 提取码:6aox 1.MDK使用MDK5.26及其以上版本. 2.IAR使用IAR ...
- BootStrap 关于input与btn的点击focus取消特效相关css
取消btn按钮点击出现的外边框: .btn:focus, /*清除btn按钮点击出现的边框*/.btn:active:focus,.btn.active:focus,.btn.focus,.btn:a ...
- go语言之map
go语言的map就相当于python的dict 1.map的初始化 //创建map //k的类型是int,v的类型是string var test25_1 map[int]string fmt.Pri ...
- 前端之JavaScript基础及使用方法
JavaScript概述 ECMAScript和JavaScript的关系 1996年11月,JavaScript的创造者--Netscape公司,决定将JavaScript提交给国际标准化组织ECM ...
- [Spring cloud 一步步实现广告系统] 4. 通用代码模块设计
一个大的系统,在代码的复用肯定是必不可少的,它能解决: 统一的响应处理(可以对外提供统一的响应对象包装) 统一的异常处理(可以将业务异常统一收集处理) 通用代码定义.配置定义(通用的配置信息放在统一的 ...
- MySQL学习——管理事务
MySQL学习——管理事务 摘要:本文主要学习了使用DCL语句管理事务的操作. 了解事务 什么是事务 事务是一组逻辑处理单位,可以是执行一条SQL语句,也可以是执行几个SQL语句. 事务用来保证数据由 ...
- 利用socket传递图片
package com.company.s3; import java.io.File; import java.io.FileOutputStream; import java.io.InputSt ...
- js的try catch使用心得
1 try catch的使用,永远应该放在你的控制范围之内,而不应该防范未知的错误.也就是说你很清楚知道这里是有可能”出错“的,而且你很清楚知道什么前提下会出错,你就是要故意利用报错信息来区分错误 ...
- Cesium专栏-克里金插值(全国温度为例,附源码下载)
Cesium Cesium 是一款面向三维地球和地图的,世界级的JavaScript开源产品.它提供了基于JavaScript语言的开发包,方便用户快速搭建一款零插件的虚拟地球Web应用,并在性能,精 ...
- swoole2——Worker与TaskWorker进程
1.swoole 的进程模型 swoole是一个多进程模型的框架,当启动一个进程swoole应用时,一共会创建2+n+m个线程,n为worker进程数,m为TaskWorker进程数,1个master ...