How To Print from a Class Other Than CView

This article was previously published under Q133275
This article has been archived. It is offered "as is" and will no longer be updated.
The standard method to support printing capability in an MFC application isto override the OnDraw(CDC* pDC) member function of the CView class thatprovides the pointer to the device context (pDC). If the application doesnot possess a CView class (for example, a dialog-based application), youcan use the code listed in this article to obtain a pointer to the printingdevice 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() isused to select print settings specified to an application. The sample codeprints 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.       printDlg->DoModal();       // 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 withthe Microsoft Foundation Class Library" in Books Online.
2.52 3.0 3.00 3.1 3.10

Article ID: 133275 - Last Review: 10/26/2013 03:19:00 - Revision: 4.0

  • Microsoft Foundation Class Library 4.2
  • kbnosurvey kbarchive kbcode kbhowto kbprint kbprogramming KB133275