Microsoft KB Archive/133275

= How To Print from a Class Other Than CView =

Article ID: 133275

Article Last Modified on 11/21/2006

-

APPLIES TO

 Microsoft Foundation Class Library 4.2, when used with:  Microsoft Visual C++ 1.0 Professional Edition

 Microsoft Visual C++ 1.5 Professional Edition

 Microsoft Visual C++ 1.51

 Microsoft Visual C++ 1.52 Professional Edition</li></ul>

 Microsoft Visual C++ 1.0 Professional Edition</li></ul>

 Microsoft Visual C++ 2.0 Professional Edition</li></ul>

 Microsoft Visual C++ 2.1</li></ul>

 Microsoft Visual C++ 4.0 Standard Edition</li></ul>

 Microsoft Visual C++ 4.1 Subscription</li></ul> </li></ul>

-

<div class="notice_section">

This article was previously published under Q133275

<div class="summary_section">

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.

<div class="moreinformation_section">

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

<div class="references_section">