0

在 VB.NET 中,我需要通过以表格格式排列条形码来打印多个图像。现在我正在做的是,创建条形码并将它们添加到新的图片框中。这些图片框添加到我在运行时在表单上创建的面板上并打印该面板(带有 4x9 表格中的图片框)。

但是,当我需要打印超过 36 个条码时,这个想法就行不通了。

所以,请建议我对我的代码进行一些改进或以任何其他方式来完成这项工作。


对不起,这是生成图像并将它们添加到面板的代码..

''' Method for create bar code images with a loop and adding them to the panel by picture box...    
Private Function GetBarcodeText(RowId As Guid)  
        Dim BarcodeValue As StringBuilder = New StringBuilder(96)  
        Dim temp As New StringBuilder  
        Dim data As String  
        Dim param = New SqlParameter()  
        Dim imageNo As Integer = 0  
        Dim colorValue As String = ""  
        Dim scaleValue As String = ""  

    '' Adding the panel on the form which is dynamically created
    Me.Controls.Add(outputPanel)

    '' Setting the Initial size for the panel
    outputPanel.Size = New Point(794, 112)
    outputPanel.Name = "outputPanel"
    outputPanel.BackColor = Drawing.Color.White
    param.ParameterName = "@RowId"
    param.Value = RowId
    param.SqlDbType = SqlDbType.UniqueIdentifier

    ' Get the particular row of data from database
    dt = objStockProvider.GetBarcodeDetails(param)

    ' GET colour code
    Dim color As String = dt.Rows(0)("COLOUR").ToString()

    Dim countColors As Integer = 0
    ' Get the color code numbers
    param.ParameterName = "@Dscale"
    param.Value = dgvViewTickets.CurrentRow.Cells("SCALE").Value.ToString()
    countColors = objStockProvider.CountColorCodes(param)

    For i = 1 To countColors
        For j As Integer = 1 + ((12 / countColors) * (i - 1)) To (12 / countColors) * i
            If dt.Rows(0)("S" + j.ToString()) <> 0 Then
                Dim totalTicketsForASize As Integer
                totalTicketsForASize = dt.Rows(0)("S" + j.ToString())
                For k As Integer = 1 To totalTicketsForASize                     
                    ' Set Bar code value which has to create
                    BarcodeValue = "123456789012"
                    ' Create Barcode Image for given value
                    Dim image = GetBarcodeImage(BarcodeValue, colorValue, scaleValue)
                    If image IsNot Nothing Then
                        '' Create picture box to contain generated Image.
                        Dim pcbImage As New PictureBox
                        pcbImage.Width = W
                        pcbImage.Height = H
                        pcbImage.Image = image
                        pcbImage.Location = New Point(X, Y)
                        imageNo += 1
                        If imageNo Mod 4 = 0 Then
                            X = 15
                            Y += H
                            outputPanel.Height += H
                        Else
                            X += W
                            Y = Y
                        End If
                        pcbImage.Visible = True
                        '' Adding picture box to panel
                        outputPanel.Controls.Add(pcbImage)
                    End If
                Next
            End If
        Next
        color = color.Substring(color.IndexOf(",") + 1, color.Length - color.IndexOf(",") - 1)
    Next
    PrintGeneratedTickets()
End Function

现在,我正在通过以下方法打印面板:

Private Sub PrintGeneratedTickets()

    bmp = New Bitmap(outputPanel.DisplayRectangle.Width, outputPanel.DisplayRectangle.Height)
    Dim G As Graphics = Graphics.FromImage(bmp)

    G.DrawRectangle(Pens.White, New Rectangle(0, 0, Me.outputPanel.DisplayRectangle.Width, Me.outputPanel.DisplayRectangle.Height))
    Dim Hdc As IntPtr = G.GetHdc()
    SendMessage(outputPanel.Handle, WM_PRINT, Hdc, DrawingOptions.PRF_OWNED Or DrawingOptions.PRF_CHILDREN Or DrawingOptions.PRF_CLIENT Or DrawingOptions.PRF_NONCLIENT)
    G.ReleaseHdc(Hdc)
    pndocument.DocumentName = bmp.ToString()

    Dim previewmode As New PrintPreviewDialog
    previewmode.Document = pndocument
    previewmode.WindowState = FormWindowState.Maximized
    previewmode.PrintPreviewControl.Zoom = 1

    pndocument.DefaultPageSettings.Margins.Top = 10
    pndocument.DefaultPageSettings.Margins.Bottom = 30
    pndocument.DefaultPageSettings.Margins.Left = 16
    pndocument.DefaultPageSettings.Margins.Right = 16
    pndocument.DefaultPageSettings.Landscape = False
    ' Set other properties.
    previewmode.PrintPreviewControl.Columns = 4
    previewmode.PrintPreviewControl.Rows = 9

    previewmode.ShowDialog()

    Dim file As String = DateTime.Now.ToString()
    file = Path.GetFullPath("D:\Bar Codes\" + file.Replace("/", "-").Replace(":", ".") + ".bmp")
    bmp.Save(file)
    G.Dispose()
    outputPanel.Controls.Clear()

End Sub

这段代码工作正常,但我需要做的是修复每页的图像数量(4x9)。但是,当我尝试创建更多内容时,所有内容都打印在具有压缩大小的单个页面上。

此外,当尝试重新运行代码时,它在预览中没有显示任何内容..

一些机构请建议更正代码,以便我可以重新打印门票并使用分页来处理超过 36 张图像。

4

1 回答 1

1

好吧,在面板上打印图像不是一个好主意。我更换了面板并创建了一组图像,并直接使用打印文档并在其上排列图像后打印。

谢谢。

于 2013-08-03T06:34:36.100 回答