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.ShowPrinter
RichTextBox1.SelPrint(CommonDialog1.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, RightMarginWidth, BottomMarginHeight)
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 NextCharPosition As Long
Dim r As Long
' Start a print job to get a valid Printer.hDC
Printer.Print Space(1)
Printer.ScaleMode = 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
NextCharPosition = SendMessage(RTF.hWnd, EM_FORMATRANGE, True,
fr)
If NextCharPosition >= TextLength Then Exit Do 'If done then
exit
fr.chrg.cpMin = NextCharPosition ' 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.hdc 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 2 22213
What makes you think that the hDC of the PrintDialog
(a glorified MessageBox)
is the same as the hDC of the current Printer?
This helpful little bit comes from the VB5 Help Files
<snip>
The SelPrint method does not print text from the RichTextBox control.
Rather, it sends a copy of formatted text to a device which can print
the text. For example, you can send the text to the Printer object
using code as follows:
RichTextBox1.SelPrint(Printer.hDC)
Notice that the hDC property of the Printer object is used to specify
the device context argument of the SelPrint method.
Note If you use the Printer object as the destination of the text
from the RichTextBox control, you must first initialize the device
context of the Printer object by printing something like a zero-length
string.
</snip>
The CommonDialog stuff is totally misleading
On 3 Jul 2003 06:26:33 -0700, Pa**********@mailbox.tu-dresden.de
(Patrick Herb) wrote: 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.ShowPrinter
RichTextBox1.SelPrint(CommonDialog1.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, RightMarginWidth, BottomMarginHeight) 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 NextCharPosition As Long Dim r As Long
' Start a print job to get a valid Printer.hDC Printer.Print Space(1) Printer.ScaleMode = 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 NextCharPosition = SendMessage(RTF.hWnd, EM_FORMATRANGE, True, fr) If NextCharPosition >= TextLength Then Exit Do 'If done then exit fr.chrg.cpMin = NextCharPosition ' 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.hdc 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
> 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?
Unfortunately, the printer dialog IS pretty useless for selecting a
printer. I've spent weeks to solve this problem, and ended up creating
my own dialog for it (That's very simple - you just need to write the
printer names in the printer collection to a drop-down list, then see
which one the user selected, and print to the printer with that name.
The problem is the look-and-feel, and all printer-specific options
which are about impossible in VB).
The only way I found how the printer dialog will do anything is if you
set the "PrinterDefault" property - then it will change the default
printer. In this case, you can just use the Printer object in VB
Robert This thread has been closed and replies have been disabled. Please start a new discussion. Similar topics
by: John Lauwers |
last post by:
Hello,
Is there a way to move the commondialog to a specific position ?
Greets John
|
by: Rich Sweeny |
last post by:
Hi,
I am working in Mac OSX 10.3.7 with SDK 1.4_2. When my Print Dialog box
comes up just about everything is disabled except selecting from the 4
printers I have and being able to set the page...
|
by: George |
last post by:
Is there a way to customize the open file common dialog? I am trying to
modify the button text so I can create a delete file common dialog. I need
the same functionality of the open file common...
|
by: Mike |
last post by:
Hi,
Is there anyway to print from VB.NET or C# and bypass the printer dialog
box?
Thanks
Mike
|
by: pamelafluente |
last post by:
I am doing my own PrintDialog, and have placed there a combo with the
printer names, as in the PrintDialog provided by VB.NET.
Here is the question: how do I open the native windows printer...
|
by: devonknows |
last post by:
Good afternoon, ive got a common dialog which calles the print dialog, it prints perfectly, its prints my ListBox contents right, but when i click cancel on the print screen its just Prints it anyway...
|
by: Brad Pears |
last post by:
I have some sample code that uses the print dialog, print preview and a
print direct options.
If I select print preview and then click the printer icon from that, the
document prints. If I...
|
by: cmos1981 |
last post by:
Visual Basic 6.3 - i am auto printing a screen using vb. i dont want the print dialog box to appear. the page should just print to the default printer. alternatively if i could use "sendkeys" to...
|
by: ARC |
last post by:
Hello all,
Using the following command, is there any way to get the printer dialog to
open? I most packages, when you click print, it will open the printer
dialog, however Access sends the...
|
by: isladogs |
last post by:
The next Access Europe meeting will be on Wednesday 7 Feb 2024 starting at 18:00 UK time (6PM UTC) and finishing at about 19:30 (7.30PM).
In this month's session, the creator of the excellent VBE...
|
by: MeoLessi9 |
last post by:
I have VirtualBox installed on Windows 11 and now I would like to install Kali on a virtual machine. However, on the official website, I see two options: "Installer images" and "Virtual machines"....
|
by: Aftab Ahmad |
last post by:
Hello Experts!
I have written a code in MS Access for a cmd called "WhatsApp Message" to open WhatsApp using that very code but the problem is that it gives a popup message everytime I clicked on...
|
by: ryjfgjl |
last post by:
ExcelToDatabase: batch import excel into database automatically...
|
by: isladogs |
last post by:
The next Access Europe meeting will be on Wednesday 6 Mar 2024 starting at 18:00 UK time (6PM UTC) and finishing at about 19:15 (7.15PM).
In this month's session, we are pleased to welcome back...
|
by: marcoviolo |
last post by:
Dear all,
I would like to implement on my worksheet an vlookup dynamic , that consider a change of pivot excel via win32com, from an external excel (without open it) and save the new file into a...
|
by: Vimpel783 |
last post by:
Hello!
Guys, I found this code on the Internet, but I need to modify it a little. It works well, the problem is this: Data is sent from only one cell, in this case B5, but it is necessary that data...
|
by: jfyes |
last post by:
As a hardware engineer, after seeing that CEIWEI recently released a new tool for Modbus RTU Over TCP/UDP filtering and monitoring, I actively went to its official website to take a look. It turned...
|
by: PapaRatzi |
last post by:
Hello,
I am teaching myself MS Access forms design and Visual Basic. I've created a table to capture a list of Top 30 singles and forms to capture new entries. The final step is a form (unbound)...
| |