vb生成條形碼開源
1、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
2、怎樣用vb做出能輸入數字生成條形碼的程序
有一個控制項,忘了叫什麼了。網上搜!
3、怎樣用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
4、vb 條形碼如何生成後, 如何存儲到在資料庫中 是圖片還數據格式存儲的, 如何在水晶報表上實現列印
一般保存數字就好了 條形碼可以用條形碼的字體來列印 比較常用的是 CODE39
code128碼 用字體列印出來可能掃描不出來
5、求助:用VB怎麼能做出Code128A碼的條形碼??
我沒用控制項做過 我們做的都是用水晶報表做的!~ 在裡面選你需要的字體就可以了~ 條形碼也是一種字體!~
6、怎樣用C語言做一個條形碼
使用C語言做條形碼可以按照以下流程:
1 查找條形碼生成規則,或者直接找C語言的開源代碼,製作封裝字元串轉條形碼的介面函數;
2 讀入要轉換的數據;
3 將要轉換的數據,通過1中的函數介面,轉為圖形點陣值。由於條形碼只有黑白兩色,所以這里可以用0,1兩種值用矩陣表示;
4 根據編譯器,啟動圖形界面,初始化圖形區域;
5 在圖形區域的空間內,按照0 1值,在對應點上上色,其中0上白色,1上黑色。
至此,條形碼顯示成功。
7、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
8、如何在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
9、vb實現一維條形碼例子
EAN是比較好實現的碼制,用微軟自帶的就可以,或者下載個EAN的條碼字體即可在一般的text中處理。連接ACCESS資料庫,因為是自己寫的程序,直連取記錄集,然後在記錄集中循環取值給條碼控制項,同時刷新控制項即可。你這個關鍵在於列印,用print 截屏即可 這樣最簡單。