在VB中怎么打印条形码???谢谢。。

Athick 2003-08-21 01:26:06
在VB中怎么打印条形码???谢谢。。
...全文
248 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
Athick 2003-09-28
  • 打赏
  • 举报
回复
asf
iiboy 2003-08-29
  • 打赏
  • 举报
回复
看看这个吧!!!!
http://www.sgxcn.com/doc/show.asp?ID=57
qffhq 2003-08-28
  • 打赏
  • 举报
回复
大家继续呀,查一下其它的条码打印算法???
qffhq 2003-08-27
  • 打赏
  • 举报
回复
我已经做完了,参照以上想法,很好的,如下

'条码相关参数
Public SngLineWidth As Integer, SngSpaceWidth As Integer, SngDetWidth As Integer
为条码打印时线宽,间白宽和码与码之间的宽度,其它参数有参照上面

Public Sub PrintCode(mObjPic As Object, strCode As String, OffsetX As Integer, OffsetY As Integer, blnHaveText As Boolean)
Dim strBC As String, ChrBC As String, BCCode As String, X As Integer, Y As Integer, h As Integer
Dim i As Integer, j As Integer, k As Integer
Static strBarTable(39) As String

'注释: 初始化条码编码格式表
strBarTable(0) = "101001101101" '注释: 0
strBarTable(1) = "110100101011" '注释: 1
strBarTable(2) = "101100101011" '注释: 2
strBarTable(3) = "110110010101" '注释: 3
strBarTable(4) = "101001101011" '注释: 4
strBarTable(5) = "110100110101" '注释: 5
strBarTable(6) = "101100110101" '注释: 6
strBarTable(7) = "101001011011" '注释: 7
strBarTable(8) = "110100101101" '注释: 8
strBarTable(9) = "101100101101" '注释: 9

strBarTable(10) = "110101001011" '注释: A
strBarTable(11) = "101101001011" '注释: B
strBarTable(12) = "110110100101" '注释: C
strBarTable(13) = "101011001011" '注释: D
strBarTable(14) = "110101100101" '注释: E
strBarTable(15) = "101101100101" '注释: F
strBarTable(16) = "101010011011" '注释: G
strBarTable(17) = "110101001101" '注释: H
strBarTable(18) = "101101001101" '注释: I
strBarTable(19) = "101011001101" '注释: J
strBarTable(20) = "110101010011" '注释: K
strBarTable(21) = "101101010011" '注释: L
strBarTable(22) = "110110101001" '注释: M
strBarTable(23) = "101011010011" '注释: N
strBarTable(24) = "110101101001" '注释: O
strBarTable(25) = "101101101001" '注释: P
strBarTable(26) = "101010110011" '注释: Q
strBarTable(27) = "110101011001" '注释: R
strBarTable(28) = "101101011001" '注释: S
strBarTable(29) = "101011011001" '注释: T
strBarTable(30) = "110010101011" '注释: U
strBarTable(31) = "100110101011" '注释: V
strBarTable(32) = "110011010101" '注释: W
strBarTable(33) = "100101101011" '注释: X
strBarTable(34) = "110010110101" '注释: Y
strBarTable(35) = "100110110101" '注释: Z

strBarTable(36) = "100101011011" '注释: -
strBarTable(37) = "101001001001" '注释: %
strBarTable(38) = "100100100101" '注释: $
strBarTable(39) = "100101101101" '注释: *

X = OffsetX
Y = OffsetY
h = sngBarHeight
' X = mObjPic.ScaleX(OffsetX, vbMillimeters, vbTwips)
' Y = mObjPic.ScaleY(OffsetY, vbMillimeters, vbTwips)
' h = mObjPic.ScaleY(intHeight, vbMillimeters, vbTwips)

strBC = UCase(strCode)
If Left(strBC, 1) <> "*" Then strBC = "*" & strBC
If Right(strBC, 1) <> "*" Then strBC = strBC & "*"

If blnHaveText = True Then h = h - mObjPic.TextHeight(strBC) '条码打印高度要减去下面的字符显示高度

With mObjPic
.ScaleMode = vbTwips
.DrawWidth = 1
.FontName = "宋体"
.FontSize = 8
End With

For i = 0 To Len(strBC) - 1

ChrBC = Mid(strBC, i + 1, 1)
BCCode = strBarTable(GetBarCode(ChrBC))

'当前字符
If blnHaveText = True Then
mObjPic.CurrentX = X
mObjPic.CurrentY = Y + h
mObjPic.Print ChrBC
End If

For j = 0 To Len(BCCode) - 1
'窄
If Mid(BCCode, j + 1, 1) = "0" Then
X = X + SngSpaceWidth
'宽
Else
For k = 0 To SngLineWidth - 1
mObjPic.Line (X + k, Y)-Step(0, h)
Next k
X = X + SngLineWidth
End If
Next
'字间距
X = X + SngDetWidth
Next

Exit Sub

End Sub

Private Function GetBarCode(ChrBC As String) As Integer

Select Case Left(ChrBC, 1)
Case "*": GetBarCode = 39
Case "$": GetBarCode = 38
Case "%": GetBarCode = 37
Case "-": GetBarCode = 36
Case "0" To "9": GetBarCode = CInt(Left(ChrBC, 1))
Case "A" To "Z": GetBarCode = Asc(Left(ChrBC, 1)) - Asc("A") + 10
Case Else: MsgBox "要打印的条形码字符串中包含无效字符!" '当前版本只支持字符 注释:0注释:-注释:9注释:,注释:A注释:-注释:Z注释:,注释:-注释:,注释:%注释:,注释:$注释:和注释:*注释:"
End Select

End Function

Athick 2003-08-21
  • 打赏
  • 举报
回复
这个控件我是知道。但就是不知道和文字在一起怎么打印。
Athick 2003-08-21
  • 打赏
  • 举报
回复
这个控件我是知道。但就是不知道和文字在一起怎么打印。
Athick 2003-08-21
  • 打赏
  • 举报
回复
先谢了各位。
qffhq 2003-08-21
  • 打赏
  • 举报
回复
(二) 数字与特殊符号部分

39码也可表示数字0~9以及特殊符号,其对应的逻辑值如表 5.3所示。

表 5.3 39码编码对映表(英文字母部分)

字元
逻辑型态
字元
逻辑型态

0
101001101101

100101001001

1
110100101011

100101011011

2
101100101011

100101101101

3
110110010101

100100101001

4
101001101011

101001001001

5
110100110101

100100100101

6
101100110101

110010101101

7
101001011011
空白
100110101101

8
110100101101
 
 

9
101100101101
 



 
不过算法我是看明白了,
有没有2/5码的码表呀,还有
Const intWidthCU As Integer = 60 '注释: 粗线和宽间隙宽度

Const intWidthXI As Integer = 20 '注释: 细线和窄间隙宽度


这两个数值有什么限制没有,我想做这个功能 ?
qffhq 2003-08-21
  • 打赏
  • 举报
回复
你的编码与www.newlifesoft.com上有不一致呀:

第5.2节 39码编码方式

 

叁九码的每一个字元编码方式,都是藉由九条不同排列的线条编码而得。可区分成如表 5.2之四种类型:

表 5.2 39码的字元编码方式



(一) 英文字母部分

26个英文字母所对应的39码逻辑值如表 5.3所示。

表 5.3 39码编码对映表(英文字母部分)


A
110101001011
N
101011010011

B
101101001011
O
110101101001

C
110110100101
P
101101101001

D
101011001011
Q
101010110011

E
110101100101
R
110101011001

F
101101100101
S
101101011001

G
101010011011
T
101011011001

H
110101001101
U
110010101011

I
101101001101
V
100110101011

J
101011001101
W
110011010101

K
110101010011
X
100101101011

L
101101010011
Y
110010110101

M
110110101001
Z
100110110101

haipingma 2003-08-21
  • 打赏
  • 举报
回复
請教 dandy1437((乐天派!直面所有问题))
ByVal Pic As Object, ByVal PrintDC As Long這兩個參數是什么意思啊
dandy1437 2003-08-21
  • 打赏
  • 举报
回复
'接在上面的程序后面
注释: 保存打印机 ScaleMode

Dim intOldScaleMode As ScaleModeConstants

intOldScaleMode = Pic.ScaleMode

'注释: 保存打印机 DrawWidth

Dim intOldDrawWidth As Integer

intOldDrawWidth = Pic.DrawWidth

'注释: 保存打印机 Font

Dim fntOldFont As StdFont

Set fntOldFont = Pic.Font

Pic.ScaleMode = vbTwips '注释: 设置打印用的坐标刻度为缇(twip=1)

Pic.DrawWidth = 1 '注释: 线宽为 1

Pic.FontName = "宋体" '注释: 打印在条码下方字符的字体和大小

Pic.FontSize = 8

Dim strBC As String '注释: 要打印的条码字符串

strBC = UCase(strBarCode)

'注释: 将以毫米表示的 X 坐标转换为以缇表示

Dim x As Integer

x = Pic.ScaleX(intXPos, vbMillimeters, vbTwips)

'注释: 将以毫米表示的 Y 坐标转换为以缇表示

Dim y As Integer

y = Pic.ScaleY(intYPos, vbMillimeters, vbTwips)

'注释: 将以毫米表示的高度转换为以缇表示

Dim intHeight As Integer

intHeight = Pic.ScaleY(intPrintHeight, vbMillimeters, vbTwips)


'注释: 是否在条形码下方打印人工识别字符

If bolPrintText = True Then
'注释: 条码打印高度要减去下面的字符显示高度
intHeight = intHeight - Pic.TextHeight(strBC)
End If

Const intWidthCU As Integer = 60 '注释: 粗线和宽间隙宽度

Const intWidthXI As Integer = 20 '注释: 细线和窄间隙宽度

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

' TextOut PrintDC, x, y + intHeight, Mid(strBC, i, 1), 1
If TypeName(Pic) = "Printer" Then Printer.Print Mid(strBC, i, 1)
'pic.Print Mid(strBC, i, 1)
End If

For j = 1 To 5

'注释: 画细线

If Mid(strBarTable(intIndex), 2 * j - 1, 1) = "0" Then

For k = 0 To intWidthXI - 1

'MoveToEx PrintDC, x + k, y, papi

'LineTo PrintDC, x + k, y + intHeight + 1

If TypeName(Pic) = "Printer" Then Printer.Line (x + k, y)-Step(0, intHeight)
'pic.Line (x + k, y)-Step(0, intHeight)
Next k

x = x + intWidthXI

'注释: 画宽线

Else

For k = 0 To intWidthCU - 1

'MoveToEx PrintDC, x + k, y, papi

'LineTo PrintDC, x + k, y + intHeight + 1
If TypeName(Pic) = "Printer" Then Printer.Line (x + k, y)-Step(0, intHeight)
'pic.Line (x + k, y)-Step(0, intHeight)
Next k

x = x + intWidthCU

End If
'
'注释: 每个字符条码之间为窄间隙

If j = 5 Then

x = x + intWidthXI

Exit For

End If

'注释: 窄间隙

If Mid(strBarTable(intIndex), 2 * j, 1) = "0" Then

x = x + intWidthXI

'注释: 宽间隙

Else

x = x + intWidthCU

End If

Next j

Next i

'注释: 恢复打印机 ScaleMode
If TypeName(Pic) = "Printer" Then Pic.EndDoc
Pic.ScaleMode = intOldScaleMode

'注释: 恢复打印机 DrawWidth

Pic.DrawWidth = intOldDrawWidth

'注释: 恢复打印机 Font

S
dandy1437 2003-08-21
  • 打赏
  • 举报
回复
1.VB中有一个barcode控件.
2.打印CODE39的示例
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


Private Sub PrintBarCode(ByVal Pic As Object, ByVal PrintDC As Long, ByVal strBarCode As String, Optional ByVal intXPos As Integer = 0, Optional ByVal intYPos As Integer = 0, Optional ByVal intPrintHeight As Integer = 100, 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) = "000110100" '注释: 0

strBarTable(1) = "100100001" '注释: 1

strBarTable(2) = "001100001" '注释: 2

strBarTable(3) = "101100000" '注释: 3

strBarTable(4) = "000110001" '注释: 4

strBarTable(5) = "100110000" '注释: 5

strBarTable(6) = "001110000" '注释: 6

strBarTable(7) = "000100101" '注释: 7

strBarTable(8) = "100100100" '注释: 8

strBarTable(9) = "001100100" '注释: 9

strBarTable(10) = "100001001" '注释: A

strBarTable(11) = "001001001" '注释: B

strBarTable(12) = "101001000" '注释: C

strBarTable(13) = "000011001" '注释: D

strBarTable(14) = "100011000" '注释: E

strBarTable(15) = "001011000" '注释: F

strBarTable(16) = "000001101" '注释: G

strBarTable(17) = "100001100" '注释: H

strBarTable(18) = "001001101" '注释: I

strBarTable(19) = "000011100" '注释: J

strBarTable(20) = "100000011" '注释: K

strBarTable(21) = "001000011" '注释: L

strBarTable(22) = "101000010" '注释: M

strBarTable(23) = "000010011" '注释: N

strBarTable(24) = "100010010" '注释: O

strBarTable(25) = "001010010" '注释: P

strBarTable(26) = "000000111" '注释: Q

strBarTable(27) = "100000110" '注释: R

strBarTable(28) = "001000110" '注释: S

strBarTable(29) = "000010110" '注释: T

strBarTable(30) = "110000001" '注释: U

strBarTable(31) = "011000001" '注释: V

strBarTable(32) = "111000000" '注释: W

strBarTable(33) = "010010001" '注释: X

strBarTable(34) = "110010000" '注释: Y

strBarTable(35) = "011010000" '注释: Z

strBarTable(36) = "010000101" '注释: -

strBarTable(37) = "000101010" '注释: %

strBarTable(38) = "010101000" '注释: $

strBarTable(39) = "010010100" '注释: *

If strBarCode = "" Then Exit Sub '注释: 不打印空串
iiboy 2003-08-21
  • 打赏
  • 举报
回复
你可以考虑下面的方法:
http://www.sgxcn.com/doc/show.asp?ID=57
qianzi0520 2003-08-21
  • 打赏
  • 举报
回复
安装条码打印机驱动,然后打开Word,找到你要的条码字体名称。
然后用Printer,指定字体名,大小,位置就OK啦
例:
Printer.FontName = "ZB 39 10mil/3:1"
Printer.FontSize = 8
Printer.CurrentX = 5
Printer.CurrentY = 24
Printer.Print "12345678"
逍遥鹰王 2003-08-21
  • 打赏
  • 举报
回复
佩服!!!!!!!!
xingnup 2003-08-21
  • 打赏
  • 举报
回复
上面够详细了!佩服!UP!
hxy2003 2003-08-21
  • 打赏
  • 举报
回复
可以用barcode9
用printform打印出来
lihonggen0 2003-08-21
  • 打赏
  • 举报
回复
VB应用程序中打印条形码的两种方法标题: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"   注释:椒ǎ谖颐堑某绦蛑兄辽僖昝饕韵氯鯳indows 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

lihonggen0 2003-08-21
  • 打赏
  • 举报
回复
Microsoft Access BarCode Control 9.0 的 BarCodeCtrl [X:\Program files\microsoft office\office\msbcode9.ocx


http://expert.csdn.net/Expert/topic/1437/1437222.xml?temp=.4063227
zhenglc 2003-08-21
  • 打赏
  • 举报
回复
同上,用条码Barcode控件
加载更多回复(2)

7,762

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧