
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 customise 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 box's can be found here, so if you need to know a particular
controls 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 that 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 you 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!