最近在看些条形码方面相关的资料,而如果只是看的话,效果似乎并不怎么好,所以决定动手做点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条形码的更多相关文章

  1. WPF 动态生成对象属性 (dynamic)

    原文:WPF 动态生成对象属性 (dynamic) 项目中列行的数据 都需要动态生成 所以考虑到对象绑定  可需要一个动态生成属性的意思 缺点 加载速度会慢 很明显的慢 解决办法 尽量减轻动态属性的量 ...

  2. WPF 动态生成DataGrid及动态绑定解决方案

    一.场景 有过WPF项目经验的朋友可能都知道,如果一个DataGrid要绑定静态的数据是非常的简单的(所谓静态是指绑定的数据源的类型是静态的),如下图所示,想要显示产品数据,只需绑定到一个产品列表即可 ...

  3. WPF Datagrid 动态生成列 并绑定数据

    原文:WPF Datagrid 动态生成列 并绑定数据 说的是这里 因为列头是动态加载的 (后台for循环 一会能看到代码) 数据来源于左侧列 左侧列数据源 当然num1 属于临时的dome使用  可 ...

  4. 一维码Code 39简介及其解码实现(zxing-cpp)

    一维码Code 39:由于编制简单.能够对任意长度的数据进行编码.支持设备广泛等特性而被广泛采用. Code 39码特点: 1. 能够对任意长度的数据进行编码,其局限在于印刷品的长度和条码阅读器的识别 ...

  5. (zxing.net)一维码Code 39的简介、实现与解码

    一.简介 一维码Code 39:由于编制简单.能够对任意长度的数据进行编码.支持设备广泛等特性而被广泛采用. Code 39码特点: 能够对任意长度的数据进行编码,其局限在于印刷品的长度和条码阅读器的 ...

  6. WPF + RDLC + 动态生成列 + 表头合并

    如下,评论超过20条,马上发代码*(੭*ˊᵕˋ)੭*ଘ,效果如下: 代码逻辑简单. WPF使用RDLC需要使用如下DLL 新建WPF 窗体,黏贴下大概如下 <Window xmlns:rv=&q ...

  7. C#生成Code39(extend)条形码【非条形码字体】

    Code39是条形码的一种.由于编制简单.能够对任意长度的数据进行编码.支持设备广泛等特性而被广泛采用. 能够对任意长度的数据进行编码.其局限在于印刷品的长度和条码阅读器的识别范围. 支持设备广泛.目 ...

  8. 微信小程序动态生成保存二维码

    起源:最近小程序需要涉及到一些推广方面的功能,所以要写一个动态生成二维码用户进行下载分享,写完之后受益良多,特此来分享一下: 一.微信小程序动态生成保存二维码 wxml: <view class ...

  9. 根据html页面模板动态生成html页面(c#类)

    本文转载自:http://www.cnblogs.com/yuanbao/archive/2008/01/06/1027985.html点击打开链接 一直以为动态生成静态页面不好做,昨天在网上找了下, ...

随机推荐

  1. Ubuntu 14.04 server ssh 远程服务遇到的一点事儿

    ubuntu server 14.04 root@ubuntu:/# lsb_release -aNo LSB modules are available.Distributor ID: Ubuntu ...

  2. HTML超标记语言

     Html超文本标记语言,负责描绘Web世界的骨架. 〇.工具 http;//www.w3cchool.com.cn 一.Tim Bemers Lee 万维网之父: Html设计者: W3C创始人: ...

  3. 浅析MVC模式与三层架构的区别01

    三层架构和MVC是有明显区别的,MVC应该是展现模式(三个加起来以后才是三层架构中的UI层)三层架构(3-tier application) 通常意义上的三层架构就是将整个业务应用划分为:表现层(UI ...

  4. php [] array的区别

    <?php/** * Created by IntelliJ IDEA. * User: Administrator * Date: 2017/1/2 * Time: 17:40 定义数组 ar ...

  5. ExtJS4插件EditArea

    EditArea是一个支持语法高亮的文本编辑器,同类软件还有Ace, CodeMirror等.具体功能方面的差异,请访问http://en.wikipedia.org/wiki/Comparison_ ...

  6. sed笔记

    sed是stream editor缩写,表示流编辑器,它是一款文本处理工具,可以配合正则表达式进行文本替换. 1.使用正则表达式匹配并进行文本中的字符串替换 *使用-i选项可以直接将替换结果应用到源文 ...

  7. 多个网站使用不同的SSH密钥登陆(zz)

    多个网站使用不同的SSH密钥登陆   1.创建不同的SSH密钥, -t指定加密方法,RSA或DSA:-C注释:-f指定文件名   www.2cto.com   ssh-keygen -t dsa -C ...

  8. Java使用Scanner接收中文并输出时出现乱码

    Java中使用Scanner接收输入的中文并输出时会出现乱码现象,怎么解决此问题呢? 1.方法一 在声明Scanner时添加对应的编码格式就可以了,如下所示: Scanner sc = new Sca ...

  9. ARM11 S3C6410 硬件浮点(VFP)实现

    http://blog.csdn.net/liujia2100/article/details/7459683 在调试一个代码时,编译能顺利编过.可是,就是不能执行.找了半天才发现,原来是浮点问题.由 ...

  10. yii使用createCommand()增删改查

    查询单条数据$sql = "SELECT `name` FROM `table` WHERE id='7'";$users=Yii::$app->db->createC ...