This article describes how to customize the default print dialog to include
extra options included in your application. This procedure works for all common
dialog except for the file dialog, see the related codeguru article for that.
The basic steps are as follows:
- Subclass the CPrintDialog class in a new class (e.g. CMyPrintDialog).
- In the constructor, tell it to use a custom template.
#include <Dlgs.h> CMyPrintDialog::CMyPrintDialog(BOOL bPrintSetupOnly, DWORD dwFlags, CWnd* pParentWnd) : CPrintDialog(bPrintSetupOnly, dwFlags, pParentWnd) { m_pd.lpPrintTemplateName = (LPTSTR) MAKEINTRESOURCE(PRINTDLGORD); m_pd.Flags |= PD_ENABLEPRINTTEMPLATE; m_pd.hInstance = AfxGetInstanceHandle(); AfxGetApp()->GetPrinterDeviceDefaults(&m_pd); }
The important thing is that the lpPrintTemplateName and hInstance
members of the m_pd structure are filled in when the PD_ENABLEPRINTTEMPLATE
flag is set. - Create the custom template identified by PRINTDLGORD by modifying
a copy of the default template. The default template can be found in the file
PRNSETUP.DLG and the identifiers used in the dialog are defined in DLGS.H.
Choose "Resource Includes" from the VIEW menu and add the following
lines to the "read-only symbol directives".#include <Dlgs.h> #include <PRNSETUP.DLG>
Now save the workspace and reopen it. You now have three new dialog resources,
modify the print dialog (called 1538) and you can delete the others. Remove
the include for PRNSETUP.DLG from the resource includes to prevent conflicts.
Do not remove the DLGS.H include. - Modify the OnPreparePrint function to use your customize print class.
BOOL CMyprintView::OnPreparePrinting(CPrintInfo* pInfo) { delete pInfo->m_pPD; pInfo->m_pPD = new CMyPrintDialog(FALSE); return DoPreparePrinting(pInfo); }
For other common dialogs you can repeat the procedure but subclass different
base classes and use other templates.
Related MSDN articles
http://msdn.microsoft.com/library/sdkdoc/winui/commdlg3_4qlv.htm
http://msdn.microsoft.com/library/sdkdoc/winui/commdlg3_68qg.htm