条形码编程实例
條形碼技術(shù)廣泛應(yīng)用于各行各業(yè),你隨便拿起一本書(shū)、一包薯片都可以在外包裝上找到,利用條碼讀取機(jī)便可將這一條條黑白相間、粗細(xì)不同的垂直線條識(shí)別而轉(zhuǎn)換為具體的數(shù)值,并將這個(gè)數(shù)值返回到計(jì)算機(jī)中進(jìn)行處理。正是這樣,有了條形碼技術(shù),人們很方便就能取得該商品的有關(guān)信息如商品名稱、規(guī)格、價(jià)格等,因?yàn)槊糠N商品都有其對(duì)應(yīng)的條形碼,這個(gè)條形碼計(jì)算機(jī)(終端、服務(wù)器)中就可以迅速返回用戶,從數(shù)據(jù)庫(kù)中讀取約定的商品,信息使得銷售、進(jìn)貨、存貨等等管理更有效率,也對(duì)防止假冒偽劣又一定的抑制作用。
條碼的編碼方式有多種,不同行業(yè),不同國(guó)家標(biāo)準(zhǔn)也不盡相同。條形碼通過(guò)線條的粗細(xì)來(lái)表達(dá)其數(shù)值。至于接口方式一般也有多種,如鍵盤(pán)口的、串行口的。一般傳感裝置是光罩式的,也有筆式的。
上面籠籠統(tǒng)統(tǒng)地談了一些關(guān)于條形碼的知識(shí),可幫助你更好地閱讀以下更深入的內(nèi)容。條形碼有關(guān)概念先說(shuō)到這里,接著是詳細(xì)具體的編程實(shí)現(xiàn)方法。
????
一、條形碼的讀取
用過(guò)鍵盤(pán)口式的掃條碼工具的朋友就知道,它就如同在鍵盤(pán)上按下數(shù)字鍵一樣,基本不需任何編程和處理。但如果你使用的是其它接口的話,可能你就要為該設(shè)備編寫(xiě)通訊代碼了。以下有一段簡(jiǎn)單的25針串口的條碼讀取器通訊代碼。
Option Explicit
Dim sData As String
Private Sub Form_Load()
With MSComm1
?? .CommPort = 3 '設(shè)為COM3,試運(yùn)行的系統(tǒng)而定,你可提供一個(gè)Combox讓用戶選擇。
?? .PortOpen = True '打開(kāi)通訊端口
End With
End Sub
????
Private Sub MSComm1_OnComm()
?
? Dim EndPos As Integer
? Select Case MSComm1.CommEvent
??? Case comEvReceive '當(dāng)有數(shù)據(jù)傳送過(guò)來(lái)時(shí)
????? sData = sData & Trim(MSComm1.Input)
????? '檢索回車,通常讀卡機(jī)每組數(shù)據(jù)結(jié)尾都返回一個(gè)回車作為結(jié)束符
????? EndPos = InStr(1, sData, Chr(13))
????? If EndPos = 0 Then '如果未結(jié)束就繼續(xù)努力
????? Else '讀完一組。
??????? lblBarCode.Caption = sData '顯示一組條形碼
??????? With lstBarCode
????????? .AddItem Mid(sData, 1, EndPos - 1) '添加一組條形碼到列表
??????? End With
??????? sData = "" '清空
????? End If
? End Select
End Sub
????
Private Sub cmdEnd_Click()
? MSComm1.PortOpen = False '關(guān)閉端口
? End
End Sub
????
二、條形碼的生成
看完以上關(guān)于條碼讀取的代碼是否覺(jué)得很容易呢?對(duì),在VB上編程本來(lái)就不難。以下關(guān)于條形碼生成的代碼也是很容易理解,只需使用一個(gè)OFFICE的附帶的BarCode控件就可以輕松打印出11種不同標(biāo)準(zhǔn)的條形碼,足以滿足我們的要求。想起我書(shū)架上的一本書(shū)中的一篇用Turbo C編寫(xiě)條形碼打印程序文章,長(zhǎng)篇大論,那時(shí)不知看了n天,打了n小時(shí)字結(jié)果也不盡人意,現(xiàn)在真是幸福多了:)。廢話說(shuō)完,得回歸正題。且看條形碼生成的代碼及有關(guān)說(shuō)明。
源代碼主要由兩個(gè)窗體(frmMain主窗體和frmOption條碼設(shè)置窗體)和兩個(gè)模塊組成(modGetScreen.bas、SysDLG32.bas)。考慮到篇幅,這里只列出部分較為關(guān)鍵的代碼。
新建一個(gè)標(biāo)準(zhǔn)工程,添加一個(gè)名為(Microsoft Access BarCode Control9)的條形碼部件,并添加一個(gè)條碼控件到窗口,并將窗口改名為frmMain,如圖所示。由于控件比較多,這里不便細(xì)說(shuō),詳細(xì)內(nèi)容請(qǐng)看源代碼。
模塊modGetScreen.bas代碼如下:
Option Explicit
聲明BitBlt、GetDesktopWindow、GetWindowDC、ReleaseDC這幾個(gè)API函數(shù)略
Public RegUser As Boolean
????
Sub GetObjImage1(Obj As Object, OwnerForm As PictureBox, Picture1 As PictureBox)
? 'hDC
? Dim hWndDesk As Long
? Dim hDCDesk As Long
? '區(qū)域表達(dá)變量
? Dim x As Long
? Dim y As Long
? Dim w As Long
? Dim h As Long
????
? x = Obj.Left? Screen.TwipsPerPixelX
? y = Obj.Top? Screen.TwipsPerPixelY
? w = Obj.Width? Screen.TwipsPerPixelX
? h = Obj.Height? Screen.TwipsPerPixelY
? hDCDesk = OwnerForm.hdc
? '取出圖像
? Call BitBlt(Picture1.hdc, 0, 0, w, h, hDCDesk, x, y, vbSrcCopy)
? Call ReleaseDC(hWndDesk, hDCDesk)
????
End Sub
????
主窗體frmMain.frm部分代碼如下:
Private Sub cmdPrint_Click()
'生成條形碼圖像
? Dim r As Long, i As Integer, t As String,cfile As String '臨時(shí)變量
? t = BarCode
? For i = 0 To Val(Times) - 1
???
??? BarCode1.Value = BarCode + i
??? DoEvents
??? Picture1.Refresh
??
??? GetObjImage1 BarCode1, Conel, Picture1
???
??? If RegUser = False Then '如果未注冊(cè)添加MASK標(biāo)記
????? Picture1.PaintPicture Picture2.Picture, 300, 300
??? End If
???
??? If Dir(SavePath, vbDirectory) = "" Then MkDir SavePath
???
??? SavePath = SavePath & IIf(Right(SavePath, 1) <> "", "", "")
???
??? cfile = SavePath & BarCode1.Value & ".bmp"
??? SavePicture Picture1.Image, cfile '將條形碼保存為圖像文件以便打印
? Next
? BarCode = t
????
End Sub
????
條形碼設(shè)置窗體frmOption.frm代碼如下:
Option Explicit
'條形碼設(shè)置模塊
????
Private Sub cboBig_Click()
? BarCode1.Style = cboBig.ListIndex '改變標(biāo)準(zhǔn)
End Sub
????
Private Sub cboDirection_Click()
? BarCode1.Direction = cboDirection.ListIndex '改變方向
End Sub
????
Private Sub cboLine_Click()
? BarCode1.LineWeight = cboLine.ListIndex '改變線寬
End Sub
????
Private Sub cboSmall_Click()
? BarCode1.SubStyle = cboSmall.ListIndex '改變樣式
End Sub
????
Private Sub Check1_Click()
? BarCode1.ShowData = Check1.Value '是否顯示數(shù)據(jù)
End Sub
????
Private Sub cmdChange_Click()
'設(shè)置長(zhǎng)、寬大小
BarWidth = BarCode1.Height
BarHeight = BarCode1.Width
cmdRefresh_Click
End Sub
????
Private Sub cmdOK_Click()
'傳送條形碼設(shè)定到主界面
? With frmMain.BarCode1
??? .LineWeight = BarCode1.LineWeight
??? .Style = BarCode1.Style
??? .SubStyle = BarCode1.SubStyle
??? .Direction = BarCode1.Direction
??? .Width = BarCode1.Width
??? .Height = BarCode1.Height
??? .ShowData = BarCode1.ShowData
??? Me.Hide
? End With
? With frmMain
??? .Picture1.Width = .BarCode1.Width
??? .Picture1.Height = .BarCode1.Height
??? .Conel.Width = .BarCode1.Width
??? .Conel.Height = .BarCode1.Height
? End With
End Sub
????
Private Sub cmdRefresh_Click()
? BarCode1.Width = BarWidth
? BarCode1.Height = BarHeight
End Sub
????
Private Sub Form_Load()
LoadBarInfo
BarWidth = BarCode1.Width
BarHeight = BarCode1.Height
End Sub
????
Sub LoadBarInfo() '初始化選項(xiàng)
LoadBigClass cboBig
LoadSmallClass cboSmall
LoadLineSize cboLine
LoadDirection cboDirection
End Sub
Sub LoadBigClass(cbo As ComboBox) '條碼標(biāo)準(zhǔn)
? With cbo
??? .AddItem "UPC-A"
??? .AddItem "UPC-E"
??? .AddItem "EAN-13"
??? .AddItem "EAN-8"
??? .AddItem "Case Code"
??? .AddItem "Codabar (NW-T)"
??? .AddItem "Code-39"
??? .AddItem "Code-128"
??? .AddItem "U.S. Postnet"
??? .AddItem "U.S. Postal FIM"
??? .AddItem "JP Post"
??? .ListIndex = 2
? End With
End Sub
Sub LoadSmallClass(cbo As ComboBox) '條碼樣式
? With cbo
??? .AddItem "Standard"
??? .AddItem "2-Digit Supplement"
??? .AddItem "5-Digit Supplement"
??? .AddItem "POS Case Code"
??? .ListIndex = 0
? End With
End Sub
許多人在編寫(xiě)數(shù)據(jù)庫(kù)應(yīng)用程序時(shí),都想要加上條形碼功能加強(qiáng)工作效率,尤其是銷售管理,圖書(shū)館管理這類流量大的應(yīng)用軟件,但由于條形碼技術(shù)難以掌握、標(biāo)誰(shuí)又多以及過(guò)去的技術(shù)種種原因,使得許多人望而卻步。
條碼的編碼方式有多種,不同行業(yè),不同國(guó)家標(biāo)準(zhǔn)也不盡相同。條形碼通過(guò)線條的粗細(xì)來(lái)表達(dá)其數(shù)值。至于接口方式一般也有多種,如鍵盤(pán)口的、串行口的。一般傳感裝置是光罩式的,也有筆式的。
上面籠籠統(tǒng)統(tǒng)地談了一些關(guān)于條形碼的知識(shí),可幫助你更好地閱讀以下更深入的內(nèi)容。條形碼有關(guān)概念先說(shuō)到這里,接著是詳細(xì)具體的編程實(shí)現(xiàn)方法。
????
一、條形碼的讀取
用過(guò)鍵盤(pán)口式的掃條碼工具的朋友就知道,它就如同在鍵盤(pán)上按下數(shù)字鍵一樣,基本不需任何編程和處理。但如果你使用的是其它接口的話,可能你就要為該設(shè)備編寫(xiě)通訊代碼了。以下有一段簡(jiǎn)單的25針串口的條碼讀取器通訊代碼。
Option Explicit
Dim sData As String
Private Sub Form_Load()
With MSComm1
?? .CommPort = 3 '設(shè)為COM3,試運(yùn)行的系統(tǒng)而定,你可提供一個(gè)Combox讓用戶選擇。
?? .PortOpen = True '打開(kāi)通訊端口
End With
End Sub
????
Private Sub MSComm1_OnComm()
?
? Dim EndPos As Integer
? Select Case MSComm1.CommEvent
??? Case comEvReceive '當(dāng)有數(shù)據(jù)傳送過(guò)來(lái)時(shí)
????? sData = sData & Trim(MSComm1.Input)
????? '檢索回車,通常讀卡機(jī)每組數(shù)據(jù)結(jié)尾都返回一個(gè)回車作為結(jié)束符
????? EndPos = InStr(1, sData, Chr(13))
????? If EndPos = 0 Then '如果未結(jié)束就繼續(xù)努力
????? Else '讀完一組。
??????? lblBarCode.Caption = sData '顯示一組條形碼
??????? With lstBarCode
????????? .AddItem Mid(sData, 1, EndPos - 1) '添加一組條形碼到列表
??????? End With
??????? sData = "" '清空
????? End If
? End Select
End Sub
????
Private Sub cmdEnd_Click()
? MSComm1.PortOpen = False '關(guān)閉端口
? End
End Sub
????
二、條形碼的生成
看完以上關(guān)于條碼讀取的代碼是否覺(jué)得很容易呢?對(duì),在VB上編程本來(lái)就不難。以下關(guān)于條形碼生成的代碼也是很容易理解,只需使用一個(gè)OFFICE的附帶的BarCode控件就可以輕松打印出11種不同標(biāo)準(zhǔn)的條形碼,足以滿足我們的要求。想起我書(shū)架上的一本書(shū)中的一篇用Turbo C編寫(xiě)條形碼打印程序文章,長(zhǎng)篇大論,那時(shí)不知看了n天,打了n小時(shí)字結(jié)果也不盡人意,現(xiàn)在真是幸福多了:)。廢話說(shuō)完,得回歸正題。且看條形碼生成的代碼及有關(guān)說(shuō)明。
源代碼主要由兩個(gè)窗體(frmMain主窗體和frmOption條碼設(shè)置窗體)和兩個(gè)模塊組成(modGetScreen.bas、SysDLG32.bas)。考慮到篇幅,這里只列出部分較為關(guān)鍵的代碼。
新建一個(gè)標(biāo)準(zhǔn)工程,添加一個(gè)名為(Microsoft Access BarCode Control9)的條形碼部件,并添加一個(gè)條碼控件到窗口,并將窗口改名為frmMain,如圖所示。由于控件比較多,這里不便細(xì)說(shuō),詳細(xì)內(nèi)容請(qǐng)看源代碼。
模塊modGetScreen.bas代碼如下:
Option Explicit
聲明BitBlt、GetDesktopWindow、GetWindowDC、ReleaseDC這幾個(gè)API函數(shù)略
Public RegUser As Boolean
????
Sub GetObjImage1(Obj As Object, OwnerForm As PictureBox, Picture1 As PictureBox)
? 'hDC
? Dim hWndDesk As Long
? Dim hDCDesk As Long
? '區(qū)域表達(dá)變量
? Dim x As Long
? Dim y As Long
? Dim w As Long
? Dim h As Long
????
? x = Obj.Left? Screen.TwipsPerPixelX
? y = Obj.Top? Screen.TwipsPerPixelY
? w = Obj.Width? Screen.TwipsPerPixelX
? h = Obj.Height? Screen.TwipsPerPixelY
? hDCDesk = OwnerForm.hdc
? '取出圖像
? Call BitBlt(Picture1.hdc, 0, 0, w, h, hDCDesk, x, y, vbSrcCopy)
? Call ReleaseDC(hWndDesk, hDCDesk)
????
End Sub
????
主窗體frmMain.frm部分代碼如下:
Private Sub cmdPrint_Click()
'生成條形碼圖像
? Dim r As Long, i As Integer, t As String,cfile As String '臨時(shí)變量
? t = BarCode
? For i = 0 To Val(Times) - 1
???
??? BarCode1.Value = BarCode + i
??? DoEvents
??? Picture1.Refresh
??
??? GetObjImage1 BarCode1, Conel, Picture1
???
??? If RegUser = False Then '如果未注冊(cè)添加MASK標(biāo)記
????? Picture1.PaintPicture Picture2.Picture, 300, 300
??? End If
???
??? If Dir(SavePath, vbDirectory) = "" Then MkDir SavePath
???
??? SavePath = SavePath & IIf(Right(SavePath, 1) <> "", "", "")
???
??? cfile = SavePath & BarCode1.Value & ".bmp"
??? SavePicture Picture1.Image, cfile '將條形碼保存為圖像文件以便打印
? Next
? BarCode = t
????
End Sub
????
條形碼設(shè)置窗體frmOption.frm代碼如下:
Option Explicit
'條形碼設(shè)置模塊
????
Private Sub cboBig_Click()
? BarCode1.Style = cboBig.ListIndex '改變標(biāo)準(zhǔn)
End Sub
????
Private Sub cboDirection_Click()
? BarCode1.Direction = cboDirection.ListIndex '改變方向
End Sub
????
Private Sub cboLine_Click()
? BarCode1.LineWeight = cboLine.ListIndex '改變線寬
End Sub
????
Private Sub cboSmall_Click()
? BarCode1.SubStyle = cboSmall.ListIndex '改變樣式
End Sub
????
Private Sub Check1_Click()
? BarCode1.ShowData = Check1.Value '是否顯示數(shù)據(jù)
End Sub
????
Private Sub cmdChange_Click()
'設(shè)置長(zhǎng)、寬大小
BarWidth = BarCode1.Height
BarHeight = BarCode1.Width
cmdRefresh_Click
End Sub
????
Private Sub cmdOK_Click()
'傳送條形碼設(shè)定到主界面
? With frmMain.BarCode1
??? .LineWeight = BarCode1.LineWeight
??? .Style = BarCode1.Style
??? .SubStyle = BarCode1.SubStyle
??? .Direction = BarCode1.Direction
??? .Width = BarCode1.Width
??? .Height = BarCode1.Height
??? .ShowData = BarCode1.ShowData
??? Me.Hide
? End With
? With frmMain
??? .Picture1.Width = .BarCode1.Width
??? .Picture1.Height = .BarCode1.Height
??? .Conel.Width = .BarCode1.Width
??? .Conel.Height = .BarCode1.Height
? End With
End Sub
????
Private Sub cmdRefresh_Click()
? BarCode1.Width = BarWidth
? BarCode1.Height = BarHeight
End Sub
????
Private Sub Form_Load()
LoadBarInfo
BarWidth = BarCode1.Width
BarHeight = BarCode1.Height
End Sub
????
Sub LoadBarInfo() '初始化選項(xiàng)
LoadBigClass cboBig
LoadSmallClass cboSmall
LoadLineSize cboLine
LoadDirection cboDirection
End Sub
Sub LoadBigClass(cbo As ComboBox) '條碼標(biāo)準(zhǔn)
? With cbo
??? .AddItem "UPC-A"
??? .AddItem "UPC-E"
??? .AddItem "EAN-13"
??? .AddItem "EAN-8"
??? .AddItem "Case Code"
??? .AddItem "Codabar (NW-T)"
??? .AddItem "Code-39"
??? .AddItem "Code-128"
??? .AddItem "U.S. Postnet"
??? .AddItem "U.S. Postal FIM"
??? .AddItem "JP Post"
??? .ListIndex = 2
? End With
End Sub
Sub LoadSmallClass(cbo As ComboBox) '條碼樣式
? With cbo
??? .AddItem "Standard"
??? .AddItem "2-Digit Supplement"
??? .AddItem "5-Digit Supplement"
??? .AddItem "POS Case Code"
??? .ListIndex = 0
? End With
End Sub
許多人在編寫(xiě)數(shù)據(jù)庫(kù)應(yīng)用程序時(shí),都想要加上條形碼功能加強(qiáng)工作效率,尤其是銷售管理,圖書(shū)館管理這類流量大的應(yīng)用軟件,但由于條形碼技術(shù)難以掌握、標(biāo)誰(shuí)又多以及過(guò)去的技術(shù)種種原因,使得許多人望而卻步。
總結(jié)
- 上一篇: 邝子平:vc兼做pe?
- 下一篇: 大厂Offer拿到手软啊!技术详细介绍