最近在看些条形码方面相关的资料,而如果只是看的话,效果似乎并不怎么好,所以决定动手做点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 远程登录服务器--ssh的安装和配置

    Ubuntu的安装包居然不自带openssh服务器,所以若要使用ssh远程登录Ubuntu主机,需要首先安装ssh服务器: sudo apt-get install openssh-server 安装 ...

  2. 复制mueclipse项目到eclipse

    本文适用于将MyEclipse上的项目projectA检出后重命名为projectB的情况,如果只是检出projectA到Eclipse,也可以部分参考 1.从svn上检出Myeclipse项目到Ec ...

  3. json改造优化无刷新分页

    index.html dd

  4. 一个Angular模块中可以声明哪些组件?

    一个Angular模块中可以声明哪些组件? (1) controller        控制器 (2) directive                指令 (3) function         ...

  5. ZOJ3774_Power of Fibonacci

    求fibonacci数列前N个数的K次方和. 通项公式:F[n]=((1+sqrt(5))/sqrt(5)-(1-sqrt(5))/sqrt(5))/sqrt(5). 有点乱,不过由于可以保证最后的结 ...

  6. the fourth class

    6 居右 label加宽度,text-align:right 7 list copy: list1.concat(list1) 8 灵活运用addHandle,addEventListener 给in ...

  7. JAVA SSH 框架介绍

    SSH 为 struts+spring+hibernate 的一个集成框架,是目前较流行的一种JAVA Web应用程序开源框架. Struts Struts是一个基于Sun J2EE平台的MVC框架, ...

  8. while语句(1)

    <?php     for ($i=1; $i<=10  ; $i++) {        echo $i."-".($i*10)."<br>&q ...

  9. 用eclipse搭建SSH(struts+spring+hibernate)框架

    声明: 本文是个人对ssh框架的学习.理解而编辑出来的,可能有不足之处,请大家谅解,但希望能帮助到大家,一起探讨,一起学习! Struts + Spring + Hibernate三者各自的特点都是什 ...

  10. Android应用:StatusBar状态栏、NavigationBar虚拟按键栏、ActionBar标题栏、Window屏幕内容区域等的宽高

    一.屏幕中各种栏目以及屏幕的尺寸 当我们需要计算屏幕中一些元素的高度时,或许需要先获取到屏幕或者各种栏目的高度,下面这个类包含了Status bar状态栏,Navigation bar虚拟按键栏,Ac ...