VB打印条码极简单的方法
公司接到一个医院病案的软件升级改造任务,在客户的程序中增加打印条码功能,因为客户的程序是VB开发的,因为客户提出需要自行调整打印参数等,一开始就调用word来打印,文字等信息都能够正常打印出,打印参数也能够调整,打印效果很好,但是打印的条码不能识别;
于是寻求万能的Internet,搜索后发现网上的许多资料都是于code39为例,要不就是复杂,使用code39的条码原理,使用画图控件画图来实现;要不就是看不懂,不能实现;要不就是很简单,也下载了相关的代码,也有在word中调用barcode控件,但是我一直到没有到可行或者说看明白的(代码都是没有注释的),也下载多个代码,但是使用barcode在word打印的都没有成功,最后在绿竹小龙的博客中到可行的方法,并且是说的很明白的(有些细节不详,需要认真思考后才明白!),也是使用mocrosoft的barcode控件,打印form,在这总结了我的经验,给大家参考,避免大家走弯路,在这里特别感谢绿竹小龙,也感谢各位的无私奉献,大家如果不明白可以****************联系。
1、注册mocrosoft的barcode控件,网上可以到并下载;
2、使用新form来显示打印的内容,调整form的大小与打印纸的大小一样
3、添加picture控件,为什么要使用picture控件,是在打印后发现,没有picture控件打印的效果很差,字体看不清;在picture控件上添加barcode的控件,在picture控件上添加barcode的控件,STYLE属性控制条形码的类形,当值为6时为CODE39码(仅包含最简单的数值和字符,零售流通领域常用),当值为7时为CODE128码(字符比较齐全,目前比较通用),结合客户的要求,编程中使用CODE128码
4、添加其他的需要打印的控件,设置好字体等,
5、激活from时将需要打印的内容赋值给对应控件,
6、等待1秒后(因为picture控件的关系,赋值后马上打印经常会出现空白内容)
7、打印form
8、关闭form
具体的代码见下:
使用条码机打印,条码纸规格是6cm*6cm
打印的内容有住院号、住院号+住院次数的条码、姓名、性别、出院日期、入院日期、出院科室
所以form的内容是:picture控件、text控件、label控件的背景设为与条码纸一样的颜(白),条码是用barcode控件,其他使用text控件。
Form激活时的代码:
Private Sub Form_Activate()
‘Form激活时的代码
Dim ZYH As String  ‘定义住院号为文本类型
Dim ZyhTemp As String  ‘定义临时的住院号为文本类型
For i = 0 To Me.LblBL.Count  ‘根据标签控件的个数(与text控件的个数相对应,方便赋值)
Me.TextBL(i).Text = FrmBLFMPrint.TextBL(i).Text  ‘从其他form将需要打印的控件值赋值过来,准备打印
Next
'去掉住院号前面的0,要求不打印住院号前面的0
ZYH = Trim(Me.TextBL(1).Text)
ZyhTemp=zyh
For i2 = 1 To 10  ‘住院号是10位的,所以从左边逐一检查住院号,将0全部去掉
If Left(ZYH, 1) = "0" Then ‘左边第一位是0,则去掉0
  ZYH = Right(ZYH, Len(ZYH) - 1)
Else
‘当检查到左边第一位非0时,就退出循环,并保存最后的住院号vb软件开发
Me.TextBL(1).Text = ZYH
  Exit For
End If
Next
'住院次数标准为3位数字,不够位数前面补0
Dim ZYCS As String
ZYCS = Trim(Me.TextBL(0).Text)
For i = 0 To 3 - Len(Trim(Me.TextBL(0).Text)) - 1
ZYCS = "0" & ZYCS
Next
Me.BarCodeCtrl1.Value = zyhtemp & zycs  ‘给条码控件赋值
Sleep 1000 ‘暂停1秒
Me.PrintForm  ‘打印窗体
Unload Me  ‘关闭窗体
End Sub
打印效果:
在看了绿竹小龙的博客后,我也尝试的他说的方法,但是条码死活就是不能识别,他的截图能够识别条码,我按照他的方法连截图后不能识别,非常郁闷。最后只能是不是打印窗体的方法来完成任务,缺点是不能在打印时调整打印参数了。
在这里附上他的方法:他的一开始的方法是使用windows的API函数,先对条码控件抓图,在贴到picture控件后再打印,也是发现打印出的条码不能识别,最后也是使用打印form方法解决,大家有兴趣可以去看看他的博客blog.sina/s/blog_66b5659d0101dyps.html。
博客原文:
应用VB编程实现条码打印
 (2013-06-04 00:27:32)
转载▼
分类: VB
    前几天公司突然接到客户的要求,需要我们公司在所有的外包装盒上贴上规定的条码,该条码由零件号、供应商代码、生产批次代码共三个部分组成,我公司立即购买了条码打印机,但是销售商提供的Intermec条码打印机并没有随机软件,该公司也不具备条码打印软件的开发能力,所以他们推荐我们使用一款通用的条码编辑打印软件的破解版本LABLEVIEW进行打印,通过使用过后发现使用这个软件对本公司的适用性不够、数据库连接处理能力较差,每一个数据都需要人工输入,出错的机率较大。为此,领导要求公司计算机室拿出一个好的办法来。我们经过一段时间的研究,发现通过VB编程调用微软OFFICE自带的条形码控件Microsoft Barcode Control 9.0进行条形码的编辑并打印,这样做一是可以按需定制需打印的条形码,另一个软件短小精干,实用性强,占用系统资源也低,实用效果不错。考虑到刚开始的时候在网上查资料很多都不实用而有这种需求的人很多,所以特把自己的设计经验拿出来与大家共享。希望能对有这方面需求的人有所帮助。
1、程序设计思路
首先要简要了解一下BARCODE9控件,这是微软自带的一个条形码控件,其中的STYLE属性控制条形码的类形,当值为6时为CODE39码(仅包含最简单的数值和字符,零售流通领
域常用),当值为7时为CODE128码(字符比较齐全,目前比较通用),结合客户的要求,编程中使用CODE128码。
编程思路为:针对客户的条码三段式要求,第一段为零件号,第二段为供应商编码(固定),第三段为基本由日期生成的生产批次号,窗体中设置可选择的组合框控件用于选择不同的零件号,文本框控件用于设置供应商编码,另一文本框用于读取系统日期并按要求输出生产批次。再设置一条形码控件,由条码确定按钮使条码的VALUE赋值为前面的三段式条码各段的累加。由于条形码控件没有打印属性,还得设置一个图片控件用于条形码的转贴打印。
再通过按钮控件打印。
选择零件号、供应商编码、生产批次号
条形码控件
条码输出
条码确定按钮
条码控件VALUE属性赋值
条码----剪贴板---图片控件---打印图片
条码打印按钮
 
 
 
 
2、程序设计步骤
  2.1窗体设计 根据流程设定,能很快设计出程序主窗体:如下图
2.2代码编写:
对按钮控件编写代码
条码确定及预览:
Private Sub Command1_Click()
BarCodeCtrl1.Value = combox1.Text + Text2.Text + Text3.Text
End Sub
条码打印:(这段代码网络上一般都有,但是有的经试验不能用,这个能用,而且该代码的确能实现条码的打印,但是扫描读取还有问题,我是经过N久才摸索出原因并想办法加以解决的,在打印结果中将进行说明)
Private Sub Command2_Click()
Dim hScrDC As Long
hScrDC = GetDC(Picture1.hwnd)
Dim hMemDC As Long
hMemDC = CreateCompatibleDC(hScrDC) '
Dim xScrn As Integer
Dim yScrn As Integer
Picture1.ScaleMode = vbPixels
xScrn = Picture1.ScaleWidth '+ 200
yScrn = Picture1.ScaleHeight '+ 200
Dim hBitmap As Long
hBitmap = CreateCompatibleBitmap(hScrDC, xScrn, yScrn)
Dim hOldmap As Long
hOldmap = SelectObject(hMemDC, hBitmap)
BitBlt hMemDC, 0, 0, xScrn, yScrn, hScrDC, 0, 0, SRCCOPY
hBitmap = SelectObject(hMemDC, hOldmap)
OpenClipboard hwnd
EmptyClipboard
SetClipboardData CF_BITMAP, hBitmap
CloseClipboard
Dim picturex As Picture
Set picturex = Clipboard.GetData()
Printer.Print ""
Printer.PaintPicture picturex, 0, 0
Printer.EndDoc
End Sub
Private Sub Form_Load()
End Sub
由于条码打印中应用到部分函数,故在模块中需进行如下定义:
Option Explicit
Private Const HORZRES = 8            '  Horizontal width in pixels
Private Const VERTRES = 10          '  Vertical width in pixels
Private Const CF_BITMAP = 2