VB条形码编程.docx

上传人:b****6 文档编号:8821285 上传时间:2023-02-01 格式:DOCX 页数:17 大小:35.75KB
下载 相关 举报
VB条形码编程.docx_第1页
第1页 / 共17页
VB条形码编程.docx_第2页
第2页 / 共17页
VB条形码编程.docx_第3页
第3页 / 共17页
VB条形码编程.docx_第4页
第4页 / 共17页
VB条形码编程.docx_第5页
第5页 / 共17页
点击查看更多>>
下载资源
资源描述

VB条形码编程.docx

《VB条形码编程.docx》由会员分享,可在线阅读,更多相关《VB条形码编程.docx(17页珍藏版)》请在冰豆网上搜索。

VB条形码编程.docx

VB条形码编程

用VB设计条形码轻印刷系统

条形码技术简介

条形码作为一种识别输入技术,由于其显而易见的快速、准确、低廉等优点,被广泛应用于商品流通、图书馆管理等众多的自动化管理系统中。

条形码是利用条(着色部份)、空(非着色部份)及其宽、窄的交替变换来表达信息。

每一种编码,都制定有字符与条空、宽窄表达的对应关系,只要遵循这一标准打印出来的条、空交替排列的“图形符号”,这一“图形符号”中就包含了字符信息;当识读器划过这一“图形符号”时,这一条、空交替排列的信息通过光线反射,在识读器内,这种光信号被转换成数字信号,再经过相应的解码软件,就能将“图形符号”还原成字符信息。

三九码是一种应用比较普遍的条形码,它长度可变、可校验,容纳的字符多达43个(包括数字0~9、字母A~Z及其它七个特殊字符)。

由于在表示每一字符时,使用9个元素,其中3个宽元素、6个窄元素,故名39码,这3个宽元素中必须有两个是条(有四个特殊用途的字符除外)。

如字母“J”的编码规则为:

“NNNNWWW/N其中N表示窄元素,W表示宽元素,奇数位为条元素,偶数位为空元素,宽窄元素的宽度尺寸比为2~3,且在同一个条码

中必须是固定的。

在打印制作条形码时,条是需要打印(着色)的,而空元素内不必打印的,不过要将其宽度计算在内。

对于某一要打印的字符串,按其先后顺序打印,串前串后各加一个“*”符号做为起始符与终止符,相邻的字符间在打印时由“位空”分隔,“位空”类似空

元素,即不着色部分,其宽度应小于1.35mm,为编程方便,通常取为一个窄元素的宽度。

条形码的制作有制版印刷、轻印刷两种方式,轻印刷是指使用普通打印机,在计算机控制下制作条形码。

这种制作方法灵活,成本较低,即适宜于同一号码的单条制作,也可用于同一号码的大量制作,这一特点是制版印刷无可替代的。

使用计算机软件打印条形码,其原

理是将条形码作为图形来看待,用编程语言中的绘图语句-画矩形框,在相应的坐标上画出

各种宽度不同的条元素,这样即可实现条形码的计算机软件打印。

VB中几种打印功能在条码打印时的比较

VisualBasic是近年来比较流行的编程语言,功能强大,易学易用。

VisualBasic对打

印功能提供了两种输出方式:

一是首先将条码输出到某一对象,再使用该对象中Print方法,将其输出到打印机;二是使用打印机对像Printer绘图。

下面对这种方法做个比较:

一、将条形码图在窗体上绘出,再使用PrintForm方法打印窗体。

窄条打印:

Line(x,y)-step(i,h),,bf宽条打印:

Line(x,y)-step(3*i,h),,bf或

Line(x,y)-step(2*i,h),,bf

再使用formname.PrintForm将条形码输出到打印机。

在这种方式下,窗体的量度单位可以有:

twip,point,picel三种其中以twip为单位为最小。

以twip为单位,对条形码来说,打印精度可达30,即当窄元素宽度必须等于或大于30

时,打印出来的条形码可以阅读,若窄元素的宽度小于30,条形码中相邻的条会粘连在一

起,无法识读。

当窄元素宽度为30时,“J10059”六位字符条码尺寸为:

67mm

以Picel为单位,打印精度可达2,当窄元素宽度为2时,“J10059”六位字符条形码

尺寸为80mm以上。

以Point为单位,打印精度可达2,当窄元素宽度为2时,J10059六位字符条形码尺寸为110MM。

二、直接使用Printer.Line,在打印机上绘画-画矩形框

窄条打印:

Printer.Line(x,y)-Step(i,h),,bf

宽条打印:

Printer.Line(x,y)-Step(3*i,h),,bf或

Printer.Line(x,y)-Step(2*i,h),,bf

用Printer.Line打印,量度单位为点,最小精度为达10,当窄元素宽为10时,J10059六位字符之条码尺寸为:

21MM。

根据以上的比较,使用第二种方法打印输入的条形码精度最高(同样的字符数,尺寸最短)。

很显然,不同的打印方式,分别有不同的适用范围,对尺寸宽度要求不高的情况下,可以使用第一种打印方式,若对条形码尺寸要求较严格,则使用第二种打印方式更合适。

软件设计

一、菜单设计:

由于条形码轻印刷软件相对说来是一个很小的系统,需要选择的项目不

多,可以不设置菜单,而将全部的操作由窗体控件来完成。

如果使用上述的第一种打印方式,则必须建立另一窗体,用于第一步的输出条形码图形。

二、设计窗体控件:

窗体中的控件包括两大类,即:

参数设置框、打印操作按钮。

本列设计的窗体见图示。

本列给出的是一个对参数没有设置功能的窗体,有兴趣的读者可以在此基础上自行补充它。

对于打印参数,对条形码的打印来说,需要指定的参数大致有:

条码宽窄比:

3:

1~2:

1;条码高;窄元素宽度;打印机类型及端口;打印份数;打印纸尺寸规格;每行条形码数;每个条码的字符数;是否自动增值打印;增值步长;每一页行计数起止数;终止码等。

本列设计了八个按钮,其作用分别是:

Begin-单号条形码打印开始

Auto-自动增值打印开始

Page-将打印机内存中的条码(不足一页)打印出来

Cancel-中止自动增值打印

Delete-清除打印机内存中的未打印条码

Help-帮助信息

About-版本及设计信息

Exit-关闭系统

三、程序流程:

在本例中,条形码的打印分为单号打印;自动增值打印两种。

单号打印,是用户输入一个或几个需要打印的号码的打印方式;而自动增值打印是用户指定起始号、终止号及增加步长,由机器自动生成被打印号码来打印。

其实这两种方式在打印时的操作是完全一样的,不同之处在于被打号码的获取,需要注意的是由于39码字符集中包括字符,在自动增值时要与纯数字码区别。

下面以单号打印为例,介绍条形码打印的程序流程。

1.检查各项参数设置是否完全正确,若正确,则继续,否则退出;

2.获取各项参数设置;

3.为X坐标取初值(纸的左边打印边界);

4•(循环A)是否打印完一行(I条条码)?

是则转14;

5.本条条码是否为空?

是则将横坐标加上一条条码之宽度;

6•打印起始符;

7.(循环B)是否打印完本条条码(J个字符)?

是则转10;

8•打印一个字符的条码;

9.(循环B)下一个字符;

10•打印终止符;

11.修改X坐标;

12•(循环A)下一条条码

13.修改Y坐标;

14.打印本行每一条码的人工识别字符;

15.本页是否已打满?

是则打印,并对新页坐标初始化;

16.退出

四、程序代码:

用于检查参数设置正确性的程序主要从各项参数间的关系去检查。

如根据使用的宽度、高度、每行条码数,判断是否超出了纸的打印范围;输入的号码是否合法等。

可以为每字符设计一段各自的打印程序,这种方式编程简单。

也可以将打印程序与条形码的编码规则分离,通过参数传递某一字符的编码规则,不同的字符共享同一打印程序。

本列采用前一种方式。

如字母“J”的编码规则为:

“NNNNWWW,打印程序代码如下:

PrivateSubprn_J()

Printer.Line(x,y)-Step(widt,high),,BF注释:

打印窄条

x=x+widt注释:

改变X坐标x=x+widt注释:

打印窄空Printer.Line(x,y)-Step(widt,high),,BFx=x+widtx=x+widt

Printer.Line(x,y)-Step(w_n*widt,high),,BF注释:

打印宽条

x=x+w_n*widt注释:

改变X坐标x=x+w_n*widt注释:

打印宽空

Printer.Line(x,y)-Step(w_n*widt,high),,BF

x=x+w_n*widt

x=x+widt

Printer.Line(x,y)-Step(widt,high),,BFx=x+widt

x=x+widt注释:

打印位空

EndSub

其中x,y分别为坐标值,w_n为宽窄元素宽度比,widt为窄元素的宽度值(点),high

为条形码高度,每打印一个条元素,应立即改变X坐标,以便打印下一个元素;打印空元素

时,由于是不着色,只需改变X坐标即可;每一个字符打印结束时,应打印一个位空(本列

中位空宽度等于窄空)。

其它的42个字符的编码规则,读者可以在有关条形码技术的文献中查到。

VB条形码编程实例

条形码技术广泛应用于各行各业,你随便拿起一本书、一包薯片都可以在外包装上找到,利用条码读取机便可将这一条条黑白相间、粗细不同的垂直线条识别而转换为具体的数值,并将这个数值返回到计算机中进行处理。

正是这样,有了条形码技术,人们很方便就能取得该商品的有关信息如商品名称、规格、价格等,因为每种商品都有其对应的条形码,这个条形码计算机(终端、服务器)中就可以迅速返回用户,从数据库中读取约定的商品,信息使得销售、进货、存货等等管理更有效率,也对防止假冒伪劣又一定的抑制作用。

条码的编码方式有多种,不同行业,不同国家标准也不尽相同。

条形码通过线条的粗细来表达其数值。

至于接口方式一般也有多种,如键盘口的、串行口的。

一般传感装置是光罩式的,也有笔式的。

上面笼笼统统地谈了一些关于条形码的知识,可帮助你更好地阅读以下更深入的内容。

条形码有关概念先说到这里,接着是详细具体的编程实现方法。

一、条形码的读取用过键盘口式的扫条码工具的朋友就知道,它就如同在鍵盘上按下数字鍵一样,基本不需任何编程和处理。

但如果你使用的是其它接口的话,可能你就要为该设备编写通讯代码了。

以下有一段简单的25针串口的条码读取器通讯代码。

OptionExplicitDimsDataAsString

PrivateSubForm_Load()

WithMSComm1

.CommPort=3'设为COM3试运行的系统而定,你可提供一个Combox让用户选择。

.PortOpen=True'打开通讯端口EndWith

EndSub

PrivateSubMSComm1_OnComm()

DimEndPosAsInteger

SelectCaseMSComm1.CommEvent

CasecomEvReceive'当有数据传送过来时sData=sData&Trim(MSComm1.Input)

'检索回车,通常读卡机每组数据結尾都返回一个回车作为结束符EndPos=InStr(1,sData,Chr(13))

IfEndPos=0Then'如果未结束就继续努力

Else'读完一组。

lblBarCode.Caption=sData'显示一组条形码WithlstBarCode

.AddItemMid(sData,1,EndPos-1)'添加一组条形码到列表EndWith

sData=""'清空EndIfEndSelectEndSub

PrivateSubcmdEnd_Click()

MSComm1.PortOpen=False'关闭端口

End

EndSub

二、条形码的生成看完以上关于条码读取的代码是否觉得很容易呢?

对,在VB上编程本来就不难。

以下关于条形码生成的代码也是很容易理解,只需使用一个OFFICE的附带的BarCode控件就可以轻

松打印出11种不同标准的条形码,足以满足我们的要求。

想起我书架上的一本书中的一篇用TurboC编写条形码打印程序文章,长篇大论,那时不知看了n天,打了n小时字结果也不尽人意,现在真是幸福多了:

)。

废话说完,得回归正题。

且看条形码生成的代码及有关说明。

源代码主要由两个窗体(frmMain主窗体和frmOption条码设置窗体)和两个模块组成(modGetScreen.bas、SysDLG32.bas)。

考虑到篇幅,这里只列出部分较为关键的代码。

新建一个标准工程,添加一个名为(MicrosoftAccessBarCodeControl9)的条形码部件,并添加一个条码控件到窗口,并将窗口改名为frmMain,如图所示。

由于控件比较多,这里不便细说,详细内容请看源代码。

模块modGetScreen.bas代码如下:

OptionExplicit声明BitBlt、GetDesktopWindow、GetWindowDC、ReleaseDC这几个API函数略PublicRegUserAsBoolean

SubGetObjImage1(ObjAsObject,OwnerFormAsPictureBox,Picture1AsPictureBox)'hDC

DimhWndDeskAsLong

DimhDCDeskAsLong

'区域表达变量

DimxAsLong

DimyAsLong

DimwAsLong

DimhAsLongx=Obj.LeftScreen.TwipsPerPixelX

y=Obj.TopScreen.TwipsPerPixelY

w=Obj.WidthScreen.TwipsPerPixelXh=Obj.HeightScreen.TwipsPerPixelYhDCDesk=OwnerForm.hdc'取出图像CallBitBlt(Picture1.hdc,0,0,w,h,hDCDesk,x,y,vbSrcCopy)CallReleaseDC(hWndDesk,hDCDesk)

EndSub

主窗体frmMain.frm部分代码如下:

PrivateSubcmdPrint_Click()

'生成条形码图像

DimrAsLong,iAsInteger,tAsString,cfileAsString'临时变量t=BarCode

Fori=0ToVal(Times)-1

BarCode1.Value=BarCode+i

DoEvents

Picture1.Refresh

GetObjImage1BarCode1,Conel,Picture1

lfRegUser=FalseThen'如果未注册添加MASK标记

Picture1.PaintPicturePicture2.Picture,300,300

Endlf

lfDir(SavePath,vbDirectory)=""ThenMkDirSavePath

SavePath=SavePath&llf(Right(SavePath,1)<>"","","")

cfile=SavePath&BarCode1.Value&".bmp"

SavePicturePicture1.lmage,cfile'将条形码保存为图像文件以便打印

Next

BarCode=t

EndSub

条形码设置窗体frmOption.frm代码如下:

OptionExplicit

'条形码设置模块

PrivateSubcboBig_Click()

BarCode1.Style=cboBig.ListIndex'改变标准EndSub

PrivateSubcboDirection_Click()

BarCode1.Direction=cboDirection.ListIndex'改变方向EndSub

PrivateSubcboLine_Click()

BarCode1.LineWeight=cboLine.ListIndex'改变线宽EndSub

PrivateSubcboSmall_Click()

BarCode1.SubStyle=cboSmall.ListIndex'改变样式EndSub

PrivateSubCheck1_Click()

BarCode1.ShowData=Check1.Value'是否显示数据EndSub

PrivateSubcmdChange_Click()

'设置长、宽大小

BarWidth=BarCode1.Height

BarHeight=BarCode1.WidthcmdRefresh_Click

EndSub

PrivateSubcmdOK_Click()

'传送条形码设定到主界面

WithfrmMain.BarCode1.LineWeight=BarCode1.LineWeight.Style=BarCode1.Style.SubStyle=BarCode1.SubStyle.Direction=BarCode1.Direction.Width=BarCode1.Width

.Height=BarCode1.Height

.ShowData=BarCode1.ShowData

Me.Hide

EndWith

WithfrmMain.Picture1.Width=.BarCode1.Width.Picture1.Height=.BarCode1.Height.Conel.Width=.BarCode1.Width.Conel.Height=.BarCode1.HeightEndWith

EndSub

PrivateSubcmdRefresh_Click()

BarCode1.Width=BarWidth

BarCode1.Height=BarHeight

EndSub

PrivateSubForm_Load()

LoadBarInfo

BarWidth=BarCode1.Width

BarHeight=BarCode1.Height

EndSub

SubLoadBarInfo()'初始化选项

LoadBigClasscboBig

LoadSmallClasscboSmall

LoadLineSizecboLine

LoadDirectioncboDirection

EndSub

SubLoadBigClass(cboAsComboBox)'条码标准

Withcbo

.AddItem"UPC-A"

.AddItem"UPC-E"

.AddItem"EAN-13"

.AddItem"EAN-8"

.AddItem"CaseCode"

.AddItem"Codabar(NW-T)"

.AddItem"Code-39"

.AddItem"Code-128"

.AddItem"U.S.Postnet"

.AddItem"U.S.PostalFIM"

.AddItem"JPPost"

.ListIndex=2

EndWith

EndSub

SubLoadSmallClass(cboAsComboBox)'条码样式

Withcbo

.AddItem"Standard".AddItem"2-DigitSupplement".AddItem"5-DigitSupplement".AddItem"POSCaseCode"

.ListIndex=0

EndWith

EndSub许多人在编写数据库应用程序时,都想要加上条形码功能加强工作效率,尤其是销售管理,图书馆管理这类流量大的应用软件,但由于条形码技术难以掌握、标谁又多以及过去的技术种种原因,使得许多人望而却步。

本文介绍的一套简单实用的条形码解决方法,希望能帮助各位完善软件系统的功能。

VB应用程序中打印条形码的两种方法

条形码作为一种机器可识别的图形,它能快速、准确地标识某种产品或商品,在许多数据库应用中起作很重要的作用,如超市收银、车站售票等场合。

当某件物品上带有的条形码被条码扫描器正确解读后,将会得到该物品的唯一标识字符串,通过检索数据库我们就可以很容易知道它的一些其它属性并作相应处理。

虽然在Internet上能找到许多免费和不免费的条形码打印控件,但是这些控件除了使用不方便外,还有一个最大的缺点:

它们的打印输出不能和我们的程序共存在一个打印页面上,比如说在一个过程中,我们先向系统Printer

中输出一些内容,然后再调用控件的条形码打印方法,最后打印的结果为两页!

,如果现在

我们要处理一张车票,上面不仅要打印条形码,还要有终点站和票价等信息,那么控件就变得不可用。

对程序员来说,可能还是希望能了解条形码打印的原理,本文提出两种打印方法与同行们探讨。

一、直接利用有条形码打印功能的打印机

有许多打印机能够直接打印条形码,但在VB中,我们在DOS时代熟悉的LPRINT语句

已经不能再使用了,打印操作被Windows的Spool系统完全接管,输出是以“页”为单位,所有的打印输出都被Windows转换为图形发送给打印驱动程序。

而要使打印机打印条形码就必须将对应的ESC序列直接发送给它,因此我们就要想办法避开Windows的Spool系统,也就是说再程序中不能使用Printer对象和Printers集合处理打印输出,在VB中要将ESC指令直接发送给打印机至少有三种方法,前两种方法是调用WindowsAPI函数:

Escape()和SpoolFile(),第三种是最容易的方法:

打开打印机端口进行二进制存取,我们主要考虑这种方法。

即使在Windows时代,”LPT1:

”和”PRN仍然是可用的,下面我们先作一个试验:

打开一个DOS窗口,在提示符下输入COPYCONLPT回车,然后随便输入一些字符,最后按F6键,打印机就开始工作了,它将打印出你输入的那些字符!

下面的代码演示了直接将指令和字符发送给打印机:

PrivateSubCommand1_Click()

DimstrOutAsString

StrOut=“这是直接发送到打印机端口的字符串”

'打开打印机端口,其中的”LPT1:

”可能需要根据你的打印机设置而改变

Open“LPT1:

”ForBinaryAccessWriteAs#1

‘发送给打印机,注意语句的最后一个参数必须是变量

Put#1,,strOut

‘关闭打印机端口

Close#1

EndSub

各种打印机打印条形码的指令可能不同,比如将上面的变量strOut赋值为:

strOut=Chr(28)&“P”&Chr(5)&Chr

(2)&Chr(3)&Chr(3)&Chr(6)&“012345”

将在AR2400打印机上打印出内容为”012345”的CODE39格式的条形码。

具体的打印控

制指令请参考打印机手册。

用这种方法的缺点:

一是过份依赖打印机本身,而有条形码打印功能的打印机通常要比普通打印机昂贵,这会使构造应用系统不够经济;二是所有的打印输出都必须你自己处理,比如打印定位就很浪费时间。

、利用画图方式输出到普通打印机

条形码的编码规则不外乎是通过线条和线条间间隙的宽窄不同来表示二进制的1和0,只要我们了解了条形码的编码规则,完全可以用画图的方式在普通打印机上得到可以接受的效果。

下面我们就使用最普遍的CODE39码进行讨论。

CODE39码的编码规则是:

1、每五条线表示一个字符;

2

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 农学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1