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