1、时,打印出来的条形码可以阅读,若窄元素的宽度小于 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
2、),bf 或Printer.Line(x,y)-Step(2*i,h),bf用 Printer.Line 打印, 量度单位为点, 最小精度为达 10,当窄元素宽为 10时, J10059 六位字符之条码尺寸为: 21MM。根据以上的比较, 使用第二种方法打印输入的条形码精度最高 (同样的字符数, 尺寸最 短)。很显然,不同的打印方式,分别有不同的适用范围,对尺寸宽度要求不高的情况下, 可以使用第一种打印方式,若对条形码尺寸要求较严格,则使用第二种打印方式更合适。软件设计一、 菜单设计: 由于条形码轻印刷软件相对说来是一个很小的系统, 需要选择的项目不多,可以不设置菜单, 而将全部的操作由窗体控
3、件来完成。 如果使用上述的第一种打印方式, 则必须建立另一窗体,用于第一步的输出条形码图形。二、 设计窗体控件:窗体中的控件包括两大类,即:参数设置框、打印操作按钮。本列 设计的窗体见图示。 本列给出的是一个对参数没有设置功能的窗体, 有兴趣的读者可以在此 基础上自行补充它。对于打印参数,对条形码的打印来说,需要指定的参数大致有:条码宽窄比: 3: 12:1;条码高;窄元素宽度;打印机类型及端口;打印份数;打印纸尺寸规格;每行条形码数; 每个条码的字符数;是否自动增值打印;增值步长;每一页行计数起止数;终止码等。本列设计了八个按钮,其作用分别是:Begin- 单号条形码打印开始Auto- 自动
4、增值打印开始Page- 将打印机内存中的条码(不足一页)打印出来Cancel- 中止自动增值打印Delete- 清除打印机内存中的未打印条码Help- 帮助信息About- 版本及设计信息Exit- 关闭系统三、程序流程:在本例中, 条形码的打印分为单号打印; 自动增值打印两种。单号打印, 是用户输入一 个或几个需要打印的号码的打印方式; 而自动增值打印是用户指定起始号、 终止号及增加步 长,由机器自动生成被打印号码来打印。 其实这两种方式在打印时的操作是完全一样的, 不 同之处在于被打号码的获取,需要注意的是由于 39 码字符集中包括字符,在自动增值时要 与纯数字码区别。下面以单号打印为例,
5、介绍条形码打印的程序流程。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. 退出四、程序代码:用于检查参数设置正确性的程序主要
6、从各项参数间的关系去检查。如根据使用的宽度、 高度、每行条码数,判断是否超出了纸的打印范围;输入的号码是否合法等。可以为每字符设计一段各自的打印程序, 这种方式编程简单。 也可以将打印程序与条形 码的编码规则分离, 通过参数传递某一字符的编码规则, 不同的字符共享同一打印程序。 本 列采用前一种方式。如字母“ J ”的编码规则为:“ NNNNWWW,打印程序代码如下:PrivateSubprn_J()Printer.Line(x,y)-Step(widt,high),BF 注释:打印窄条x=x+widt 注释:改变 X 坐标 x=x+widt 注释:打印窄空 Printer.Line(x,y)
7、-Step(widt,high),BF x=x+widt x=x+widtPrinter.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),BFx=x+w_n*widtx=x+widtPrinter.Line(x,y)-Step(widt,high),BF x=x+widt打印位空EndSub其中x,y分别为坐标值,w_n为宽窄元素宽度比, widt为窄元素的宽度值(点),high为条形码高度,每打印一
8、个条元素,应立即改变 X坐标,以便打印下一个元素;打印空元素时,由于是不着色,只需改变 X坐标即可;每一个字符打印结束时,应打印一个位空(本列中位空宽度等于窄空) 。其它的 42 个字符的编码规则, 读者可以在有关条形码技术的文献中 查到。VB条形码编程实例条形码技术广泛应用于各行各业, 你随便拿起一本书、 一包薯片都可以在外包装上找到, 利 用条码读取机便可将这一条条黑白相间、 粗细不同的垂直线条识别而转换为具体的数值, 并 将这个数值返回到计算机中进行处理。 正是这样, 有了条形码技术, 人们很方便就能取得该 商品的有关信息如商品名称、 规格、 价格等, 因为每种商品都有其对应的条形码,
9、这个条形 码计算机(终端、服务器)中就可以迅速返回用户,从数据库中读取约定的商品,信息使得 销售、进货、存货等等管理更有效率,也对防止假冒伪劣又一定的抑制作用。 条码的编码方式有多种, 不同行业, 不同国家标准也不尽相同。 条形码通过线条的粗细来表 达其数值。 至于接口方式一般也有多种, 如键盘口的、 串行口的。 一般传感装置是光罩式的, 也有笔式的。上面笼笼统统地谈了一些关于条形码的知识, 可帮助你更好地阅读以下更深入的内容。 条形 码有关概念先说到这里,接着是详细具体的编程实现方法。一、条形码的读取 用过键盘口式的扫条码工具的朋友就知道, 它就如同在鍵盘上按下数字鍵一样, 基本不需任 何编
10、程和处理。 但如果你使用的是其它接口的话, 可能你就要为该设备编写通讯代码了。 以 下有一段简单的 25 针串口的条码读取器通讯代码。OptionExplicit DimsDataAsStringPrivateSubForm_Load()WithMSComm1.CommPort=3设为COM3试运行的系统而定,你可提供一个 Combox让用户选择。.PortOpen=True 打开通讯端口 EndWithPrivateSubMSComm1_OnComm()DimEndPosAsIntegerSelectCaseMSComm1.CommEventCasecomEvReceive 当有数据传送过来
11、时 sData=sData&Trim(MSComm1.Input) 检索回车 , 通常读卡机每组数据結尾都返回一个回车作为结束符 EndPos=InStr(1,sData,Chr(13)IfEndPos=0Then 如果未结束就继续努力Else 读完一组。 lblBarCode.Caption=sData 显示一组条形码 WithlstBarCode.AddItemMid(sData,1,EndPos-1) 添加一组条形码到列表 EndWithsData= 清空 EndIf EndSelect EndSubPrivateSubcmdEnd_Click()MSComm1.PortOpen=Fal
12、se 关闭端口End二、条形码的生成 看完以上关于条码读取的代码是否觉得很容易呢?对,在 VB 上编程本来就不难。以下关于 条形码生成的代码也是很容易理解,只需使用一个 OFFICE的附带的BarCode控件就可以轻松打印出 11 种不同标准的条形码,足以满足我们的要求。想起我书架上的一本书中的一篇 用 TurboC 编写条形码打印程序文章,长篇大论,那时不知看了 n 天,打了 n 小时字结果也 不尽人意, 现在真是幸福多了 :) 。废话说完, 得回归正题。 且看条形码生成的代码及有关说 明。源代码主要由两个窗体( frmMain 主窗体和 frmOption 条码设置窗体)和两个模块组成 (
13、modGetScreen.bas 、SysDLG32.bas) 。考虑到篇幅,这里只列出部分较为关键的代码。 新建一个标准工程, 添加一个名为 (MicrosoftAccessBarCodeControl9) 的条形码部件, 并添 加一个条码控件到窗口,并将窗口改名为 frmMain ,如图所示。由于控件比较多,这里不便 细说,详细内容请看源代码。模块 modGetScreen.bas 代码如下:OptionExplicit 声明 BitBlt 、 GetDesktopWindow、GetWindowDC、ReleaseDC 这几个 API 函数略 PublicRegUserAsBoolean
14、SubGetObjImage1(ObjAsObject,OwnerFormAsPictureBox,Picture1AsPictureBox) hDCDimhWndDeskAsLongDimhDCDeskAsLong 区域表达变量DimxAsLongDimyAsLongDimwAsLongDimhAsLong x=Obj.LeftScreen.TwipsPerPixelXy=Obj.TopScreen.TwipsPerPixelYw=Obj.WidthScreen.TwipsPerPixelX h=Obj.HeightScreen.TwipsPerPixelY hDCDesk=OwnerFor
15、m.hdc 取出图像 CallBitBlt(Picture1.hdc,0,0,w,h,hDCDesk,x,y,vbSrcCopy) CallReleaseDC(hWndDesk,hDCDesk)主窗体 frmMain.frm 部分代码如下:PrivateSubcmdPrint_Click() 生成条形码图像DimrAsLong,iAsInteger,tAsString,cfileAsString 临时变量 t=BarCodeFori=0ToVal(Times)-1BarCode1.Value=BarCode+iDoEventsPicture1.RefreshGetObjImage1BarCod
16、e1,Conel,Picture1lfRegUser=FalseThe n 如果未注册添加 MASK标记Picture1.PaintPicturePicture2.Picture,300,300EndlflfDir(SavePath,vbDirectory)=ThenMkDirSavePathSavePath=SavePath&llf(Right(SavePath,1),)cfile=SavePath&BarCode1.Value&.bmpSavePicturePicture1.lmage,cfile 将条形码保存为图像文件以便打印NextBarCode=t条形码设置窗体 frmOption.
17、frm 代码如下:OptionExplicit 条形码设置模块PrivateSubcboBig_Click()BarCode1.Style=cboBig.ListIndex 改变标准 EndSubPrivateSubcboDirection_Click()BarCode1.Direction=cboDirection.ListIndex 改变方向 EndSubPrivateSubcboLine_Click()BarCode1.LineWeight=cboLine.ListIndex 改变线宽 EndSubPrivateSubcboSmall_Click()BarCode1.SubStyle=c
18、boSmall.ListIndex 改变样式 EndSubPrivateSubCheck1_Click()BarCode1.ShowData=Check1.Value 是否显示数据 EndSubPrivateSubcmdChange_Click() 设置长、宽大小BarWidth=BarCode1.HeightBarHeight=BarCode1.Width cmdRefresh_ClickPrivateSubcmdOK_Click() 传送条形码设定到主界面WithfrmMain.BarCode1 .LineWeight=BarCode1.LineWeight .Style=BarCode1
19、.Style .SubStyle=BarCode1.SubStyle .Direction=BarCode1.Direction .Width=BarCode1.Width.Height=BarCode1.Height.ShowData=BarCode1.ShowDataMe.HideEndWithWithfrmMain .Picture1.Width=.BarCode1.Width .Picture1.Height=.BarCode1.Height .Conel.Width=.BarCode1.Width .Conel.Height=.BarCode1.Height EndWithPriva
20、teSubcmdRefresh_Click()BarCode1.Width=BarWidthBarCode1.Height=BarHeightLoadBarInfoBarWidth=BarCode1.WidthBarHeight=BarCode1.HeightSubLoadBarInfo() 初始化选项LoadBigClasscboBigLoadSmallClasscboSmallLoadLineSizecboLineLoadDirectioncboDirectionSubLoadBigClass(cboAsComboBox) 条码标准Withcbo.AddItemUPC-AUPC-EEAN-
21、13EAN-8CaseCodeCodabar(NW-T)Code-39Code-128U.S.PostnetU.S.PostalFIMJPPost.ListIndex=2SubLoadSmallClass(cboAsComboBox) 条码样式Standard .AddItem2-DigitSupplement5-DigitSupplementPOSCaseCode.ListIndex=0EndSub 许多人在编写数据库应用程序时,都想要加上条形码功能加强工作效率,尤其是销售管理, 图书馆管理这类流量大的应用软件, 但由于条形码技术难以掌握、 标谁又多以及过去的技术 种种原因, 使得许多人望而
22、却步。 本文介绍的一套简单实用的条形码解决方法, 希望能帮助 各位完善软件系统的功能。VB应用程序中打印条形码的两种方法条形码作为一种机器可识别的图形, 它能快速、 准确地标识某种产品或商品, 在许多数 据库应用中起作很重要的作用, 如超市收银、 车站售票等场合。 当某件物品上带有的条形码 被条码扫描器正确解读后, 将会得到该物品的唯一标识字符串, 通过检索数据库我们就可以 很容易知道它的一些其它属性并作相应处理。虽然在 Internet 上能找到许多免费和不免费 的条形码打印控件, 但是这些控件除了使用不方便外, 还有一个最大的缺点: 它们的打印输 出不能和我们的程序共存在一个打印页面上,比
23、如说在一个过程中,我们先向系统 Printer中输出一些内容,然后再调用控件的条形码打印方法,最后打印的结果为两页! ,如果现在我们要处理一张车票, 上面不仅要打印条形码, 还要有终点站和票价等信息, 那么控件就变 得不可用。 对程序员来说, 可能还是希望能了解条形码打印的原理, 本文提出两种打印方法 与同行们探讨。一、直接利用有条形码打印功能的打印机有许多打印机能够直接打印条形码, 但在VB中,我们在DOS时代熟悉的 LPRINT语句已经不能再使用了,打印操作被 Windows 的 Spool 系统完全接管,输出是以“页”为单位, 所有的打印输出都被 Win dows转换为图形发送给打印驱动
24、程序。 而要使打印机打印条形码就 必须将对应的ESC序列直接发送给它,因此我们就要想办法避开 Windows的Spool系统,也 就是说再程序中不能使用 Printer 对象和Printers 集合处理打印输出,在 VB中要将ESC 指令直接发送给打印机至少有三种方法,前两种方法是调用 WindowsAPI 函数: Escape() 和 SpoolFile() ,第三种是最容易的方法:打开打印机端口进行二进制存取,我们主要考虑这 种方法。即使在 Windows时代,” LPT1:”和” PRN仍然是可用的,下面我们先作一个试验:打 开一个DOS窗口,在提示符下输入 COPYCONLPT回车,然
25、后随便输入一些字符,最后按 F6 键,打印机就开始工作了, 它将打印出你输入的那些字符! 下面的代码演示了直接将指令和 字符发送给打印机:PrivateSubCommand1_Click()DimstrOutAsStringStrOut= “这是直接发送到打印机端口的字符串”打开打印机端口,其中的” LPT1:”可能需要根据你的打印机设置而改变Open“ LPT1: ” ForBinaryAccessWriteAs#1发送给打印机,注意语句的最后一个参数必须是变量Put#1,strOut关闭打印机端口Close#1各种打印机打印条形码的指令可能不同,比如将上面的变量 strOut 赋值为:st
26、rOut=Chr(28)& “P” &Chr(5)&Chr(2)&Chr(3)&Chr(6)& “ 01 2345”将在AR2400打印机上打印出内容为” 012345”的CODE39格式的条形码。具体的打印控制指令请参考打印机手册。用这种方法的缺点: 一是过份依赖打印机本身, 而有条形码打印功能的打印机通常要比 普通打印机昂贵,这会使构造应用系统不够经济;二是所有的打印输出都必须你自己处理, 比如打印定位就很浪费时间。、利用画图方式输出到普通打印机条形码的编码规则不外乎是通过线条和线条间间隙的宽窄不同来表示二进制的1和0, 只要我们了解了条形码的编码规则, 完全可以用画图的方式在普通打印机上得到可以接受的 效果。下面我们就使用最普遍的 CODE39码进行讨论。CODE39码的编码规则是:1、 每五条线表示一个字符;2
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1