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.
The code presented below demonstrates the typical steps needed to:
- prompt the user for the printing characteristics such as printer and paper
size (via a call to
- Setup a printer DC and printing DOCINFO structure
- Use callbacks to adjust settings such as start and end pages to print, or
- Print all pages to be printed
In order to keep the MFC Doc/View feel I recomend providing helper callback functions
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
OnPrint function would be where you do the actual printing/drawing, and your
OnEndPrinting function performs any cleanup necessary (such as deleting GDI objects 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.
implementations would look like:
void OnBeginPrinting(CDC *pDC, CPrintInfo* pInfo)
void OnPrint(CDC *pDC, CPrintInfo* pInfo)
void OnEndPrinting(CDC *pDC, CPrintInfo* pInfo)
The Printing code
if (printDlg.DoModal() == IDCANCEL) return;
dc.Attach(printDlg.GetPrinterDC()); dc.m_bPrinting = TRUE;
CString strTitle; strTitle.LoadString(AFX_IDS_APP_TITLE);
DOCINFO di; ::ZeroMemory (&di, sizeof (DOCINFO));
di.cbSize = sizeof (DOCINFO);
di.lpszDocName = strTitle;
BOOL bPrintingOK = dc.StartDoc(&di);
OnBeginPrinting(&dc, &Info); for (UINT page = Info.GetMinPage();
page <= Info.GetMaxPage() && bPrintingOK;
dc.StartPage(); Info.m_nCurPage = page;
OnPrint(&dc, &Info); bPrintingOK = (dc.EndPage() > 0); }
Chris is the Co-founder, Administrator, Architect, Chief Editor and Shameless Hack who wrote and runs The Code Project. He's been programming since 1988 while pretending to be, in various guises, an astrophysicist, mathematician, physicist, hydrologist, geomorphologist, defence intelligence researcher and then, when all that got a bit rough on the nerves, a web developer. He is a Microsoft Visual C++ MVP both globally and for Canada locally.
His programming experience includes C/C++, C#, SQL, MFC, ASP, ASP.NET, and far, far too much FORTRAN. He has worked on PocketPCs, AIX mainframes, Sun workstations, and a CRAY YMP C90 behemoth but finds notebooks take up less desk space.
He dodges, he weaves, and he never gets enough sleep. He is kind to small animals.
Chris was born and bred in Australia but splits his time between Toronto and Melbourne, depending on the weather. For relaxation he is into road cycling, snowboarding, rock climbing, and storm chasing.