条形码技术广泛应用于各行各业,你随便拿起一本书、一包薯片都可以在外包装上找到,利用条码读取机便可将这一条条黑白相间、粗细不同的垂直线条识别而转换为具体的数值,并将这个数值返回到计算机中进行处理。
正是有了条形码技术,人们很方便就能取得该商品的有关信息,如商品名称、规格、价格等,因为每种商品都有其对应的条形码。通过条形码,计算机(终端、服务器)就可以迅速返回用户,从数据库中读取约定的商品、信息使得销售、进货、存货等等管理更有效率,也对防止假冒伪劣有一定的抑制作用。
条码的编码方式有多种,不同行业,不同国家,标准也不尽相同。条形码通过线条的粗细来表达其数值。至于接口方式一般也有多种,如键盘口的、串行口的。一般传感装置是光罩式的,也有笔式的。 上面笼笼统统地谈了一些关于条形码的知识,可帮助你更好地阅读以下更深入的内容。条形码有关概念先说到这里,接着是详细具体的编程实现方法。
一、条形码的读取
用过键盘口式的扫条码工具的朋友就知道,它就如同在鍵盘上按下数字鍵一样,基本不需任何编程和处理。但如果你使用的是其它接口的话,可能你就要为该设备编写通讯代码了。以下有一段简单的25针串口的条码读取器通讯代码。
OptionExplicit
DimsDataAsString
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=""'清空
EndIf
EndSelect
EndSub
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
DimhAsLong
x=Obj.LeftScreen.TwipsPerPixelX
y=Obj.TopScreen.TwipsPerPixelY
w=Obj.WidthScreen.TwipsPerPixelX
h=Obj.HeightScreen.TwipsPerPixelY
hDCDesk=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
IfRegUser=FalseThen'如果未注册添加MASK标记
Picture1.PaintPicturePicture2.Picture,300,300
EndIf
IfDir(SavePath,vbDirectory)=""ThenMkDirSavePath
SavePath=SavePath&IIf(Right(SavePath,1)<>"","","")
cfile=SavePath&BarCode1.Value&".bmp"
SavePicturePicture1.Image,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.Width
cmdRefresh_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.Height
EndWith
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