vb制作条形码
1、怎样用vb做出能输入数字生成条形码的程序
有一个控件,忘了叫什么了。网上搜!
2、用VB6怎样制作一个打印条码的简单应用程序
上海启邦条码系统工程师马天宇回答你:
编程制作条码打印程序有几种方法:
如果是普通激光打印机,可以使用条码字体、条码控件、或调用第三方条码编辑打印软件。最复杂就是根据条码的规则自己编写程序直接绘制条码。
如果是条码打印机,除了以上几种方法,还可以使用驱动里的条码字体。
3、VB应用程序中打印条形码的方法
条形码作为一种机器可识别的图形,它能快速、准确地标识某种产品或商品,在许多数据库应用中起作很重要的作用,如超市收银、车站售票等场合。当某件物品上带有的条形码被条码扫描器正确解读后,将会得到该物品的唯一标识字符串,通过检索数据库我们就可以很容易知道它的一些其它属性并作相应处理。虽然在Internet上能找到许多免费和不免费的条形码打印控件,但是这些控件除了使用不方便外,还有一个最大的缺点:它们的打印输出不能和我们的程序共存在一个打印页面上,比如说在一个过程中,我们先向系统 Printer 中输出一些内容,然后再调用控件的条形码打印方法,最后打印的结果为两页!,如果现在我们要处理一张车票,上面不仅要打印条形码,还要有终点站和票价等信息,那么控件就变得不可用。对程序员来说,可能还是希望能了解条形码打印的原理,本文提出两种打印方法与同行们探讨。
一、直接利用有条形码打印功能的打印机
有许多打印机能够直接打印条形码,但在 VB 中,我们在DOS时代熟悉的LPRINT语句已经不能再使用了,打印操作被Windows的Spool系统完全接管,输出是以“页”为单位,所有的打印输出都被Windows转换为图形发送给打印驱动程序。而要使打印机打印条形码就必须将对应的ESC序列直接发送给它,因此我们就要想办法避开Windows的Spool系统,也就是说再程序中不能使用Printer对象和Printers集合处理打印输出,在VB中要将ESC指令直接发送给打印机至少有三种方法,前两种方法是调用Windows API 函数:Escape()和SpoolFile(),第三种是最容易的方法:打开打印机端口进行二进制存取,我们主要考虑这种方法。
即使在Windows时代,”LPT1:”和”PRN”仍然是可用的,下面我们先作一个试验:打开一个DOS窗口,在提示符下输入COPY CON LPT1:回车,然后随便输入一些字符,最后按F6键,打印机就开始工作了,它将打印出你输入的那些字符!下面的代码演示了直接将指令和字符发送给打印机:
Private Sub Command1_Click()
Dim strOut As String
StrOut = “这是直接发送到打印机端口的字符串”
‘ 打开打印机端口,其中的”LPT1:”可能需要根据你的打印机设置而改变
Open “LPT1:” For Binary Access Write As #1
‘ 发送给打印机,注意语句的最后一个参数必须是变量
Put #1, ,strOut
‘ 关闭打印机端口
Close #1
End Sub
各种打印机打印条形码的指令可能不同,比如将上面的变量 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、 粗线表示1,细线表示0;
3、 线条间的间隙宽的表示1,窄的表示0;
4、 五条线加上它们之间的四条间隙就是九位二进制编码,而且这九位中必定有三位是1,所以称为39码;
5、 条形码的首尾各一个*标识开始和结束
在我们的程序中,给常用的字符都进行编码,解读时先取线条粗细,再取间隙宽窄,如:
上图中的字符*就可以解读为 001101000,字符3解读为 110000100
下面就是我们给出的子过程:
注释: 将字符串 strBarCode 对应的条形码输出到缺省打印机
Private Sub PrintBarCode( _
ByVal strBarCode As String, _
Optional ByVal intXPos As Integer = 0, _
Optional ByVal intYPos As Integer = 0, _
Optional ByVal intPrintHeight As Integer = 10, _
Optional ByVal bolPrintText As Boolean = True _
)
注释: 参数说明:
注释: strBarCode - 要打印的条形码字符串
注释: intXPos, intYPos - 打印条形码的左上角坐标(缺省为(0,0),坐标刻度为:毫米)
注释: intHeight - 打印高度(缺省为一厘米,坐标刻度为:毫米)
注释: bolPrintText - 是否打印人工识别字符(缺省为true)
注释: "0"-"9","A-Z","-","%","$"和"*" 的条码编码格式,总共 40 个字符
Static strBarTable(39) As String
注释: 初始化条码编码格式表
strBarTable(0) = "001100100" 注释: 0
strBarTable(1) = "100010100" 注释: 1
strBarTable(2) = "010010100" 注释: 2
strBarTable(3) = "110000100" 注释: 3
strBarTable(4) = "001010100" 注释: 4
strBarTable(5) = "101000100" 注释: 5
strBarTable(6) = "011000100" 注释: 6
strBarTable(7) = "000110100" 注释: 7
strBarTable(8) = "100100100" 注释: 8
strBarTable(9) = "010100100" 注释: 9
strBarTable(10) = "100010010" 注释: A
strBarTable(11) = "010010010" 注释: B
strBarTable(12) = "110000010" 注释: C
strBarTable(13) = "001010010" 注释: D
strBarTable(14) = "101000010" 注释: E
strBarTable(15) = "011000010" 注释: F
strBarTable(16) = "000110010" 注释: G
strBarTable(17) = "100100010" 注释: H
strBarTable(18) = "010100010" 注释: I
strBarTable(19) = "001100010" 注释: J
strBarTable(20) = "100010001" 注释: K
strBarTable(21) = "010010001" 注释: L
strBarTable(22) = "110000001" 注释: M
strBarTable(23) = "001010001" 注释: N
strBarTable(24) = "101000001" 注释: O
strBarTable(25) = "011000001" 注释: P
strBarTable(26) = "000110001" 注释: Q
strBarTable(27) = "100100001" 注释: R
strBarTable(28) = "010100001" 注释: S
strBarTable(29) = "001100001" 注释: T
strBarTable(30) = "100011000" 注释: U
strBarTable(31) = "010011000" 注释: V
strBarTable(32) = "110001000" 注释: W
strBarTable(33) = "001011000" 注释: X
strBarTable(34) = "101001000" 注释: Y
strBarTable(35) = "011001000" 注释: Z
strBarTable(36) = "000111000" 注释: -
strBarTable(37) = "100101000" 注释: %
strBarTable(38) = "010101000" 注释: $
strBarTable(39) = "001101000" 注释: *
If strBarCode = "" Then Exit Sub 注释: 不打印空串
注释: 保存打印机 ScaleMode
Dim intOldScaleMode As ScaleModeConstants
intOldScaleMode = Printer.ScaleMode
注释: 保存打印机 DrawWidth
Dim intOldDrawWidth As Integer
intOldDrawWidth = Printer.DrawWidth
注释: 保存打印机 Font
Dim fntOldFont As StdFont
Set fntOldFont = Printer.Font
Printer.ScaleMode = vbTwips 注释: 设置打印用的坐标刻度为缇(twip=1)
Printer.DrawWidth = 1 注释: 线宽为 1
Printer.FontName = "宋体" 注释: 打印在条码下方字符的字体和大小
Printer.FontSize = 10
Dim strBC As String 注释: 要打印的条码字符串
strBC = Ucase(strBarCode)
注释: 将以毫米表示的 X 坐标转换为以缇表示
Dim x As Integer
x = Printer.ScaleX(intXPos, vbMillimeters, vbTwips)
注释: 将以毫米表示的 Y 坐标转换为以缇表示
Dim y As Integer
y = Printer.ScaleY(intYPos, vbMillimeters, vbTwips)
注释: 将以毫米表示的高度转换为以缇表示
Dim intHeight As Integer
intHeight = Printer.ScaleY(intPrintHeight, vbMillimeters, vbTwips)
注释: 是否在条形码下方打印人工识别字符
If bolPrintText = True Then
注释: 条码打印高度要减去下面的字符显示高度
intHeight = intHeight - Printer.TextHeight(strBC)
End If
Const intWidthCU As Integer = 30 注释: 粗线和宽间隙宽度
Const intWidthXI As Integer = 10 注释: 细线和窄间隙宽度
Dim intIndex As Integer 注释: 当前处理的字符串索引
Dim i As Integer, j As Integer, k As Integer 注释: 循环控制变量
注释: 添加起始字符
If Left(strBC, 1) <> "*" Then
strBC = "*" & strBC
End If
注释: 添加结束字符
If Right(strBC, 1) <> "*" Then
strBC = strBC & "*"
End If
注释: 循环处理每个要显示的条码字符
For i = 1 To Len(strBC)
注释: 确定当前字符在 strBarTable 中的索引
Select Case Mid(strBC, i, 1)
Case "*"
intIndex = 39
Case "$"
intIndex = 38
Case "%"
intIndex = 37
Case "-"
intIndex = 36
Case "0" To "9"
intIndex = CInt(Mid(strBC, i, 1))
Case "A" To "Z"
intIndex = Asc(Mid(strBC, i, 1)) - Asc("A") + 10
Case Else
MsgBox "要打印的条形码字符串中包含无效字符!当前版本只支持字符 注释:0注释:-注释:9注释:,注释:A注释:-注释:Z注释:,注释:-注释:,注释:%注释:,注释:$注释:和注释:*注释:"
End Select
注释: 是否在条形码下方打印人工识别字符
If bolPrintText = True Then
Printer.CurrentX = x
Printer.CurrentY = y + intHeight
Printer.Print Mid(strBC, i, 1)
End If
For j = 1 To 5
注释: 画细线
If Mid(strBarTable(intIndex), j, 1) = "0" Then
For k = 0 To intWidthXI - 1
Printer.Line (x + k, y)-Step(0, intHeight)
Next k
x = x + intWidthXI
注释: 画宽线
Else
For k = 0 To intWidthCU - 1
Printer.Line (x + k, y)-Step(0, intHeight)
Next k
x = x + intWidthCU
End If
注释: 每个字符条码之间为窄间隙
If j = 5 Then
x = x + intWidthXI * 3
Exit For
End If
注释: 窄间隙
If Mid(strBarTable(intIndex), j + 5, 1) = "0" Then
x = x + intWidthXI * 3
注释: 宽间隙
Else
x = x + intWidthCU * 2
End If
Next j
Next i
注释: 恢复打印机 ScaleMode
Printer.ScaleMode = intOldScaleMode
注释: 恢复打印机 DrawWidth
Printer.DrawWidth = intOldDrawWidth
注释: 恢复打印机 Font
Set Printer.Font = fntOldFont
End Sub
最理想的情况是将它做成一个控件,在控件中提供一个打印方法,该方法实现与上
那个过程大致相同,只是不能在控件中直接使用VB的Printer对象,否则VB会将你在控件中的打印输出处理为一个单独的页面,而是应该将Printer.hDc传给它,通过调用那些需要指定 HDC 的Windows API函数实现与容器的打印输出在一个页面上,比如我们可以这样定义这个控件的打印方法:
注释: PrintIt 方法将对应的条形码输出到缺省打印机
Public Sub PrintIt(ByVal PrintDC As Long, _
Optional ByVal intXPos As Integer = 0, _
Optional ByVal intYPos As Integer = 0, _
Optional ByVal intPrintHeight As Integer = 10)
既然不能使用Printer对象,那么画线和输出文字也不能使用Printer对象的Line和Print方法,在我们的程序中至少要申明以下三个Windows API函数:
‘ 移动画笔的位置
Private Declare Function MoveToEx Lib "gdi32" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long, lpPoint As POINTAPI) As Long
‘ 从画笔的当前位置到(x,y)画一条线
Private Declare Function LineTo Lib "gdi32" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long) As Long
‘ 在(x,y)处输出一个字符串
Private Declare Function TextOut Lib "gdi32" Alias "TextOutA" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long, ByVal lpString As String, ByVal nCount As Long) As Long
‘ MoveToEx() 函数需要的参数
Private Type POINTAPI
xp As Long
yp As Long
End Type
Dim papi As POINTAPI
画线操作为(原来的Printer.Line函数):
MoveToEx PrintDC, x + k, y, papi
LineTo PrintDC, x + k, y + intHeight + 1
打印字符为(原来的Printer.Print函数):
TextOut PrintDC, x, y + intHeight, Mid(strBC, i + 1, 1), 1
4、如何在VB程序下生成二维条码
如何在VB程序下生成二维条码,包括PDF417、QrCode、DataMatrix和汉信二维条码,具体步驺如下:
工具/原料
准备VB开发环境,VS6.0开发环境
方法/步骤
创建VB工程,COPY二维条码动态链接库到您的工程中。您需要引用的动态库有:EnCodePdf.dll,EnCodeQr.dll,EnDataMatrix和EnHanxin.dll。
大家可以参照下图放置DLL和INI的目录位置。
‘动态链接库引用
(说明:下面是所有四种条码的接口引用申明,读者可以适当剪裁)
’串口接口
Private Declare FunctionInitRead Lib “EnCodePdf.dll” (ByVal hcallwnd As Long, ByVal pathnameAs String) As Long
Private Declare FunctionCloseRead Lib “EnCodePdf.dll” () As Long
‘生成PDF417接口
Private Declare SubSetPdfConFile Lib “EnCodePdf.dll” (ByVal confile As String)
Private Declare FunctionEnPdfText Lib “EnCodePdf.dll” (ByVal txtData As String, ByVal outfileAs String) As String
Private Declare FunctionEnCodePdf Lib “EnCodePdf.dll” (ByVal txtfile As String, ByVal outfileAs String) As String
Private Declare FunctionMakePdf417 Lib “EnCodePdf.dll” (ByVal txtfile As String, ByValpictfile As String, ByVal otherfile As String, ByVal outfile As String) AsString
’生成QrCode接口
Private Declare SubSetQrConFile Lib “EnCodeQr.dll” (ByVal confile As String)
Private Declare FunctionEnQrText Lib “EnCodeQr.dll” (ByVal txtData As String, ByVal outfileAs String) As String
Private Declare FunctionEnCodeQr Lib “EnCodeQr.dll” (ByVal txtfile As String, ByVal outfileAs String) As String
Private Declare FunctionMakeQrCode Lib “EnCodeQr.dll” (ByVal txtfile As String, ByVal pictfileAs String, ByVal otherfile As String, ByVal outfile As String) As String
‘生成DataMatrix接口
Private Declare SubSetDmConFile Lib “EnDataMatrix.dll” (ByVal confile As String)
Private Declare FunctionEnDmText Lib “EnDataMatrix.dll” (ByVal txtData As String, ByValoutfile As String) As String
Private Declare FunctionEnDataMatrix Lib “EnDataMatrix.dll” (ByVal txtfile As String, ByValoutfile As String) As String
Private Declare FunctionMakeDataMatrix Lib “EnDataMatrix.dll” (ByVal txtfile As String, ByValpictfile As String, ByVal otherfile As String, ByVal outfile As String) AsString
’生成HanXin接口
Private Declare SubSetHxConFile Lib “EnHanXin.dll” (ByVal confile As String)
Private Declare FunctionEnHxText Lib “EnHanXin.dll” (ByVal txtData As String, ByVal outfileAs String) As String
Private Declare FunctionEnCodeHx Lib “EnHanXin.dll” (ByVal txtfile As String, ByVal outfileAs String) As String
Private Declare FunctionMakeHanXin Lib “EnHanXin.dll” (ByVal txtfile As String, ByValpictfile As String, ByVal otherfile As String, ByVal outfile As String) AsString
'WAPI接口
Private Declare FunctionSetCurrentDirectory Lib “kernel32” Alias“SetCurrentDirectoryA” (ByVal lpPathName As String) As Long
Private Declare Lib “kernel32” Alias“WritePrivateProfileStringA” (ByVal lpApplicationName As String,ByVal lpKeyName As Any, ByVal lpString As Any, ByVal lpFileName As String) AsLong
Private Declare FunctionGetPrivateProfileInt Lib “kernel32” Alias“GetPrivateProfileIntA” (ByVal lpApplicationName As String, ByVallpKeyName As String, ByVal nDefault As Long, ByVal lpFileName As String) AsLong
Private Declare Lib “kernel32” Alias“GetPrivateProfileStringA” (ByVal lpApplicationName As String, ByVallpKeyName As Any, ByVal lpDefault As String, ByVal lpReturnedString As String,ByVal nSize As Long, ByVal lpFileName As String) As Long
Private Declare FunctionSetWindowLong Lib “user32” Alias “SetWindowLongA” (ByValhwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Private Declare FunctionSetParent Lib “user32” (ByVal hWndChild As Long, ByVal hWndNewParentAs Long) As Long
‘生成图像小波压缩接口
'exports from nlcomp.dll 图像压缩函数
Private Declare FunctionSizeDIB Lib “Wcomp.dll” (ByVal oldmap As String, ByVal BmpHeight AsInteger, ByVal BmpWidth As Integer) As Long
Private Declare FunctionWcompress Lib “Wcomp.dll” (ByVal infile As String, ByVal outfile AsString, ByVal budget As Long) As Long
Private Declare FunctionWdecompress Lib “Wcomp.dll” (ByVal infile As String, ByVal outfile AsString) As Long
进行条形码制作:
我们在引用API接口后,可以参照下面程序,实现接口调用
程序中txtfile表示文本文件名,binBmpFile表示输入的图像文件名
若需要装载图像可以采用Make开头接口,若不需要则采用En开头接口。
If (txtfile<> “” Or binBmpFile <> “”) Then
If m_bWorkMode = 1 Then 'PDF417
SetPdfConFile (Edit_ConFileName.Text)
If (Edit_ImgFileName.Text <> “”) Then
strBmpFile = MakePdf417(txtfile, binBmpFile,“”, “”)
Else
strBmpFile = EnPdfText(Edit_Source.Text,“”)
End If
ElseIf m_bWorkMode = 2 Then 'Qr_Code
SetQrConFile (Edit_ConFileName.Text)
If (Edit_ImgFileName.Text <> “”) Then
strBmpFile = MakeQrCode(txtfile, binBmpFile,“”, “”)
Else
strBmpFile = EnQrText(Edit_Source.Text,“”)
End If
ElseIf m_bWorkMode = 3 Then ' DataMatrix
SetDmConFile (Edit_ConFileName.Text)
If (Edit_ImgFileName.Text <> “”) Then
strBmpFile = MakeDataMatrix(txtfile,binBmpFile, “”, “”)
Else
strBmpFile = EnDmText(Edit_Source.Text,“”)
End If
Else
SetHxConFile (Edit_ConFileName.Text)
If (Edit_ImgFileName.Text <> “”) Then
strBmpFile = MakeHanXin(txtfile, binBmpFile,“”, “”)
Else
strBmpFile = EnHxText(Edit_Source.Text,“”)
End If
End If
打开关闭串口:
条码编码控件一般自带串口接收处理接口:
InitRead接口是初始化串口
CloseRead接口是关闭串口
If Cmd_OpenComm.Caption = “连接串口” Then
Call SetPdfConFile(Edit_ConFileName.Text)
If InitRead(Me.hwnd, App.Path + “\”) = 1 Then
Cmd_OpenComm.Caption = “断开串口”
End If
Else ’关闭串口
If CloseRead() = 1 Then
Cmd_OpenComm.Caption = “连接串口”
End If
End If
接收条码识读器内容:
串口收到识读器信息后,以键盘消息的形式,触发页面消息。
我们调用FORM下,处理KeyDown事件。
Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
Dim FileNo As Integer
Dim strTmp As String
Dim strBmpFile As String
strBmpFile = App.Path & “\temp.bmp”
If KeyCode = 255 Then
FileNo = FreeFile()
Open App.Path & “\temp.txt” For Input As #FileNo
Edit_Source.Text = “”
Do While Not EOF(FileNo)
strTmp = “”
Input #FileNo, strTmp
Edit_Source.Text = Edit_Source.Text & strTmp & Chr(13) & Chr(10)
Loop
Close #FileNo
If Dir(strBmpFile) <> “” Then
Kill (strBmpFile)
End If
If Dir(App.Path & “\temp.img”) <> “” Then
If FileLen(App.Path & “\temp.img”) > 10 Then
Call Wdecompress(App.Path & “\temp.img”, strBmpFile)
End If
End If
If Dir(strBmpFile) <> “” Then
Image_Bar.Picture = LoadPicture(strBmpFile)
Else
Image_Bar.Picture = LoadPicture(“”)
End If
Cmd_Print.Enabled = False
End If
End Sub
5、VB二维条码生成
你学习的话
用一个OFFICE的附带的BarCode控件即可,输出是图像格式
http://www.programfan.com/blog/article.asp?id=2505
不过专业的条码打印还专是用VB的Printer控件Line函数属以画图方式输出最好
我曾开发过多种标准的条形码控件,不过是商业软件不好开放
这里有个39码的例子,你不妨看看
http://www.3800hk.com/Article/cxsj/vb/bcslvb/2005-08-06/Article_47920.html
6、vb实现一维条形码例子
EAN是比较好实现的码制,用微软自带的就可以,或者下载个EAN的条码字体即可在一般的text中处理。连接ACCESS数据库,因为是自己写的程序,直连取记录集,然后在记录集中循环取值给条码控件,同时刷新控件即可。你这个关键在于打印,用print 截屏即可 这样最简单。
7、VB里做条形码是哪个控件??
很遗憾vb没有自带的条形码控件(你说的条形码应该是商品上贴着的条形码吧)。ps网上可能找得到条形码控件,还有注意要下载的话确认一下是ocx文件。
8、怎样用VB自动生成不重复的13位条形码值?
Private Sub Command1_Click()
Dim I As Integer
Dim B, C As String
Randomize
Me.AutoRedraw = True
K = 1
For I = 1 To 100
B = Int(Rnd() * 10)
C = C & B
If Len(C) > 13 Then Exit For
Next I
Print C
End Sub
9、如何用VB做个简单的条码验证器,,扫描枪输入。。详情见图
我用过的扫描枪的输入是用的com输入,在VB里添加MSComm控件即可。视设备管理器里识别为com几就选com几。
扫描的时候,MSComm控件有comEvReceive事件,可以作为触发事件的,比如控件名是MSComm1
那这个MSComm1_OnComm()里,如果有这个触发事件,就可以声明一个字符型来接受MSComm1.input
这个输入可能根据不同扫描枪不同要进行些处理以得到你需要的条码实值
当然条码枪具体给你什么你可以去Windows自带的Hyper Terminal里看到
有个了这个条码值,在你图里对应的第二个表里其他的Textbox或者label控件就可以写相应的Caption了,无非是if,case判断了
不加数据库连接的话就没那么复杂了
空口说白话也不行,以下是基于Motolora Symbol P370/470型对条码值的一些处理,直接写在OnComm里了,process_no就是看到这个号码做相应处理的判断,可以另起炉灶写一个到时候调用就是
Private Sub MSComm1_OnComm()
Dim st As String
If MSComm1.CommEvent = comEvReceive Then
st = MSComm1.Input
If st <> Chr(3) Then
st_all = st_all + st
Else
Txt_Pt.Text = Trim(Mid(st_all, InStr(st_all, Chr(2)) + 1, 10))
st_all = ""
Process_no
End If
End If
End Sub
以上只是com接收事件和取值的例子,判断不必参考的,关键无非是把接收值读入st,再对st_all这个全局变量赋值(不然你一会用那个条码值可没有个地方记录了)
非com输入恕在下暂时无能为力