## Printing overview

Classes: wxPrintout, wxPrinter, wxPrintPreview, wxPrinterDC, wxPrintDialog, wxPrintData, wxPrintDialogData, wxPageSetupDialog, wxPageSetupDialogData

The printing framework relies on the application to provide classes whose member functions can respond to particular requests, such as 'print this page' or 'does this page exist in the document?'. This method allows wxWidgets to take over the housekeeping duties of turning preview pages, calling the print dialog box, creating the printer device context, and so on: the application can concentrate on the rendering of the information onto a device context.

The document/view framework creates a default wxPrintout object for every view, calling wxView::OnDraw to achieve a prepackaged print/preview facility.

A document's printing ability is represented in an application by a derived wxPrintout class. This class prints a page on request, and can be passed to the Print function of a wxPrinter object to actually print the document, or can be passed to a wxPrintPreview object to initiate previewing. The following code (from the printing sample) shows how easy it is to initiate printing, previewing and the print setup dialog, once the wxPrintout functionality has been defined. Notice the use of MyPrintout for both printing and previewing. All the preview user interface functionality is taken care of by wxWidgets. For details on how MyPrintout is defined, please look at the printout sample code.

        case WXPRINT_PRINT:
        {
          wxPrinter printer;
          MyPrintout printout("My printout");
          printer.Print(this, &printout, true);
          break;
        }
        case WXPRINT_PREVIEW:
        {
          // Pass two printout objects: for preview, and possible printing.
          wxPrintPreview *preview = new wxPrintPreview(new MyPrintout, new MyPrintout);
          wxPreviewFrame *frame = new wxPreviewFrame(preview, this, "Demo Print Preview", wxPoint(100, 100), wxSize(600, 650));
          frame->Centre(wxBOTH);
          frame->Initialize();
          frame->Show(true);
          break;
        }