Link to home
Start Free TrialLog in
Avatar of MattRawling
MattRawling

asked on

Printing

How can i print the contents of a form, the text boxes and their values onto paper?
Cheers
Matt
Avatar of GivenRandy
GivenRandy

To capture and print a screen, form or window, use the sample and source at:

http://support.microsoft.com/support/kb/articles/Q161/2/99.ASP 

To save to a file, use the SavePicture function:

SavePicture Picture1, "filename"

Alternatively:

---
Private Declare Function GetDC Lib "user32" (ByVal hwnd As Long) As Long
Private Declare Function GetDesktopWindow Lib "user32" () As Long
Private Declare Function BitBlt Lib "gdi32" (ByVal hDestDC As Long, ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal dwRop As Long) As Long
Const SRCCOPY = &HCC0020

Dim Desk As Long
Dim THdc As Long
   
Desk = GetDesktopWindow
THdc = GetDC(Desk)
Me.AutoRedraw = True
Me.ScaleMode = vbPixels
BitBlt Me.hDC, 0, 0, Screen.Width, Screen.Height, THdc, 0, 0, SRCCOPY
SavePicture Me.Image, "somefile.bmp"
---
The visible part ?
Form1.PrintForm

But if you need to print also the non visible content (non visible as outside the screen or as in multiline textboxes), you will have to write more complex code.
Take a look here:
https://www.experts-exchange.com/questions/20351282/Print-a-VB-form-not-using-Print-form-method.html

or in Msdn:

HOWTO: Print a Form That Is Too Large for the Screen or Page
Q230502
--------------------------------
The information in this article applies to:
Microsoft Visual Basic Standard Edition, 32-bit, for Windows, version 4.0
Microsoft Visual Basic Professional Edition, 32-bit, for Windows, version 4.0
Microsoft Visual Basic Enterprise Edition, 32-bit, for Windows, version 4.0
Microsoft Visual Basic Learning Edition for Windows, versions 5.0, 6.0
Microsoft Visual Basic Professional Edition for Windows, versions 5.0, 6.0
Microsoft Visual Basic Enterprise Edition for Windows, versions 5.0, 6.0
---------------------------------
SUMMARY
The PrintForm method prints only the portion of the form
that is displayed. This article demonstrates how to print
a form that is either larger than the screen or is only
partially displayed.

MORE INFORMATION
If you need to print a form that is larger than the
screen, or is only partially displayed, then the controls
on the form must be placed in a PictureBox. This prints
the bitmap that is contained in the PictureBox, instead of
a screen capture of the form itself (which is what
PrintForm does). Because the PictureBox's bitmap is stored
in a device context in memory, you have access to the
entire bitmap regardless of what is displayed.

NOTE: For the purposes of this article, the height of the
form is set to 11 inches. If another paper size is
desired, such as 8.5- X 14- inches, set the sTall variable
to an appropriate value, for example, 14. Also note that
these assignments are made in twips because this is the
default scalemode for forms. If you change the scalemode,
you need to change these values to match as well.

Print a Form That Is Larger Than the Screen
Start a new Standard EXE project in Visual Basic. Form1 is
created by default.
Add two PictureBoxes to Form1.
Avoid drawing the second PictureBox inside the first,
because doing so makes the second PictureBox a member of
the first. Instead, place the origin point of the second
PictureBox to the left of the origin point of the first
PictureBox.
Right-click Picture2 and choose Send to Back.
Add two labels to Picture1, leaving Picture2 empty.
Add the following code to the General Declarations section
of Form1:

Private Const twipFactor = 1440
Private Const WM_PAINT = &HF
Private Const WM_PRINT = &H317
Private Const PRF_CLIENT = &H4&    ' Draw the window's client area.
Private Const PRF_CHILDREN = &H10& ' Draw all visible child windows.
Private Const PRF_OWNED = &H20&    ' Draw all owned windows.

Private Declare Function SendMessage Lib "user32" Alias _
   "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, _
   ByVal wParam As Long, ByVal lParam As Long) As Long
   
Private Sub Form_Load()
   Dim sWide As Single, sTall As Single
   Dim rv As Long

   Me.ScaleMode = vbTwips   ' default
   sWide = 8.5
   stall = 11   ' or 14, etc.
   Me.Width = twipFactor * sWide
   Me.Height = twipFactor * stall
   With Picture1
      .Top = 0
      .Left = 0
      .Width = twipFactor * sWide
      .Height = twipFactor * stall
   End With
   With Picture2
      .Top = 0
      .Left = 0
      .Width = twipFactor * sWide
      .Height = twipFactor * stall
   End With
   With Label1
      .Caption = "Top"
      .Left = Me.Width / 2
      .Top = 0
   End With
   With Label2
      .Caption = "Bottom"
      .Top = (twipFactor * stall) - .Height * 2
      .Left = Me.Width / 2
   End With
   Me.Visible = True
   DoEvents

   Picture1.SetFocus
   Picture2.AutoRedraw = True
   rv = SendMessage(Picture1.hwnd, WM_PAINT, Picture2.hDC, 0)
   rv = SendMessage(Picture1.hwnd, WM_PRINT, Picture2.hDC, _
   PRF_CHILDREN + PRF_CLIENT + PRF_OWNED)
   Picture2.Picture = Picture2.Image
   Picture2.AutoRedraw = False

   Printer.Print ""
   Printer.PaintPicture Picture2.Picture, 0, 0
   Printer.EndDoc
End Sub

Run the project.
The Top and Bottom labels should appear in their
respective positions regardless of whether the form is
completely displayed.

Print a Form on More Than One Page
If the form you are printing is too large to fit on a
page, you can use the same approach as in the preceding
example with a minor addition. The PaintPicture method has
a number of optional parameters. The clipping region
parameters can be used to grab a portion of the bitmap
image and print it.

To accomplish this, locate the following code in the
previous example:

Printer.Print ""
Printer.PaintPicture Picture2.Picture, 0, 0
Printer.EndDoc
Replace those three lines of code with the following:

Printer.Print ""
Printer.PaintPicture Picture2.Picture, 0, 0, , , _
   0, 0, , Picture2.Height / 2
Printer.NewPage
Printer.PaintPicture Picture2.Picture, 0, 0, , , _
   0, Picture2.Height / 2, , Picture2.Height / 2
Printer.EndDoc

For ease of illustration, this example merely divides the
form in half. You can adjust the clipping region
appropriately for your needs.

NOTE: Visual Basic 6.0 Online Help states that PrintForm
prints the entire form, whether the entire form is visible
or not. This information is incorrect.

REFERENCES
For additional information about printing forms, click the article numbers below to view the articles in the Microsoft Knowledge Base:

Q178076 HOWTO: Use a PictureBox to Control Orientation Printing a Form
Q161299 HOWTO: Capture and Print the Screen, a Form, or Any Window
Q194580 HOWTO: Print a Composite Image From a RichTextBox
Q146022 HOWTO: Set Up the RichTextBox Control for WYSIWYG Printing
Just take the PrintForm-Methode from your form.

e.g.: MyForm.PrintForm
   Printer.Font.Name = TextBox.Font.Name
    Printer.Font.Bold = TextBox.Font.Bold
    Printer.Font.Charset = TextBox.Font.Charset
    Printer.Font.Italic = TextBox.Font.Italic
    Printer.Font.Size = TextBox.Font.Size
    Printer.Font.Strikethrough = TextBox.Font.Strikethrough
    Printer.Font.Underline = TextBox.Font.Underline
    Printer.Font.Weight = TextBox.Font.Weight
 Printer.Print TextBox.text
how about simply using the command....

PrintForm ' print the form as it is directly to the printer.

Good Luck!
Hi MattRawling,
This old question (QID 20560858) needs to be finalized -- accept an answer, split points, or get a refund.  Please see http://www.cityofangels.com/Experts/Closing.htm for information and options.
No comment has been added lately, so it's time to clean up this TA.
I will leave a recommendation in the Cleanup topic area that this question is:

 -->PAQ - no points refunded

Please leave any comments here within the next seven days.

PLEASE DO NOT ACCEPT THIS COMMENT AS AN ANSWER

GPrentice00
Cleanup Volunteer
make a claim
ASKER CERTIFIED SOLUTION
Avatar of YensidMod
YensidMod

Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial