如何将文本框中的内容生成CODE39码(不要用第三方控件),并显示出来,请各位高手详细讲一下。

解决方案 »

  1.   

    条形码的编码规则不外乎是通过线条和线条间间隙的宽窄不同来表示二进制的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   最理想的情况是将它做成一个控件,在控件中提供一个打印方法,该方法实现与上 
      

  2.   

    http://www.ccidnet.com/tech/guide/2000/05/12/58_695.html
      

  3.   

    以前是用dos 下写的,不过我决的windows 下应该更容易,把字体直接换成对应的条码字体看看,我机器里没装条码字库没法实验。