How To Print
To print something in Gambas 3, you have to :
The Printing Process
When running the Print method, a local event-loop is run, and the method returns only when the printing is finished or cancelled.
During this local event-loop, the following events are raised :
You have to implement the
draw event. All other events are optional.
The Begin event
This event is raised when the print starts.
You can define the
Printer.Count property there if you know how many pages you have to print.
Otherwise, you have to implement the Paginate event to layout your document and compute the page count.
By default, only one page is printed.
The Paginate event
This event is raised so that you can paginate your document in the background.
If you define no event handler, this event will not be raised, and you will have to define the Count property inside the Begin event handler.
Otherwise, if you handle this event, the event handler will be called again and again until you explicitely define the count property.
The Draw event
This event is called once for each page that must be printed.
The current page number is returned by the
Printer.Page property.
All drawing is done by using the
Paint class.
The End event
This event is raised when the printing process is finished.
How To Draw A Page
Page dimensions
Drawing is done inside a rectangle representing the page with or without the margins.
The origin of the rectangle is (
0
,
0
), and the size of the rectangle is (
Paint.Width,
Paint.Height).
Printing margins
Printers usually cannot print on the entire page, i.e. there is a margin where you cannot print.
The previous rectangle represents the entire page only if the
Printer.FullPage property is set. Otherwise these margins are taken into account.
You must take that into account when designing your printing!
I strongly suggest always printing with Printer.FullPage set, and let the user choose its own margins from the borders of the page, so that
he gets exactly what he wants.
Absolute coordinates
Instead of using the drawing coordinates, you usually prefer using absolute coordinates in centimeters or millimiters.
To do that, you have to use the
Printer.PaperWidth and
Printer.PaperHeight properties that return the size of the paper in millimeters.
Then you can use the
Paint.Scale method to scale the coordinate system so that every coordinate you specify is now in millimeters:
Dim MyPrinter As Printer
MyPrinter = New Printer As "MyPrinter"
...
Public Sub MyPrinter_Draw()
Paint.Scale(Paint.Width / MyPrinter.PaperWidth, Paint.Height / MyPrinter.PaperHeight)
...
End
Font size
BEWARE: The font size, as returned by Paint.Font.Size, is an absolute size.
Its unit is the
typographic point.
A typographic point is 1/72 of an inch, i.e. about 0,353 mm.
Consequently, if a 10 points font is a good size for drawing text on the screen, it may be too big for the paper:
as the printer resolution is far greater than the screen resolution, you usually print things smaller.
BUT: The font size will be modified according to the paint matrix (i.e. if you use
Paint.Scale,
Paint.Translate,
Paint.Rotate...)
There is a printing example provided with Gambas, that shows most of the previous concepts.
A custom sample implementation
There is a sample implementation for graphics-centered applications in
Basic considerations and optimized printing for graphics-centered applications.