使用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点击打开链接 一直以为动态生成静态页面不好做,昨天在网上找了下, ...
随机推荐
- 初试Nodejs——使用keystonejs创建博客网站1(安装keystonejs)
我正在阿里云上创建一个简单的个人博客网站,刚好正在尝试NodeJs,决定找一款基于NodeJs的CMS来完成这个工作,最后找到了KeyStoneJS. KeyStoneJS是基于Express和Mon ...
- 問題排查:类型“System.DateTime”的对象无法转换为类型“System.String”
最近在擴充資料對接工具的功能 經常會遇到這個狀況 當然還有其他同類提示,例如 int/decimal 無法轉 System.String 等等 無獨有偶 這些錯誤幾乎都是在 DataTable 轉換成 ...
- Ant: Class not found: javac1.8
今天用ant,在选择build.xml,run as ant build后出错Ant: Class not found: javac1.8 分析问题:是否是eclipse中的ant版本和java的版本 ...
- Android ContentProvider介绍
在Android中数据的存储一共有五种形式,分别是:Shared Preferences.网络存储.文件存储,外储存储.SQLite.但是我们知道一般这些存储都只是在单独的一个应用程序之中达到一个数据 ...
- odoo 10 生产自动领料
分析源码 当 原材料的 补货规则 的 "补货位置" location_id 是 生产单 的 原材料 "目标位置 ", 并且 原材料的 补货规则 的 " ...
- mysql用户的创建
MySQL是采用c/s方式的,需要客户端登录服务器,那么可以登录账号叫做用户,这些用户的信息都存储在mysql数据库(mysql安装时默认有的一个数据库)中的user表中, 比如用户的名称,用户的密码 ...
- appium踩过的坑(1):NoClassDefFoundError
1.引入jar包错误导致的错误: 引入的jar包引起的 应该引入下面的jar包
- Xamarin +vs2015 Android 开发GPS loaction 返回 null 小结
最近公司要开发android 所以研究了一下Xamarin to android 中个GPS 废话不多说,说重点. 想获取手机上的gps信息必不可少的就是要使用 LocationManager Lo ...
- HTML页面跳转的5种方法
下面列了五个例子来详细说明,这几个例子的主要功能是:在5秒后,自动跳转到同目录下的hello.html(根据自己需要自行修改)文件.1) html的实现 <head> <!-- 以下 ...
- Jquery打造的类似新浪微博@提醒功能
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...