使用WPF动态生成Code 39条形码
最近在看些条形码方面相关的资料,而如果只是看的话,效果似乎并不怎么好,所以决定动手做点Demo,以增强对相关知识的记忆。
这里是一个我编写的使用WPF生成Code 39的例子,Code 39的编码很简单,故而第一次先用它做为尝试。
标准的Code 39只支持43个字符,0~9,A~Z,-,.,$, /, +, %以及空格。除此之外,*用于起始和终止符号。而通过使用两个编码符的扩展,则可以支持所有的Acsii码字符。相关知识可以在维基百科上找到。
由于是WPF,Demo分为两个文件,xaml文件包含界面布局相关的代码:
<Window x:Class="Code39Demo.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525" Loaded="Window_Loaded">
<Grid>
<Grid.RowDefinitions>
<RowDefinition></RowDefinition>
<RowDefinition></RowDefinition>
</Grid.RowDefinitions>
<TextBox Name="Textbox1" VerticalContentAlignment="Center" TextChanged="Textbox1_TextChanged"></TextBox>
<Canvas Name="Canvas1" Grid.Row="1"></Canvas>
</Grid>
</Window>
xaml.cs文件是具体的实现,主要功能是在文本框内容改变的时候动态构成Code 39条形码:
using System.Collections.Generic;
using System.Text;
using System.Text.RegularExpressions;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;
using System.Windows.Shapes; namespace Code39Demo
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
} private void Window_Loaded(object sender, RoutedEventArgs e)
{
Textbox1.Focus();
} private void Textbox1_TextChanged(object sender, TextChangedEventArgs e)
{
Canvas1.Children.Clear(); TextBox textBox = e.Source as TextBox;
if (textBox != null)
{
string content = textBox.Text;
if (string.IsNullOrEmpty(content))
{
textBox.BorderBrush = null;
return;
} string code = string.Empty;
bool result = TryConvertCode(content, out code);
if (!result)
{
textBox.BorderBrush = new SolidColorBrush(Colors.Red);
textBox.BorderThickness = new Thickness();
return;
}
else
{
textBox.BorderBrush = null;
} int thinWidth = ;
int thickWidth = * thinWidth;
int currentPos = ; for (int i = ; i < code.Length; i++)
{
Rectangle r = new Rectangle();
r.Height = ; Canvas.SetLeft(r, currentPos); switch (code[i])
{
case 'N':
{
r.Fill = new SolidColorBrush(Colors.Black);
currentPos += thinWidth;
r.Width = thinWidth;
break;
}
case 'n':
{
r.Fill = new SolidColorBrush(Colors.White);
currentPos += thinWidth;
r.Width = thinWidth;
break;
}
case 'W':
{
r.Fill = new SolidColorBrush(Colors.Black);
currentPos += thickWidth;
r.Width = thickWidth;
break;
}
case 'w':
{
r.Fill = new SolidColorBrush(Colors.White);
currentPos += thickWidth;
r.Width = thickWidth;
break;
}
} Canvas1.Children.Add(r);
}
}
} private bool TryConvertCode(string content, out string code)
{
code = string.Empty;
string c = "*" + content + "*";
StringBuilder sb = new StringBuilder(); for (int i = ; i < c.Length; i++)
{
string value = string.Empty;
bool result = _code39Map.TryGetValue(c[i], out value);
if (!result)
{
return false;
} sb.Append(value);
sb.Append('n');
} code = sb.Remove(sb.Length - , ).ToString(); return true;
} private static Dictionary<char, string> _code39Map = new Dictionary<char, string>(); static MainWindow()
{
_code39Map[''] = "NnNwWnWnN";
_code39Map[''] = "WnNwNnNnW";
_code39Map[''] = "NnWwNnNnW";
_code39Map[''] = "WnWwNnNnN";
_code39Map[''] = "NnNwWnNnW";
_code39Map[''] = "WnNwWnNnN";
_code39Map[''] = "NnWwWnNnN";
_code39Map[''] = "NnNwNnWnW";
_code39Map[''] = "WnNwNnWnN";
_code39Map[''] = "NnWwNnWnN"; _code39Map['A'] = "WnNnNwNnW";
_code39Map['B'] = "NnWnNwNnW";
_code39Map['C'] = "WnWnNwNnN";
_code39Map['D'] = "NnNnWwNnW";
_code39Map['E'] = "WnNnWwNnN";
_code39Map['F'] = "NnWnWwNnN";
_code39Map['G'] = "NnNnNwWnW";
_code39Map['H'] = "WnNnNwWnN";
_code39Map['I'] = "NnWnNwWnN";
_code39Map['J'] = "NnNnWwWnN";
_code39Map['K'] = "WnNnNnNwW";
_code39Map['L'] = "NnWnNnNwW";
_code39Map['M'] = "WnWnNnNwN";
_code39Map['N'] = "NnNnWnNwW";
_code39Map['O'] = "WnNnWnNwN";
_code39Map['P'] = "NnWnWnNwN";
_code39Map['Q'] = "NnNnNnWwW";
_code39Map['R'] = "WnNnNnWwN";
_code39Map['S'] = "NnWnNnWwN";
_code39Map['T'] = "NnNnWnWwN";
_code39Map['U'] = "WwNnNnNnW";
_code39Map['V'] = "NwWnNnNnW";
_code39Map['W'] = "WwWnNnNnN";
_code39Map['X'] = "NwNnWnNnW";
_code39Map['Y'] = "WwNnWnNnN";
_code39Map['Z'] = "NwWnWnNnN"; _code39Map['-'] = "NwNnNnWnW";
_code39Map['.'] = "NwNnNnWnW";
_code39Map[' '] = "NwWnNnWnN";
_code39Map['$'] = "NwNwNwNnN";
_code39Map['/'] = "NwNwNnNwN";
_code39Map['+'] = "NwNnNwNwN";
_code39Map['%'] = "NnNwNwNwN"; _code39Map['*'] = "NwNnWnWnN";
}
}
}
各字符对应编码中,W表示黑色宽条,w表示白色宽条,N表示黑色窄条,n表示白色窄条。需要注意的是,Code 39的相邻字符间需要有一个白色窄条用于分隔。
这个Demo还欠缺Code 39中校验码的处理(通常不需要),如果有需要的话,可以在此基础上补充,相信并不是困难的工作。
原文同步发布于我的个人博客
使用WPF动态生成Code 39条形码的更多相关文章
- WPF 动态生成对象属性 (dynamic)
原文:WPF 动态生成对象属性 (dynamic) 项目中列行的数据 都需要动态生成 所以考虑到对象绑定 可需要一个动态生成属性的意思 缺点 加载速度会慢 很明显的慢 解决办法 尽量减轻动态属性的量 ...
- WPF 动态生成DataGrid及动态绑定解决方案
一.场景 有过WPF项目经验的朋友可能都知道,如果一个DataGrid要绑定静态的数据是非常的简单的(所谓静态是指绑定的数据源的类型是静态的),如下图所示,想要显示产品数据,只需绑定到一个产品列表即可 ...
- WPF Datagrid 动态生成列 并绑定数据
原文:WPF Datagrid 动态生成列 并绑定数据 说的是这里 因为列头是动态加载的 (后台for循环 一会能看到代码) 数据来源于左侧列 左侧列数据源 当然num1 属于临时的dome使用 可 ...
- 一维码Code 39简介及其解码实现(zxing-cpp)
一维码Code 39:由于编制简单.能够对任意长度的数据进行编码.支持设备广泛等特性而被广泛采用. Code 39码特点: 1. 能够对任意长度的数据进行编码,其局限在于印刷品的长度和条码阅读器的识别 ...
- (zxing.net)一维码Code 39的简介、实现与解码
一.简介 一维码Code 39:由于编制简单.能够对任意长度的数据进行编码.支持设备广泛等特性而被广泛采用. Code 39码特点: 能够对任意长度的数据进行编码,其局限在于印刷品的长度和条码阅读器的 ...
- WPF + RDLC + 动态生成列 + 表头合并
如下,评论超过20条,马上发代码*(੭*ˊᵕˋ)੭*ଘ,效果如下: 代码逻辑简单. WPF使用RDLC需要使用如下DLL 新建WPF 窗体,黏贴下大概如下 <Window xmlns:rv=&q ...
- C#生成Code39(extend)条形码【非条形码字体】
Code39是条形码的一种.由于编制简单.能够对任意长度的数据进行编码.支持设备广泛等特性而被广泛采用. 能够对任意长度的数据进行编码.其局限在于印刷品的长度和条码阅读器的识别范围. 支持设备广泛.目 ...
- 微信小程序动态生成保存二维码
起源:最近小程序需要涉及到一些推广方面的功能,所以要写一个动态生成二维码用户进行下载分享,写完之后受益良多,特此来分享一下: 一.微信小程序动态生成保存二维码 wxml: <view class ...
- 根据html页面模板动态生成html页面(c#类)
本文转载自:http://www.cnblogs.com/yuanbao/archive/2008/01/06/1027985.html点击打开链接 一直以为动态生成静态页面不好做,昨天在网上找了下, ...
随机推荐
- MySQL-Front 建表引发的一点小思考(数据表格模版)
我们建表的时候,有一些字段总是会常用到的.也就是每一张表都会有这些字段. 我用mysql有一点时间了,今天(2016-02-27 21:53:38)在用mysql-front建表的时候,感觉有点点不太 ...
- chartjs执行图表
<html> <head> <title></title> </head> <body> <div style='widt ...
- mvc AddImplicitRequiredAttributeForValueTypes
1.AddImplicitRequiredAttributeForValueTypes (为值类型添加隐式必填验证),默认值 为true.刚在mvc view(html)中会为model的值类型属性( ...
- springMVC 相对于 Structs 的优势
智者说,没有经过自己的思考和估量,就不能接受别人的东西.资料只能是一个参考,至于是否正确,还得自己去分辨 SpringMVC相对于Structs的几个优势: 1.springMVC安全性更高,stru ...
- Oracle sys和system用户、sysdba 和sysoper系统权限、sysdba和dba角色的区别
sys和system用户区别 1)最重要的区别,存储的数据的重要性不同 sys所有oracle的数据字典的基表和视图都存放在sys用户中,这些基表和视图对于oracle的运行是至关重要的,由数据库自己 ...
- 《Photon》
搭建客户端: using UnityEngine;using System.Collections;using ExitGames.Client.Photon; public class GameCl ...
- maven 环境的配置 JAVA_HOME not found in your envirnment
maven 的环境配置在配置maven前 先做好java的环境配置现在假定java已经配置好了.在环境变量中添加;maven的解压路径\bin 例如:D:\soft\java\apache-maven ...
- 解决Android5.0以后DatePicker选择时间无效的bug。
一.在布局中加上这句话. 加上了这句话后,就相当于强制用5.0以前的外观,所以外观会有所变化: 5.0以上没有这句话的外观: 加上之后的外观: 二.可以用DatePickerDialog代替
- jQuery - 自定义伪类 [:pseudoclass]
有两种创建伪类的方法, 第一种, $.extend( $.expr[':'], { // 自定义的伪类名称:group group: function(element, index, matches, ...
- 46. Permutations 回溯算法
https://leetcode.com/problems/permutations/ 求数列的所有排列组合.思路很清晰,将后面每一个元素依次同第一个元素交换,然后递归求接下来的(n-1)个元素的全排 ...