Printing without the Document/View framework

CodeGuru content and product recommendations are editorially independent. We may make money when you click on links to our partners. Learn More.

If you have a dialog based application and want to print, then you
cannot take advantage of the Doc/View framework that MFC provides to
do all the dirty work for you.

In order to keep the MFC doc/View feel I recomend providing helper
functions OnBeginPrinting, OnEndPrinting and OnPrint
similar to the CView versions. A CDC and a CPrintInfo object
is passed into each of these functions. You will have to provide
these functions yourself
. Typically you would undertake any initialisation
neessary (such as creating GDI objects) in OnBeginPrinting. Your OnPrint function
would be where you do the actual printing/drawing, and your OnEndPrinting
function performs any cleanup necessary (such as deleting GDIobjects created in
OnBeginPrinting). You can call these functions whatever you want – I’ve used these
names to be consistant with the CView names, and they are only used to show
where the various initialisation/printing/cleanup code should be inserted by you.

void CMyDialog::Print()
{
    CDC dc;
    CPrintDialog printDlg(FALSE);

    if (printDlg.DoModal() == IDCANCEL)         // Get printer settings from user
        return;

    dc.Attach(printDlg.GetPrinterDC());         // Attach a printer DC
    dc.m_bPrinting = TRUE;

    CString strTitle;                           // Get the application title
    strTitle.LoadString(AFX_IDS_APP_TITLE);

    DOCINFO di;                                 // Initialise print document details
    ::ZeroMemory (&di, sizeof (DOCINFO));
    di.cbSize = sizeof (DOCINFO);
    di.lpszDocName = strTitle;

    BOOL bPrintingOK = dc.StartDoc(&di);        // Begin a new print job

    // Get the printing extents and store in the m_rectDraw field of a 
    // CPrintInfo object
    CPrintInfo Info;
    Info.m_rectDraw.SetRect(0,0,
                            dc.GetDeviceCaps(HORZRES),
                            dc.GetDeviceCaps(VERTRES));

    OnBeginPrinting(&dc, &Info);                // Call your "Init printing" funtion
    for (UINT page = Info.GetMinPage();
         page <= Info.GetMaxPage() && bPrintingOK;
         page++)
    {
        dc.StartPage();                         // begin new page
        Info.m_nCurPage = page;
        OnPrint(&dc, &Info);                    // Call your "Print page" function
        bPrintingOK = (dc.EndPage() > 0);       // end page
    }
    OnEndPrinting(&dc, &Info);                  // Call your "Clean up" funtion

    if (bPrintingOK)
        dc.EndDoc();                            // end a print job
    else
        dc.AbortDoc();                          // abort job.

    dc.Detach();                                // detach the printer DC
}

Last updated: August 12 1998

More by Author

Get the Free Newsletter!

Subscribe to Developer Insider for top news, trends & analysis

Must Read