This drawing canvas can be used to draw to a printer. Like all drawing canvases, the available methods are described in vDC. A very effective technique for combining a printer DC and a screen DC is to pass a pointer to either a vCanvasPaneDC or a vPrintDC to the code that draws the screen. The same code can then be used to draw or print.
To successfully use a vPrintDC, your code must obtain the physical size of the page in units using GetPhysWidth and GetPhysHeight. On paper, these represent 1/72 inch points, and correspond very closely, but not exactly, to a pixel on the screen.
You must bracket the printing with calls to BeginPrinting and EndPrinting. Use BeginPage and EndPage to control paging. Note that the width of text will not necessarily be the same on a vCanvasPaneDC and a vPrintDC, even for the same fonts. Also, the size of the paper represents the entire page. Most printers cannot actually print all the way to the edges of the paper, so you will usually use vDC:SetTranslate to leave some margins. (Don't forget to account for margins when you calculate what can fit on a page.)
The implementation of vPrintDC is somewhat platform dependent. For X, vPrintDC represents a PostScript printer, and is derived from the class vPSPrintDC. For Windows, vPrintDC is derived from the vWinPrintDC class. To get platform independent operation for your application, use vPrintDC. On Windows, you can also use the PostScript version directly if you want by using the vPSPrintDC class, but the program will not conform to standard Windows behavior.
This is a simple example taken from the VDraw demo program. Print is called to print the current drawing. Print calls vPrinter::Setup to set the printer characteristics, and then calls DrawShapes with a pointer to the vPrintDC. DrawShapes is also called to repaint the screen using the vCanvasPaneDC. By carefully planning for both screen and printer drawing, your program can often share drawing code in this fashion.
//===================>>> myCanvasPane::Print <<<================= void myCanvasPane::Print() { // Print current picture vPrintDC pdc; // create a vPrintDC object vPrinter printer; // and a printer to set attributes printer.Setup("test.ps"); // setup the printer pdc.SetPrinter(printer); // change to the printer we setup if (!pdc.BeginPrinting()) // call BeginPrinting first return; pdc.SetTranslate(36,36); // Add 1/2" (36 * 1/72") margins DrawShapes(&pdc); // Now, call shared drawing method pdc.EndPrinting(); // Finish printing } //===================>>> myCanvasPane::DrawShapes <<<================= void myCanvasPane::DrawShapes(vDC* cp) { // Common code for drawing both on Screen and Printer ... }