Printing RTF with Table

Posted on 2008-10-17
Last Modified: 2013-12-15
I am trying to print an RTF, i have an RTF TextBox on my VB6 form. with a command button code attached.

my RTF file has a table i can see it on screen formatted properly but when i print i get laods of code priting rather than my form, as if i had opened the RTF in notepad.

Any ideas how i can fix this, Kindest Regards

Public Sub Command1_Click()

   ' Print the contents of the RichTextBox with a one inch margin

 '  PrintRTF Doc, AnInch, AnInch, AnInch, AnInch


Combo1.Text = "HP LaserJet 1018"

Dim Y As Printer

For Each Y In Printers

  If Y.DeviceName = Combo1 Then

     ' Set printer as system default.

     Set Printer = Y

     ' Stop looking for a printer.

     Exit For

  End If


'Printer.ForeColor = &H80000008 'sets the text colour

'Printer.Orientation = vbproplandscape

Printer.Print Doc 'prints whats in text1


End Sub

Open in new window

Question by:Benji_
  • 2

Accepted Solution

twiglatte earned 250 total points
ID: 22746900
Add the attached code to a module, then call the sub like this:

PrintRTF RichTextBox1, 1440, 1440, 1440, 1440 ' 1440 Twips = 1 Inch

where RichTextBox1 is your RTF control
'Put the following in a module:

Private Declare Function GetDeviceCaps Lib "gdi32" ( _

      ByVal hdc As Long, ByVal nIndex As Long) As Long

Private Declare Function SendMessage Lib "USER32" _

      Alias "SendMessageA" _

      (ByVal hWnd As Long, ByVal msg As Long, ByVal wp As Long, _

      lp As Any) As Long


Private Const WM_USER As Long = &H400

Private Const EM_FORMATRANGE As Long = WM_USER + 57

Private Const EM_SETTARGETDEVICE As Long = WM_USER + 72

Private Const PHYSICALOFFSETX As Long = 112

Private Const PHYSICALOFFSETY As Long = 113

Private Type Rect

   Left As Long

   Top As Long

   Right As Long

   Bottom As Long

End Type


Private Type CharRange

  cpMin As Long     ' First character of range (0 for start of doc)

  cpMax As Long     ' Last character of range (-1 for end of doc)

End Type


Private Type FormatRange

  hdc As Long       ' Actual DC to draw on

  hdcTarget As Long ' Target DC for determining text formatting

  rc As Rect        ' Region of the DC to draw to (in twips)

  rcPage As Rect    ' Region of the entire DC (page size) (in twips)

  chrg As CharRange ' Range of text to draw (see above declaration)

End Type


Public Sub PrintRTF(RTF As RichTextBox, LeftMarginWidth As Long, TopMarginHeight As Long, RightMarginWidth As Long, BottomMarginHeight As Long)

      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

      LeftOffset = Printer.ScaleX(GetDeviceCaps(Printer.hdc, _

         PHYSICALOFFSETX), vbPixels, vbTwips)

      TopOffset = Printer.ScaleY(GetDeviceCaps(Printer.hdc, _

         PHYSICALOFFSETY), vbPixels, vbTwips)

      ' Calculate the Left, Top, Right, and Bottom margins

      LeftMargin = LeftMarginWidth - LeftOffset

      TopMargin = TopMarginHeight - TopOffset

      RightMargin = (Printer.Width - RightMarginWidth) - LeftOffset

      BottomMargin = (Printer.Height - BottomMarginHeight) - TopOffset

      ' Set printable area rect

      rcPage.Left = 0

      rcPage.Top = 0

      rcPage.Right = Printer.ScaleWidth

      rcPage.Bottom = Printer.ScaleHeight

      ' Set rect in which to print (relative to printable area)

      rcDrawTo.Left = LeftMargin

      rcDrawTo.Top = TopMargin

      rcDrawTo.Right = RightMargin

      rcDrawTo.Bottom = BottomMargin

      ' 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


         ' 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


      ' Commit the print job


      ' Allow the RTF to free up memory

      r = SendMessage(RTF.hWnd, EM_FORMATRANGE, False, ByVal _


End Sub

Open in new window


Author Comment

ID: 22747533
Thanks for that, could ya help me to tell me how i can modifty the code so that i can say which printer,

Because differnt parts of my application will need differnt printers. but i want it type the name myself  into the code.


Author Closing Comment

ID: 31507111
Thanks for the help, adding that and implementing i then used set app default printer frm my code to use the printer i wished to use.

Featured Post

PRTG Network Monitor: Intuitive Network Monitoring

Network Monitoring is essential to ensure that computer systems and network devices are running. Use PRTG to monitor LANs, servers, websites, applications and devices, bandwidth, virtual environments, remote systems, IoT, and many more. PRTG is easy to set up & use.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Most everyone who has done any programming in VB6 knows that you can do something in code like Debug.Print MyVar and that when the program runs from the IDE, the value of MyVar will be displayed in the Immediate Window. Less well known is Debug.Asse…
Article by: Martin
Here are a few simple, working, games that you can use as-is or as the basis for your own games. Tic-Tac-Toe This is one of the simplest of all games.   The game allows for a choice of who goes first and keeps track of the number of wins for…
Get people started with the utilization of class modules. Class modules can be a powerful tool in Microsoft Access. They allow you to create self-contained objects that encapsulate functionality. They can easily hide the complexity of a process from…
Show developers how to use a criteria form to limit the data that appears on an Access report. It is a common requirement that users can specify the criteria for a report at runtime. The easiest way to accomplish this is using a criteria form that a…

910 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

26 Experts available now in Live!

Get 1:1 Help Now