How To Print from a Class Other Than CView (133275)



The information in this article applies to:

  • The Microsoft Foundation Classes (MFC), when used with:
    • Microsoft Visual C++ for Windows, 16-bit edition 1.0
    • Microsoft Visual C++ for Windows, 16-bit edition 1.5
    • Microsoft Visual C++ for Windows, 16-bit edition 1.51
    • Microsoft Visual C++ for Windows, 16-bit edition 1.52
    • Microsoft Visual C++, 32-bit Editions 1.0
    • Microsoft Visual C++, 32-bit Editions 2.0
    • Microsoft Visual C++, 32-bit Editions 2.1
    • Microsoft Visual C++, 32-bit Editions 4.0
    • Microsoft Visual C++, 32-bit Editions 4.1

This article was previously published under Q133275

SUMMARY

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.
       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) ;
       }
				

REFERENCES

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

Modification Type:MinorLast Reviewed:7/1/2004
Keywords:kbcode kbhowto kbprint kbProgramming KB133275