Printing without the Document/View framework | CodeGuru

Printing without the Document/View framework

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 […]

Written By
CodeGuru Staff
CodeGuru Staff
Aug 11, 1998
1 minute read
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

CodeGuru Logo

CodeGuru covers topics related to Microsoft-related software development, mobile development, database management, and web application programming. In addition to tutorials and how-tos that teach programmers how to code in Microsoft-related languages and frameworks like C# and .Net, we also publish articles on software development tools, the latest in developer news, and advice for project managers. Cloud services such as Microsoft Azure and database options including SQL Server and MSSQL are also frequently covered.

Property of TechnologyAdvice. © 2026 TechnologyAdvice. All Rights Reserved

Advertiser Disclosure: Some of the products that appear on this site are from companies from which TechnologyAdvice receives compensation. This compensation may impact how and where products appear on this site including, for example, the order in which they appear. TechnologyAdvice does not include all companies or all types of products available in the marketplace.