VB条形码编程Word格式.docx
《VB条形码编程Word格式.docx》由会员分享,可在线阅读,更多相关《VB条形码编程Word格式.docx(17页珍藏版)》请在冰豆网上搜索。
时,打印出来的条形码可以阅读,若窄元素的宽度小于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
打印位空
EndSub
其中x,y分别为坐标值,w_n为宽窄元素宽度比,widt为窄元素的宽度值(点),high
为条形码高度,每打印一个条元素,应立即改变X坐标,以便打印下一个元素;
打印空元素
时,由于是不着色,只需改变X坐标即可;
每一个字符打印结束时,应打印一个位空(本列
中位空宽度等于窄空)。
其它的42个字符的编码规则,读者可以在有关条形码技术的文献中查到。
VB条形码编程实例
条形码技术广泛应用于各行各业,你随便拿起一本书、一包薯片都可以在外包装上找到,利用条码读取机便可将这一条条黑白相间、粗细不同的垂直线条识别而转换为具体的数值,并将这个数值返回到计算机中进行处理。
正是这样,有了条形码技术,人们很方便就能取得该商品的有关信息如商品名称、规格、价格等,因为每种商品都有其对应的条形码,这个条形码计算机(终端、服务器)中就可以迅速返回用户,从数据库中读取约定的商品,信息使得销售、进货、存货等等管理更有效率,也对防止假冒伪劣又一定的抑制作用。
条码的编码方式有多种,不同行业,不同国家标准也不尽相同。
条形码通过线条的粗细来表达其数值。
至于接口方式一般也有多种,如键盘口的、串行口的。
一般传感装置是光罩式的,也有笔式的。
上面笼笼统统地谈了一些关于条形码的知识,可帮助你更好地阅读以下更深入的内容。
条形码有关概念先说到这里,接着是详细具体的编程实现方法。
一、条形码的读取用过键盘口式的扫条码工具的朋友就知道,它就如同在鍵盘上按下数字鍵一样,基本不需任何编程和处理。
但如果你使用的是其它接口的话,可能你就要为该设备编写通讯代码了。
以下有一段简单的25针串口的条码读取器通讯代码。
OptionExplicitDimsDataAsString
PrivateSubForm_Load()
WithMSComm1
.CommPort=3'
设为COM3试运行的系统而定,你可提供一个Combox让用户选择。
.PortOpen=True'
打开通讯端口EndWith
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
二、条形码的生成看完以上关于条码读取的代码是否觉得很容易呢?
对,在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)
主窗体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
条形码设置窗体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
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
PrivateSubcmdRefresh_Click()
BarCode1.Width=BarWidth
BarCode1.Height=BarHeight
LoadBarInfo
BarWidth=BarCode1.Width
BarHeight=BarCode1.Height
SubLoadBarInfo()'
初始化选项
LoadBigClasscboBig
LoadSmallClasscboSmall
LoadLineSizecboLine
LoadDirectioncboDirection
SubLoadBigClass(cboAsComboBox)'
条码标准
Withcbo
.AddItem"
UPC-A"
UPC-E"
EAN-13"
EAN-8"
CaseCode"
Codabar(NW-T)"
Code-39"
Code-128"
U.S.Postnet"
U.S.PostalFIM"
JPPost"
.ListIndex=2
SubLoadSmallClass(cboAsComboBox)'
条码样式
Standard"
.AddItem"
2-DigitSupplement"
5-DigitSupplement"
POSCaseCode"
.ListIndex=0
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
各种打印机打印条形码的指令可能不同,比如将上面的变量strOut赋值为:
strOut=Chr(28)&
“P”&
Chr(5)&
Chr
(2)&
Chr(3)&
Chr(6)&
“012345”
将在AR2400打印机上打印出内容为”012345”的CODE39格式的条形码。
具体的打印控
制指令请参考打印机手册。
用这种方法的缺点:
一是过份依赖打印机本身,而有条形码打印功能的打印机通常要比普通打印机昂贵,这会使构造应用系统不够经济;
二是所有的打印输出都必须你自己处理,比如打印定位就很浪费时间。
、利用画图方式输出到普通打印机
条形码的编码规则不外乎是通过线条和线条间间隙的宽窄不同来表示二进制的1和0,只要我们了解了条形码的编码规则,完全可以用画图的方式在普通打印机上得到可以接受的效果。
下面我们就使用最普遍的CODE39码进行讨论。
CODE39码的编码规则是:
1、每五条线表示一个字符;
2