Overview
The CPrintDialog
box is a standard system supplied resource used by just about every program under the sun that needs to print. But what if you need to customize it? What I present here is a quick and easy way to do this.
Stage 1: Copy the Common Dialogs Resource Template
The first stage is to create in your project an exact copy of the existing dialog template used by the CPrintDialog
class. I did this by copying the default source of this and pasting it into my applications .rc file. The default content of these can be found in the file PrnSetup.Dlg of your Visual C++ VC98\Include directory. In fact, the default dialog templates for all the common dialog boxes can be found here, so if you need to know a particular control's ID number, this is the place to look! See also the file Dlgs.h which includes the #define
s of the actual controls on all the common dialog templates.
PRINTDLGORD DIALOG DISCARDABLE 32, 32, 288, 186
STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU |
DS_CONTEXTHELP | DS_3DLOOK
CAPTION "Print"
FONT 8, "MS Sans Serif"
BEGIN
GROUPBOX "Printer",grp4,8,4,272,84,WS_GROUP
LTEXT "&Name:",stc6,16,20,36,8
COMBOBOX cmb4,52,18,152,152,CBS_DROPDOWNLIST | CBS_SORT |
WS_VSCROLL | WS_GROUP | WS_TABSTOP
PUSHBUTTON "&Properties",psh2,212,17,60,14,WS_GROUP
LTEXT "Status:",stc8,16,36,36,10,SS_NOPREFIX
LTEXT "",stc12,52,36,224,10,SS_NOPREFIX | SS_LEFTNOWORDWRAP
LTEXT "Type:",stc7,16,48,36,10,SS_NOPREFIX
LTEXT "",stc11,52,48,224,10,SS_NOPREFIX | SS_LEFTNOWORDWRAP
LTEXT "Where:",stc10,16,60,36,10,SS_NOPREFIX
LTEXT "",stc14,52,60,224,10,SS_NOPREFIX | SS_LEFTNOWORDWRAP
LTEXT "Comment:",stc9,16,72,36,10,SS_NOPREFIX
LTEXT "",stc13,52,72,152,10,SS_NOPREFIX | SS_LEFTNOWORDWRAP
CONTROL "Print to fi&le",chx1,"Button",BS_AUTOCHECKBOX |
WS_GROUP | WS_TABSTOP,212,70,64,12
GROUPBOX "Print range",grp1,8,92,144,64,WS_GROUP
CONTROL "&All",rad1,"Button",BS_AUTORADIOBUTTON | WS_GROUP |
WS_TABSTOP,16,106,64,12
CONTROL "Pa&ges",rad3,"Button",BS_AUTORADIOBUTTON,16,122,36,12
CONTROL "&Selection",rad2,"Button",BS_AUTORADIOBUTTON,16,138,64,
12
RTEXT "&from:",stc2,52,124,20,8
EDITTEXT edt1,74,122,26,12,WS_GROUP | ES_NUMBER
RTEXT "&to:",stc3,100,124,16,8
EDITTEXT edt2,118,122,26,12,WS_GROUP | ES_NUMBER
GROUPBOX "Copies",grp2,160,92,120,64,WS_GROUP
LTEXT "Number of &copies:",stc5,168,108,68,8
EDITTEXT edt3,240,106,32,12,WS_GROUP | ES_NUMBER
ICON "",ico3,162,124,76,24,WS_GROUP | SS_CENTERIMAGE
CONTROL "C&ollate",chx2,"Button",BS_AUTOCHECKBOX | WS_GROUP |
WS_TABSTOP,240,130,36,12
DEFPUSHBUTTON "OK",IDOK,180,164,48,14,WS_GROUP
PUSHBUTTON "Cancel",IDCANCEL,232,164,48,14
END
You will have to modify it slightly. In the example above, you would need to change the PRINTDLGORD
to the name of the dialog resource you want to call it locally in your own application. In my case, this was IDD_PRINT
. Make sure that when you do this, the #define IDD_PRINT x
exists in your resource.h file.
Stage 2: Add Controls and Wrap the Dialog Template
Add any controls to the dialog and lay it out as you need, then invoke ClassWizard
so that you can wrap your new dialog resource in a class object. Name it what you want, but make sure you select the base class as CPrintDialog
. Once this has been created, you can add message handler, etc. for any extra buttons that you add to your dialog resource.
Stage 3: Using Your New CMyPrintDialog Class
To get your application to use this new CPrintDialog
dialog, you need to add the following code to your CView::OnPreparePrinting()
function:
delete pInfo->m_pPD ;
pInfo->m_pPD = new CMyPrintDialog(false) ;
pInfo->m_pPD->m_pd.nMinPage = 1 ;
pInfo->m_pPD->m_pd.nMaxPage = 0xffff ;
pInfo->m_pPD->m_pd.hInstance = AfxGetInstanceHandle() ;
pInfo->m_pPD->m_pd.lpPrintTemplateName = MAKEINTRESOURCE(IDD_PRINT) ;
pInfo->m_pPD->m_pd.Flags |= PD_ENABLEPRINTTEMPLATE ;
Stage 4: Compile and Run Your Application
That's it! You just need to write your handler from there!
Enjoy!