Public Class Form1
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim strToPrint As String = "Here is a" & vbTab & "string with some" & vbTab & _
"embedded tab stops" & vbTab & "and" & vbCrLf & _
vbTab & vbTab & "a new line" & vbTab & "too"
Dim m_printer As New iHandlePrinting
m_printer.PrinterFont = New Font("Courier New", 9, FontStyle.Bold)
'Envy Code R VS
m_printer.DefaultPageSettings.Margins.Left = 10
m_printer.DefaultPageSettings.Margins.Top = 10
m_printer.DefaultPageSettings.Margins.Bottom = 50
'Set TextToPrint property
m_printer.TextToPrint = "" & vbCrLf & strToPrint '~~~ In your code, remove this line
' ''m_printer.TextToPrint = "" & vbCrLf & Me.txtSelectedRecord.Text '~~~ and uncomment this line.
' Set the required tab stops. Note that each tab specification '~~~ Add lines similar to.
' is the offset from the previous tab. '~~~ this prior to invoking
Dim sngaTabStops As Single() = {100.0F, 150.0F, 300.0F} '~~~ the Print method.
m_printer.TabStops = sngaTabStops '~~~
'Run Print command
m_printer.Print()
End Sub
End Class
Imports System.Drawing
Imports System.Drawing.Printing
Public Class iHandlePrinting : Inherits Printing.PrintDocument
#Region " Property Variables "
''' <summary>
''' Property variable for the Font the user wishes to use
''' </summary>
''' <remarks></remarks>
Private _font As Font
''' <summary>
''' Property variable for the text to be printed
''' </summary>
''' <remarks></remarks>
Private _text As String
Private _tabStops As Single() = {0.0F} '~~~ Add this array.
#End Region
#Region " Class Properties "
Public Property TabStops() As Single() '~~~ Add this property.
Get '~~~
Return _tabStops '~~~
End Get '~~~
Set(ByVal value As Single()) '~~~
_tabStops = value '~~~
End Set '~~~
End Property '~~~
''' <summary>
''' Property to hold the text that is to be printed
''' </summary>
''' <value></value>
''' <returns>A string</returns>
''' <remarks></remarks>
Public Property TextToPrint() As String
Get
Return _text
End Get
Set(ByVal Value As String)
_text = Value
End Set
End Property
Public Function ShowPrintDialog() As Boolean '~~~* Type should be declared!
ShowPrintDialog(Me)
Return True
End Function
Private Function ShowPrintDialog(ByRef myDocumentToPrint As PrintDocument) As Boolean '~~~* Type should be declared!
Dim psd As New PageSetupDialog
With psd
.AllowMargins = True
.AllowOrientation = True
.AllowPaper = True
.AllowPrinter = True
.ShowHelp = True
.ShowNetwork = True
.Document = myDocumentToPrint
End With
psd.ShowDialog()
Return True
End Function
''' <summary>
''' Property to hold the font the users wishes to use
''' </summary>
''' <value></value>
''' <returns></returns>
''' <remarks></remarks>
Public Property PrinterFont() As Font
' Allows the user to override the default font
Get
Return _font
End Get
Set(ByVal Value As Font)
_font = Value
End Set
End Property
#End Region
#Region " Class Constructors "
''' <summary>
''' Empty constructor
''' </summary>
''' <remarks></remarks>
Public Sub New()
'Set the file stream
MyBase.New()
'Instantiate out Text property to an empty string
_text = String.Empty
End Sub
''' <summary>
''' Constructor to initialize our printing object
''' and the text it's supposed to be printing
''' </summary>
''' <param name="str">Text that will be printed</param>
''' <remarks></remarks>
Public Sub New(ByVal str As String)
'Set the file stream
MyBase.New()
'Set our Text property value
_text = str
End Sub
#End Region
#Region " OnBeginPrint "
''' <summary>
''' Override the default OnBeginPrint method of the PrintDocument Object
''' </summary>
''' <param name="e"></param>
''' <remarks></remarks>
Protected Overrides Sub OnBeginPrint(ByVal e As Printing.PrintEventArgs)
' Run base code
MyBase.OnBeginPrint(e)
'Check to see if the user provided a font
'if they didnt then we default to Times New Roman
If _font Is Nothing Then
'Create the font we need
_font = New Font("Times New Roman", 10)
End If
End Sub
#End Region
#Region " OnPrintPage "
''' <summary>
''' Override the default OnPrintPage method of the PrintDocument
''' </summary>
''' <param name="e"></param>
''' <remarks>This provides the print logic for our document</remarks>
Protected Overrides Sub OnPrintPage(ByVal e As Printing.PrintPageEventArgs)
' Run base code
MyBase.OnPrintPage(e)
'Declare local variables needed
Static curChar As Integer
Dim printHeight As Integer
Dim printWidth As Integer
Dim leftMargin As Integer
Dim rightMargin As Integer
Dim lines As Int32
Dim chars As Int32
'Set print area size and margins
With MyBase.DefaultPageSettings
printHeight = .PaperSize.Height - .Margins.Top - .Margins.Bottom
printWidth = .PaperSize.Width - .Margins.Left - .Margins.Right
leftMargin = .Margins.Left 'X
rightMargin = .Margins.Top 'Y
End With
'Check if the user selected to print in Landscape mode
'if they did then we need to swap height/width parameters
If MyBase.DefaultPageSettings.Landscape Then
Dim tmp As Integer
tmp = printHeight
printHeight = printWidth
printWidth = tmp
End If
'Now we need to determine the total number of lines
'we're going to be printing
Dim numLines As Int32 = CInt(printHeight / PrinterFont.Height)
'Create a rectangle printing are for our document
Dim printArea As New RectangleF(leftMargin, rightMargin, printWidth, printHeight)
'Use the StringFormat class for the text layout of our document
Dim format As New StringFormat(StringFormatFlags.LineLimit)
format.SetTabStops(0.0F, _tabStops) '~~~ Add this line.
'Fit as many characters as we can into the print area
e.Graphics.MeasureString(_text.Substring(RemoveZeros(curChar)), PrinterFont, New SizeF(printWidth, printHeight), format, chars, lines)
'Print the page
e.Graphics.DrawString(_text.Substring(RemoveZeros(curChar)), PrinterFont, Brushes.Black, printArea, format)
'Increase current char count
curChar += chars
'Detemine if there is more text to print, if
'there is the tell the printer there is more coming
If curChar < _text.Length Then
e.HasMorePages = True
Else
e.HasMorePages = False
curChar = 0
End If
End Sub
#End Region
#Region " RemoveZeros "
''' <summary>
''' Function to replace any zeros in the size to a 1
''' Zero's will mess up the printing area
''' </summary>
''' <param name="value">Value to check</param>
''' <returns></returns>
''' <remarks></remarks>
Public Function RemoveZeros(ByVal value As Integer) As Integer
'Check the value passed into the function,
'if the value is a 0 (zero) then return a 1,
'otherwise return the value passed in
Select Case value
Case 0
Return 1
Case Else
Return value
End Select
End Function
#End Region
End Class
|