Hello,
I'm trying to print the content of a RichTextBox from my VB 6 app.
What I want is that the CommonDialog shows up, the user selects a
printer and the content of the RichTextBox prints to the selected
printer. I'm not concerned about the text format.
What I tried is something like this
CommonDialog1.S howPrinter
RichTextBox1.Se lPrint(CommonDi alog1.hdc)
The code did not work, it produced runtime error 32001 - invalid hdc.
I then searched in the Knowledge Base and found some code from
Microsoft for printing RichTextBox contents. However, it looks like
this:
----------------------------------------------------------------------------
Public Sub PrintRTF(RTF As RichTextBox, LeftMarginWidth As Long, _
TopMarginHeight , RightMarginWidt h, BottomMarginHei ght)
Dim LeftOffset As Long, TopOffset As Long
Dim LeftMargin As Long, TopMargin As Long
Dim RightMargin As Long, BottomMargin As Long
Dim fr As FormatRange
Dim rcDrawTo As Rect
Dim rcPage As Rect
Dim TextLength As Long
Dim NextCharPositio n As Long
Dim r As Long
' Start a print job to get a valid Printer.hDC
Printer.Print Space(1)
Printer.ScaleMo de = vbTwips
' Get the offsett to the printable area on the page in twips
' some code here
' Calculate the Left, Top, Right, and Bottom margins
' some code here
' Set printable area rect
' some code here
' Set rect in which to print (relative to printable area)
' some code here
' Set up the print instructions
fr.hdc = Printer.hdc ' Use the same DC for measuring and
rendering
fr.hdcTarget = Printer.hdc ' Point at printer hDC
fr.rc = rcDrawTo ' Indicate the area on page to draw to
fr.rcPage = rcPage ' Indicate entire size of page
fr.chrg.cpMin = 0 ' Indicate start of text through
fr.chrg.cpMax = -1 ' end of the text
' Get length of text in RTF
TextLength = Len(RTF.Text)
' Loop printing each page until done
Do
' Print the page by sending EM_FORMATRANGE message
NextCharPositio n = SendMessage(RTF .hWnd, EM_FORMATRANGE, True,
fr)
If NextCharPositio n >= TextLength Then Exit Do 'If done then
exit
fr.chrg.cpMin = NextCharPositio n ' Starting position for next
page
Printer.NewPage ' Move on to next page
Printer.Print Space(1) ' Re-initialize hDC
fr.hdc = Printer.hdc
fr.hdcTarget = Printer.hdc
Loop
' Commit the print job
Printer.EndDoc
' Allow the RTF to free up memory
r = SendMessage(RTF .hWnd, EM_FORMATRANGE, False, ByVal CLng(0))
End Sub
------------------------------------------------------------------------------
This code works but it takes the printer hdc from the Printer object.
Looking at the values of the hdcs the CommonDialog1.h dc always
contains 0, the Printer.hdc always contains some long number
(obviously a valid printer hdc).
Am I making a mistake? or is the printer dialog useless for selecting
a printer? How can I get the hdc of the selected printer from the
CommonDialog?
patrick
I'm trying to print the content of a RichTextBox from my VB 6 app.
What I want is that the CommonDialog shows up, the user selects a
printer and the content of the RichTextBox prints to the selected
printer. I'm not concerned about the text format.
What I tried is something like this
CommonDialog1.S howPrinter
RichTextBox1.Se lPrint(CommonDi alog1.hdc)
The code did not work, it produced runtime error 32001 - invalid hdc.
I then searched in the Knowledge Base and found some code from
Microsoft for printing RichTextBox contents. However, it looks like
this:
----------------------------------------------------------------------------
Public Sub PrintRTF(RTF As RichTextBox, LeftMarginWidth As Long, _
TopMarginHeight , RightMarginWidt h, BottomMarginHei ght)
Dim LeftOffset As Long, TopOffset As Long
Dim LeftMargin As Long, TopMargin As Long
Dim RightMargin As Long, BottomMargin As Long
Dim fr As FormatRange
Dim rcDrawTo As Rect
Dim rcPage As Rect
Dim TextLength As Long
Dim NextCharPositio n As Long
Dim r As Long
' Start a print job to get a valid Printer.hDC
Printer.Print Space(1)
Printer.ScaleMo de = vbTwips
' Get the offsett to the printable area on the page in twips
' some code here
' Calculate the Left, Top, Right, and Bottom margins
' some code here
' Set printable area rect
' some code here
' Set rect in which to print (relative to printable area)
' some code here
' Set up the print instructions
fr.hdc = Printer.hdc ' Use the same DC for measuring and
rendering
fr.hdcTarget = Printer.hdc ' Point at printer hDC
fr.rc = rcDrawTo ' Indicate the area on page to draw to
fr.rcPage = rcPage ' Indicate entire size of page
fr.chrg.cpMin = 0 ' Indicate start of text through
fr.chrg.cpMax = -1 ' end of the text
' Get length of text in RTF
TextLength = Len(RTF.Text)
' Loop printing each page until done
Do
' Print the page by sending EM_FORMATRANGE message
NextCharPositio n = SendMessage(RTF .hWnd, EM_FORMATRANGE, True,
fr)
If NextCharPositio n >= TextLength Then Exit Do 'If done then
exit
fr.chrg.cpMin = NextCharPositio n ' Starting position for next
page
Printer.NewPage ' Move on to next page
Printer.Print Space(1) ' Re-initialize hDC
fr.hdc = Printer.hdc
fr.hdcTarget = Printer.hdc
Loop
' Commit the print job
Printer.EndDoc
' Allow the RTF to free up memory
r = SendMessage(RTF .hWnd, EM_FORMATRANGE, False, ByVal CLng(0))
End Sub
------------------------------------------------------------------------------
This code works but it takes the printer hdc from the Printer object.
Looking at the values of the hdcs the CommonDialog1.h dc always
contains 0, the Printer.hdc always contains some long number
(obviously a valid printer hdc).
Am I making a mistake? or is the printer dialog useless for selecting
a printer? How can I get the hdc of the selected printer from the
CommonDialog?
patrick
Comment