WPF 员工卡条形码
大家都知道条形码(Barcode)是一种可以由机器识别的特殊编码,在生产、生活中也常常会见到并使用它。条形码的类型和种类很多感兴趣的朋友可以详细了解一下。其中Code 39 可以说是一种最为常见并广泛使用的字符与数字结合的编码类型,本篇也将利用它制作一个带有条形码的员工卡应用程序。
在公司内部员工卡是员工身份唯一的识别工具,同时也是考勤及门禁系统的主要信息来源。首先在WPF 中设计一个简单的员工卡样式,具备员工卡标识、员工相片、员工姓名等。
- <Border CornerRadius="3" BorderBrush="Gray" BorderThickness="2" Background="White"
- MouseLeftButtonDown="Border_MouseLeftButtonDown">
- <Canvas x:Name="mainCanvas">
- <Grid x:Name="closeBtn" Canvas.Left="330" Canvas.Top="0"
- MouseLeftButtonDown="Close_MouseLeftButtonDown">
- <Ellipse Height="15" Width="15" HorizontalAlignment="Center">
- <Ellipse.Fill>
- <SolidColorBrush x:Name="ellipseColor"/>
- </Ellipse.Fill>
- </Ellipse>
- <TextBlock Text="x" Margin="2,-2,2,2" HorizontalAlignment="Center">
- <TextBlock.Foreground>
- <SolidColorBrush x:Name="textColor" Color="Gray"/>
- </TextBlock.Foreground>
- </TextBlock>
- </Grid>
- <Border BorderBrush="#FF54545C" Canvas.Top="25" CornerRadius="5"
- Height="49" Width="339" Background="#FF2192C4" Canvas.Left="5">
- <TextBlock Text="EMPLOYEE CARD" Foreground="White" FontSize="20"
- VerticalAlignment="Center" HorizontalAlignment="Center"
- FontWeight="Black" FontFamily="Microsoft Sans Serif"/>
- </Border>
- <Grid Canvas.Left="96" Canvas.Top="78">
- <Grid.RowDefinitions>
- <RowDefinition />
- <RowDefinition />
- </Grid.RowDefinitions>
- <Image Source="Images/cardpic.png" Grid.Row="0"/>
- <TextBlock Text="Li Jing Ran" FontSize="30" FontWeight="Black"
- Grid.Row="1" HorizontalAlignment="Center"/>
- </Grid>
- </Canvas>
- </Border>
- 代码内容比较简单,其中需要提一下的是x:Name 为closeBtn 的<Grid>,可以看到它包含了一个<Ellipse>和<Textblock>,它们的颜色填充方式看上去做的很复杂。其实是为了实现一个动态效果:当鼠标移动到关闭图标上时,其<Ellipse>和<Textblock>会改变颜色(如下图对比)。
该效果代码如下,通过Window.Resources 设置一个ColorAnimation Storyboard,再通过MouseEnter、MouseLeave 来触发Storyboard 动画效果。
- <Window.Resources>
- <Storyboard x:Key="flashClose">
- <ColorAnimation Storyboard.TargetName="ellipseColor"
- Storyboard.TargetProperty="Color"
- From="White" To="Gray" Duration="0:0:0.1"/>
- <ColorAnimation Storyboard.TargetName="textColor"
- Storyboard.TargetProperty="Color"
- From="Gray" To="White" Duration="0:0:0.1"/>
- </Storyboard>
- </Window.Resources>
- <Window.Triggers>
- <EventTrigger SourceName="closeBtn" RoutedEvent="Grid.MouseEnter">
- <BeginStoryboard x:Name="showClosBtn" Storyboard="{StaticResource flashClose}"/>
- </EventTrigger>
- <EventTrigger SourceName="closeBtn" RoutedEvent="Grid.MouseLeave">
- <StopStoryboard BeginStoryboardName="showClosBtn"/>
- </EventTrigger>
- </Window.Triggers>
完成上面的界面设计,最后只需在员工卡下放的空白处添加员工编号条形码即可。首先在项目中加入Barcode 和Code39 类,我们要通过这两个类完成条形码的绘制工作。打开C#程序,编写如下代码。
通过Barcodes 类创建一个新的条形码,定义BarcodeType 为"Code39",编码Data 为“10001”,如果需要校验则将CheckDigit 设为"Yes"。其中thinWidth、thickWidth 用于定义黑白条码的宽窄度。
- Barcodes bb = new Barcodes();
- bb.BarcodeType = Barcodes.BarcodeEnum.Code39;
- bb.Data = "10001";
- bb.CheckDigit = Barcodes.YesNoEnum.Yes;
- bb.encode();
- int thinWidth;
- int thickWidth;
- thinWidth = 2;
- thickWidth = 3 * thinWidth;
- string outputString = bb.EncodedData;
- string humanText = bb.HumanText;
绘制条形码
根据编码(EncodedData)的长度利用Rectangle 类逐一绘制黑、白条码,t 表示窄码,w 表示宽码。
- int len = outputString.Length;
- int currentPos = 50;
- int currentTop = 340;
- int currentColor = 0;
- for (int i = 0; i < len; i++)
- {
- Rectangle rect = new Rectangle();
- rect.Height = 80;
- if (currentColor == 0)
- {
- currentColor = 1;
- rect.Fill = new SolidColorBrush(Colors.Black);
- }
- else
- {
- currentColor = 0;
- rect.Fill = new SolidColorBrush(Colors.White);
- }
- Canvas.SetLeft(rect, currentPos);
- Canvas.SetTop(rect, currentTop);
- if (outputString[i] == 't')
- {
- rect.Width = thinWidth;
- currentPos += thinWidth;
- }
- else if (outputString[i] == 'w')
- {
- rect.Width = thickWidth;
- currentPos += thickWidth;
- }
- mainCanvas.Children.Add(rect);
- }
添加可读码
最后在条形码下方添加一行可读码,方便员工认读条形码内容,也就是将“10001”员工编号显示出来。
- TextBlock tb = new TextBlock();
- tb.Text = humanText;
- tb.FontSize = 25;
- tb.FontFamily = new FontFamily("Consolas");
- Rect rx = new Rect(0, 0, 0, 0);
- tb.Arrange(rx);
- Canvas.SetLeft(tb, 120);
- Canvas.SetTop(tb, currentTop + 80);
- mainCanvas.Children.Add(tb);
WPF 员工卡条形码的更多相关文章
- 未来工厂——电器行业ERP案例
江苏科兴电器有限公司位于全国著名的“银杏之乡”泰兴市南首,主要生产35kV及以下电流.电压互感器等系列产品.产品多次经国家及省市技术监督部门抽检合格,广泛应用于国家重点工程.“COSINE”商标荣获泰 ...
- 微信公众平台开发教程(八)Session处理
微信公众平台开发教程(八)Session处理 在微信窗口,输入的信息有限,我们需要将一些信息分多次请求. 比如:在进行用户绑定时,我们需要输入用户的相关信息,比如:用户名.密码,或者姓名.电话号码,服 ...
- php 文本框里面显示数据库调出来的资料
php 文本框里面显示数据库调出来的资料,,,在里面我标注了,,那个地方为什么是!=才能显示正确的数据库资料啊?我理解的是对比正确输出数据库内容的.大师貌似不知道为什么就写错了 <html> ...
- ASP.NET Core 认证与授权[5]:初识授权
经过前面几章的姗姗学步,我们了解了在 ASP.NET Core 中是如何认证的,终于来到了授权阶段.在认证阶段我们通过用户令牌获取到用户的Claims,而授权便是对这些的Claims的验证,如:是否拥 ...
- Xamarin 开发过的那些项目
您可能已经看到类似的统计数据:智能手机用户在手机媒体上花费了89%的时间使用应用程序.或者听说Gartner预测到2017年移动应用程序下载将产生价值770亿美元的收入.很难不考虑这些数字.今天,每个 ...
- winform excel导入--NPOI方式
项目中要用到excel导入数据,用NPOI方式做了一个demo,记录如下: Form1代码: public Form1() { InitializeComponent(); } private voi ...
- asp.net 导出excel的一种方法
项目用到的一种导出excel 的方法予以记录:(具体的业务类可更具情况替换使用) protected void Export(string filename, List<ComponentCon ...
- (转)微信公众平台开发教程(七)Session处理
原文地址:http://www.cnblogs.com/yank/p/3476874.html 微信公众平台开发教程(七)Session处理 在微信窗口,输入的信息有限,我们需要将一些信息分多次请求. ...
- 从乌云的错误漏洞分析看Mifare Classic安全
前言 12年2月初国内著名安全问题反馈平台-乌云发布了有关某公司员工卡的金额效验算法破解的安全问题.从整个漏洞分析来看,漏洞的提交者把员工卡的数据分析得非常仔细,以至很多刚刚接触或者未曾接触的都纷纷赞 ...
随机推荐
- Android使用FFMpeg实现推送视频直播流到服务器
背景 在过去的2015年中,视频直播页的新宠无疑是户外直播.随着4G网络的普及和覆盖率的提升,主播可以在户外通过手机进行直播.而观众也愿意为这种可以足不出户而观天下事的服务买单.基于这样的背景,本文主 ...
- Oracle truncate、 delete、 drop区别
相同点: 1.truncate和不带where子句的delete.以及drop都会删除表内的数据. 2.drop.truncate都是DDL语句(数据定义语言),执行后会自动提交. 不同点: 1. t ...
- mysql优化30条建议
1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索 ...
- spring boot 使用mybatis-generator
mybatis-generator官网: http://www.mybatis.org/generator/running/runningWithMaven.html 在pom.xml中的 build ...
- Angularjs中的拦截器 (卧槽,好牛逼)
$httpAngularJS 的 $http 服务允许我们通过发送 HTTP 请求方式与后台进行通信.在某些情况下,我们希望可以俘获所有的请求,并且在将其发送到服务端之前进行操作.还有一些情况是,我们 ...
- 从头认识Spring-1.7 如何通过属性注入Bean?(1)-如何通过属性向对象注入值?
这一章节我们来讨论一下如何通过属性注入Bean? 这一章节分为两部分,第一部分我们通过属性向对象注入值,第二部分我们通过属性向对象注入还有一个对象的引用. 1.如何通过属性向对象注入值? (1)dom ...
- JavaScript取指定时区的时间
// 北京是getZoneTime(8),纽约是getZoneTime(-5),班加罗尔是getZoneTime(5.5). 偏移值是本时区相对于格林尼治所在时区的时区差值 function getZ ...
- Linux vim命令记录
Ndd :删除N行 多行删除 :1,10d ctrl+v ,移动光标,ctrl+i,输入#,esc :移动处均会输入# gg:文档头 G:文档尾 o:下一行,并进入insert模式 O:上一行并输入 ...
- B树、B-树、B+树、B*树(转)
B树 即二叉搜索树: 1.所有非叶子结点至多拥有两个儿子(Left和Right): 2.所有结点存储一个关键字: 3.非叶子结点的左指针指向小于其关键字的子树,右指针指向大于其关键字的子树: 如: B ...
- 【Excle数据透视表】如何调整压缩形式显示下的缩进字符数
调整前: ...