最近在看些条形码方面相关的资料,而如果只是看的话,效果似乎并不怎么好,所以决定动手做点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. android app上线后bug的处理

    app上线后,后期维护显得尤为重要,今天给大家分享一下app上线后出现bug后的解决方法 1.继承Application类,重写onCreate方法 import java.io.File; impo ...

  2. Quarter square 查找表乘法器,手动建立rom

    建立一个C的范围为0~255,内容是(C)2/4的查表 占用256个存储空间,但可以计算出+-127的两个数之积.传统算法需要至少127×127个存储空间. 查找表模块的建立: module lut_ ...

  3. 解决WampServer中MySQL数据库中文乱码的问题

    原文地址:http://blog.csdn.net/qq756703833/article/details/37971057 左键点击托盘区的WampServer图标,选择MySQL--my.ini, ...

  4. 蓝牙BLE实用教程

    蓝牙BLE实用教程 Bluetooth BLE 欢迎使用 小书匠(xiaoshujiang)编辑器,您可以通过 设置 里的修改模板来改变新建文章的内容. 1.蓝牙BLE常见问答 Q: Smart Re ...

  5. 根据juery CSS点击一个标签弹出一个遮罩层的简单示例

    <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <m ...

  6. linux下搭建nagios

    配置环境:1)CentOS 6.5 作为监控主机,IP:10.0.0.30(根据自己公司需要改变) 2)客户机: windows server  2008R2 , windows 7, windows ...

  7. sql server 分布式查询 和 主从服务器搭建

    1. 8K 对应的SQL语句限制  select  *  from openquery (recei    连接服务器名称 执行的sql 语句放在   SELECT @@SERVERNAME  在本地 ...

  8. Hibernate-list()与iterate()方法的区别

    对于list方法而言,实际上Hibernate是通过一条Select SQL获取所有的记录.并将其读出,填入到POJO中返回.而iterate 方法,则是首先通过一条Select SQL 获取所有符合 ...

  9. JS-随机排序

    var arr = [ 1,2,3,4,5,6,7,8 ];arr.sort(function ( a, b ) {    return Math.random() - 0.5;});alert( a ...

  10. VMware 12 的vmware tools安装和如何使用(系统是CENTOS6.5)

    1.用了一下虚拟机vmware12,但是总是没法使用它的vmware Tool ,网上一直说在哪个哪个文件夹,其实并没有 2.于是我用命令行找到了在系统中的VMware Tools 3.首先,保证li ...