How To Print from a Class Other Than CView

Article translations Article translations
Article ID: 133275 - View products that this article applies to.
This article was previously published under Q133275
This article has been archived. It is offered "as is" and will no longer be updated.
Expand all | Collapse all

On This Page


The standard method to support printing capability in an MFC application is to override the OnDraw(CDC* pDC) member function of the CView class that provides the pointer to the device context (pDC). If the application does not possess a CView class (for example, a dialog-based application), you can use the code listed in this article to obtain a pointer to the printing device context to implement printing.

More information

In this example, CMyDialog is publicly derived from CDialog, OnPrintBuf() is a message handler that is mapped to BN_CLICKED, and SetPrintAlign() is used to select print settings specified to an application. The sample code prints the contents of the 'pbuf' buffer.

Sample Code

   void CMyDialog::OnPrintBuf()
       char   pbuf[100] = "Hello World.";
       HDC    hdcPrn ;

       // Instantiate a CPrintDialog.
       CPrintDialog *printDlg =
           new CPrintDialog(FALSE, PD_ALLPAGES | PD_RETURNDC, NULL);

       // Initialize some of the fields in PRINTDLG structure.
       printDlg->m_pd.nMinPage = printDlg->m_pd.nMaxPage = 1;
       printDlg->m_pd.nFromPage = printDlg->m_pd.nToPage = 1;

       // Display Windows print dialog box.

       // Obtain a handle to the device context.
       hdcPrn = printDlg->GetPrinterDC();
       if (hdcPrn != NULL)
           CDC *pDC = new CDC;
           pDC->Attach (hdcPrn);      // attach a printer DC

           pDC->StartDoc("test");  // begin a new print job
                                   // for Win32 use
                                   // CDC::StartDoc(LPDOCINFO) override

           pDC->StartPage();          // begin a new page
           SetPrintAlign(pDC, hdcPrn);// set the printing alignment
           pDC->TextOut(10, 10, pbuf);// write the string in pbuf
           pDC->EndPage();            // end a page

           pDC->EndDoc();             // end a print job

           pDC->Detach();             // detach the printer DC
           delete pDC;

       delete printDlg;

   void CMyDialog::SetPrintAlign(CDC *pDC, HDC hdcPrn)
       short cxPage, cyPage;

       cxPage = ::GetDeviceCaps (hdcPrn, HORZRES) ;
       cyPage = ::GetDeviceCaps (hdcPrn, VERTRES) ;
       pDC->SetMapMode (MM_ISOTROPIC) ;
       pDC->SetWindowExt ( 1000, 1000) ;
       pDC->SetViewportExt (cxPage / 2, -cyPage / 2) ;
       pDC->SetViewportOrg (cxPage / 2,  cyPage / 2) ;
       pDC->SetTextAlign (TA_BASELINE | TA_CENTER) ;


For more information about the MFC printing, please see "Programming with the Microsoft Foundation Class Library" in Books Online.


Article ID: 133275 - Last Review: October 26, 2013 - Revision: 4.0
Applies to
  • Microsoft Foundation Class Library 4.2, when used with:
    • Microsoft Visual C++ 1.0 Professional Edition
    • Microsoft Visual C++ 1.52 Professional Edition
    • Microsoft Visual C++ 2.1
    • Microsoft Visual C++ 4.0 Standard Edition
kbnosurvey kbarchive kbcode kbhowto kbprint kbprogramming KB133275

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from