Printing using margins

T

tm

I am trying to print a form using the following code, everything works fine
but the margins are not acted upon. What I am I doing wrong?



Private Sub CaptureScreen()
Dim myGraphics As Graphics = Me.CreateGraphics()
Dim s As Size = Me.Size
memoryImage = New Bitmap(s.Width, s.Height, myGraphics)
Dim memoryGraphics As Graphics = Graphics.FromImage(memoryImage)
memoryGraphics.CopyFromScreen(Me.Location.X, Me.Location.Y, 0, 0, s)
End Sub



Private Sub printDocument1_PrintPage(ByVal sender As System.Object, _
ByVal e As System.Drawing.Printing.PrintPageEventArgs) Handles
printDocument1.PrintPage

Dim margins As New Margins(0, 0, 600, 0)
printDocument1.DefaultPageSettings.Margins = margins
e.Graphics.DrawImage(memoryImage, 0, 0)

End Sub
 
R

Ron Allen

tm,
You didn't say which version of the framework you are using. For 1.x
you will need to compensate for the 'hard margins' on the printer by
PInvoking GetDeviceCaps to get the margins. Also you won't be able to print
except for inside those margins as the printer isn't capable of printing
there. Except for some very high end printers most aren't capable of
printing to the edge of the paper.
You can look for GetHardMargins in this newsgroup or in
microsoft.public.dotnet.framework.drawing to find some code to get the
actual printer margin values. If you are using FW 2.0 you can use the
properties of the PrintDocument to find the margins.

Ron Allen
 
T

tm

Ron,

I am using Framework 2.0

I have tried searching "GetHardMargins " with no luck.
If I add the following to my sub printDocument1_PrintPage
I do see my margins settings, but this just proves that I can
set and read back the PageSetupDialog1 information. It
seems that the info is not getting back to the printer.
What ties the PageSetupDialog to the system default printer?

With PageSetupDialog1

Dim leftMargin As Single = .PageSettings.Margins.Left

Dim rightMargin As Single = .PageSettings.Margins.Right

Dim topMargin As Single = .PageSettings.Margins.Top

Dim BottomMargin As Single = .PageSettings.Margins.Bottom

End With



tom
 
G

Guest

You can get the printable page size from the PrintPageEventArgs.PageBounds
which is passed to the PrintPage Event.
 
T

tm

Dennis,

I capture the image in the CaptureScreen sub.

What I want to do is use Margins to begin printing
6 inches down from the top. But the default printer
seems not to see the new margins I set in the
printDocument1 event and continus to print
at the top.

If you have any suggestions of what I am doing
wrong I would appreciate your feed back.

tom


Private Sub CaptureScreen()
Dim myGraphics As Graphics = Me.CreateGraphics()
Dim s As Size = Me.Size
memoryImage = New Bitmap(s.Width, s.Height, myGraphics)
Dim memoryGraphics As Graphics = Graphics.FromImage(memoryImage)
memoryGraphics.CopyFromScreen(Me.Location.X, Me.Location.Y, 0, 0, s)
End Sub


Private Sub printDocument1_PrintPage(ByVal sender As System.Object, _
ByVal e As System.Drawing.Printing.PrintPageEventArgs) Handles _
printDocument1.PrintPage

Dim margins As New Margins(0, 0, 600, 0)
printDocument1.DefaultPageSettings.Margins = margins
e.Graphics.DrawImage(memoryImage, 0, 0)

End Sub
 
G

Guest

You are drawing to the page graphics object and you need to use the point for
the drawing to start. If you want the drawing to be 6 inches from the top of
the paper and 2 inches from the left side of the paper, use

e.Graphics.DrawImage(memoryImage, 200, 600).

The margins have nothing to do with it.
 
T

tm

Thanks Dennis, I have been working on this for a week.

Now that I can print at the bottom I have another question,
is it possible to do two CaptureScreen() and send one two
print at the top and the other to print at the bottom.

Or prevent the form feed from ejecting the paper which would
allow printing on top then print at bottom then eject the paper.

tom
 
G

Guest

You can print as many images as you want wherever you want, even overlapping
so long as you do it before exiting the routine. If you want to change
pages, just set the PrintPageEventArgs.HasMorePages = True and the PrintPages
sub will be called again. You can use a static variable in the sub to keep
track of which page you are on.

Dennis in Houston
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Top