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 に答える