CPrintDialog Class

Encapsulates the services provided by the Windows common dialog box for printing.

Syntax

class CPrintDialog : public CCommonDialog

Members

Public Constructors

Name Description
CPrintDialog::CPrintDialog Constructs a CPrintDialog object.

Public Methods

Name Description
CPrintDialog::CreatePrinterDC Creates a printer device context without displaying the Print dialog box.
CPrintDialog::DoModal Displays the dialog box and allows the user to make a selection.
CPrintDialog::GetCopies Retrieves the number of copies requested.
CPrintDialog::GetDefaults Retrieves device defaults without displaying a dialog box.
CPrintDialog::GetDeviceName Retrieves the name of the currently selected printer device.
CPrintDialog::GetDevMode Retrieves the DEVMODE structure.
CPrintDialog::GetDriverName Retrieves the name of the currently selected printer driver.
CPrintDialog::GetFromPage Retrieves the starting page of the print range.
CPrintDialog::GetPortName Retrieves the name of the currently selected printer port.
CPrintDialog::GetPrinterDC Retrieves a handle to the printer device context.
CPrintDialog::GetToPage Retrieves the ending page of the print range.
CPrintDialog::PrintAll Determines whether to print all pages of the document.
CPrintDialog::PrintCollate Determines whether collated copies are requested.
CPrintDialog::PrintRange Determines whether to print only a specified range of pages.
CPrintDialog::PrintSelection Determines whether to print only the currently selected items.

Public Data Members

Name Description
CPrintDialog::m_pd A structure used to customize a CPrintDialog object.

Remarks

Common print dialog boxes provide an easy way to implement Print and Print Setup dialog boxes in a manner consistent with Windows standards.

Note

The CPrintDialogEx class encapsulates the services provided by the Windows Print property sheet. For more information, see the CPrintDialogEx overview.

CPrintDialog's functionality is superseded by that of CPageSetupDialog, which is designed to provide you with a common dialog box for both print setup and page setup.

You can rely on the framework to handle many aspects of the printing process for your application. In this case, the framework automatically displays the Windows common dialog box for printing. You can also have the framework handle printing for your application but override the common Print dialog box with your own print dialog box. For more information about using the framework to handle printing tasks, see the article Printing.

If you want your application to handle printing without the framework's involvement, you can use the CPrintDialog class "as is" with the constructor provided, or you can derive your own dialog class from CPrintDialog and write a constructor to suit your needs. In either case, these dialog boxes will behave like standard MFC dialog boxes because they're derived from class CCommonDialog.

To use a CPrintDialog object, first create the object using the CPrintDialog constructor. Once the dialog box has been constructed, you can set or modify any values in the m_pd structure to initialize the values of the dialog box's controls. The m_pd structure is of type PRINTDLG. For more information on this structure, see the Windows SDK.

If you don't supply your own handles in m_pd for the hDevMode and hDevNames members, be sure to call the Windows function GlobalFree for these handles when you're done with the dialog box. When using the framework's Print Setup implementation provided by CWinApp::OnFilePrintSetup, you don't have to free these handles. The handles are maintained by CWinApp and are freed in CWinApp's destructor. It's only necessary to free these handles when using CPrintDialog stand-alone.

After initializing the dialog box controls, call the DoModal member function to display the dialog box and allow the user to select print options. DoModal returns whether the user selected the OK (IDOK) or Cancel (IDCANCEL) button.

If DoModal returns IDOK, you can use one of CPrintDialog's member functions to retrieve the information input by the user.

The CPrintDialog::GetDefaults member function is useful for retrieving the current printer defaults without displaying a dialog box. This member function requires no user interaction.

You can use the Windows CommDlgExtendedError function to determine whether an error occurred during initialization of the dialog box and to learn more about the error. For more information on this function, see the Windows SDK.

CPrintDialog relies on the COMMDLG.DLL file that ships with Windows versions 3.1 and later.

To customize the dialog box, derive a class from CPrintDialog, provide a custom dialog template, and add a message map to process the notification messages from the extended controls. Any unprocessed messages should be passed on to the base class. Customizing the hook function isn't required.

To process the same message differently depending on whether the dialog box is Print or Print Setup, you must derive a class for each dialog box. You must also override the Windows AttachOnSetup function, which handles the creation of a new dialog box when the Print Setup button is selected within a Print dialog box.

For more information on using CPrintDialog, see Common Dialog Classes.

Inheritance Hierarchy

CObject

CCmdTarget

CWnd

CDialog

CCommonDialog

CPrintDialog

Requirements

Header: afxdlgs.h

CPrintDialog::CPrintDialog

Constructs either a Windows Print or Print Setup dialog object.

CPrintDialog(
    BOOL bPrintSetupOnly,
    DWORD dwFlags = PD_ALLPAGES | PD_USEDEVMODECOPIES | PD_NOPAGENUMS | PD_HIDEPRINTTOFILE | PD_NOSELECTION,
    CWnd* pParentWnd = NULL);

Parameters

bPrintSetupOnly
Specifies whether the standard Windows Print dialog box or Print Setup dialog box is displayed. Set this parameter to TRUE to display the standard Windows Print Setup dialog box. Set it to FALSE to display the Windows Print dialog box. If bPrintSetupOnly is FALSE, a Print Setup option button is still displayed in the Print dialog box.

dwFlags
One or more flags you can use to customize the settings of the dialog box, combined using the bitwise OR operator. For example, the PD_ALLPAGES flag sets the default print range to all pages of the document. See the PRINTDLG structure in the Windows SDK for more information on these flags.

pParentWnd
A pointer to the dialog box's parent or owner window.

Remarks

This member function only constructs the object. Use the DoModal member function to display the dialog box.

Note that when you call the constructor with bPrintSetupOnly set to FALSE, the PD_RETURNDC flag is automatically used. After calling DoModal, GetDefaults, or GetPrinterDC, a printer DC will be returned in m_pd.hDC. This DC must be freed with a call to DeleteDC by the caller of CPrintDialog.

Example

// Display the Windows Print dialog box with "All" radio button 
// initially selected. All other radio buttons are disabled.
CPrintDialog dlg1(FALSE);

// Display the Windows Print dialog box with Collate check box checked.  
CPrintDialog dlg2(FALSE, PD_ALLPAGES | PD_COLLATE | PD_NOPAGENUMS | PD_HIDEPRINTTOFILE);

// Display the Windows Print dialog box with "Selection" radio
// button initially selected. "All" radio button is enabled
// but "Pages" radio button is disabled.
CPrintDialog dlg3(FALSE, PD_SELECTION | PD_USEDEVMODECOPIES);

CPrintDialog::CreatePrinterDC

Creates a printer device context (DC) from the DEVMODE and DEVNAMES structures.

HDC CreatePrinterDC();

Return Value

Handle to the newly created printer device context.

Remarks

This DC is assumed to be the current printer DC, and any other previously obtained printer DCs must be deleted by the user. This function can be called, and the resulting DC used, without ever displaying the Print dialog box.

Example

// Display the Windows Print dialog box with "All" radio button 
// initially selected. All other radio buttons are disabled.
CPrintDialog dlg(FALSE);
if (dlg.DoModal() == IDOK)
{
   // Create a printer device context (DC) based on the information
   // selected from the Print dialog.
   HDC hdc = dlg.CreatePrinterDC();
   ASSERT(hdc);
}

CPrintDialog::DoModal

Displays the Windows common print dialog box and allows the user to select various printing options such as the number of copies, page range, and whether copies should be collated.

virtual INT_PTR DoModal();

Return Value

IDOK or IDCANCEL. If IDCANCEL is returned, call the Windows CommDlgExtendedError function to determine whether an error occurred.

IDOK and IDCANCEL are constants that indicate whether the user selected the OK or Cancel button.

Remarks

If you want to initialize the various print dialog options by setting members of the m_pd structure, you should do this before calling DoModal, but after the dialog object is constructed.

After calling DoModal, you can call other member functions to retrieve the settings or information input by the user into the dialog box.

Note that when you call the constructor with bPrintSetupOnly set to FALSE, the PD_RETURNDC flag is automatically used. After calling DoModal, GetDefaults, or GetPrinterDC, a printer DC will be returned in m_pd.hDC. This DC must be freed with a call to DeleteDC by the caller of CPrintDialog.

Example

See the example for CPrintDialog::CreatePrinterDC.

CPrintDialog::GetCopies

Retrieves the number of copies requested.

int GetCopies() const;

Return Value

The number of copies requested.

Remarks

Call this function after calling DoModal to retrieve the number of copies requested.

Example

See the example for CPrintDialog::PrintCollate.

CPrintDialog::GetDefaults

Retrieves the device defaults of the default printer without displaying a dialog box.

BOOL GetDefaults();

Return Value

Nonzero if the function was successful; otherwise 0.

Remarks

The retrieved values are placed in the m_pd structure.

In some cases, a call to this function will call the constructor for CPrintDialog with bPrintSetupOnly set to FALSE. In these cases, a printer DC and hDevNames and hDevMode (two handles located in the m_pd data member) are automatically allocated.

If the constructor for CPrintDialog was called with bPrintSetupOnly set to FALSE, this function won't only return hDevNames and hDevMode located in m_pd.hDevNames and m_pd.hDevMode) to the caller, but will also return a printer DC in m_pd.hDC. It's the responsibility of the caller to delete the printer DC and call the Windows GlobalFree function on the handles when you're finished with the CPrintDialog object.

Example

This code fragment gets the default printer's device context and reports to the user the resolution of the printer in dots per inch. (This attribute of the printer's capabilities is often referred to as DPI.)

CPrintDialog dlg(FALSE);

if (!dlg.GetDefaults())
{
   AfxMessageBox(_T("You have no default printer!"));
}
else
{
   // attach to the DC we were given
   CDC dc;
   dc.Attach(dlg.m_pd.hDC);

   // ask for the measurements
   int nHorz = dc.GetDeviceCaps(LOGPIXELSX);
   int nVert = dc.GetDeviceCaps(LOGPIXELSY);

   // almost always the same in both directions, but sometimes not!
   CString str;
   if (nHorz == nVert)
   {
      str.Format(_T("Your printer supports %d pixels per inch"), nHorz);
   }
   else
   {
      str.Format(_T("Your printer supports %d pixels per inch ")
         _T("horizontal resolution, and %d pixels per inch vertical ")
         _T("resolution"), nHorz, nVert);
   }

   // tell the user
   AfxMessageBox(str);

   // Note: no need to call Detach() because we want the CDC destructor
   // to call FreeDC() on the DC we borrowed from the common dialog
}

CPrintDialog::GetDeviceName

Retrieves the name of the currently selected printer device.

CString GetDeviceName() const;

Return Value

The name of the currently selected printer.

Remarks

Call this function after calling DoModal to retrieve the name of the currently selected printer, or after calling GetDefaults to retrieve the current device defaults of the default printer. Use a pointer to the CString object returned by GetDeviceName as the value of lpszDeviceName in a call to CDC::CreateDC.

Example

This code fragment shows the user's default printer name and the port it's connected to, along with the spooler name the printer uses. The code might show a message box that says, "Your default printer is HP LaserJet IIIP on \\server\share using winspool.", for example.

CPrintDialog dlg(FALSE);

if (!dlg.GetDefaults())
{
   AfxMessageBox(_T("You have no default printer!"));
}
else
{
   CString strDescription;

   strDescription.Format(_T("Your default printer is %s on %s using %s."),
      (LPCTSTR)dlg.GetDeviceName(),
      (LPCTSTR)dlg.GetPortName(),
      (LPCTSTR)dlg.GetDriverName());

   AfxMessageBox(strDescription);
}

CPrintDialog::GetDevMode

Retrieves the DEVMODE structure.

LPDEVMODE GetDevMode() const;

Return Value

The DEVMODE data structure, which contains information about the device initialization and environment of a print driver. You must unlock the memory taken by this structure with the Windows GlobalUnlock function, which is described in the Windows SDK.

Remarks

Call this function after calling DoModal or GetDefaults to retrieve information about the printing device.

Example

See the example for CPrintDialog::PrintCollate.

CPrintDialog::GetDriverName

Retrieves the name of the currently selected printer driver.

CString GetDriverName() const;

Return Value

A CString specifying the system-defined driver name.

Remarks

Call this function after calling DoModal or GetDefaults to retrieve the name of the system-defined printer device driver. Use a pointer to the CString object returned by GetDriverName as the value of lpszDriverName in a call to CDC::CreateDC.

Example

See the example for CPrintDialog::GetDeviceName.

CPrintDialog::GetFromPage

Retrieves the starting page of the print range.

int GetFromPage() const;

Return Value

The starting page number in the range of pages to be printed.

Remarks

Call this function after calling DoModal to retrieve the starting page number in the range of pages to be printed.

Example

See the example for CPrintDialog::m_pd.

CPrintDialog::GetPortName

Retrieves the name of the currently selected printer port.

CString GetPortName() const;

Return Value

The name of the currently selected printer port.

Remarks

Call this function after calling DoModal or GetDefaults to retrieve the name of the currently selected printer port.

Example

See the example for CPrintDialog::GetDeviceName.

CPrintDialog::GetPrinterDC

Retrieves a handle to the printer device context.

HDC GetPrinterDC() const;

Return Value

A handle to the printer device context if successful; otherwise NULL.

Remarks

If the bPrintSetupOnly parameter of the CPrintDialog constructor was FALSE (indicating that the Print dialog box is displayed), then GetPrinterDC returns a handle to the printer device context. You must call the Windows DeleteDC function to delete the device context when you're done using it.

Example

CPrintDialog dlg(FALSE);
CPrintDialog dlg(FALSE);
if (dlg.DoModal() == IDOK)
{
   // Get a handle to the printer device context (DC).
   HDC hdc = dlg.GetPrinterDC();
   ASSERT(hdc);

   // Do something with the HDC...

   // Clean up.
   CDC::FromHandle(hdc)->DeleteDC();
}

CPrintDialog::GetToPage

Retrieves the ending page of the print range.

int GetToPage() const;

Return Value

The ending page number in the range of pages to be printed.

Remarks

Call this function after calling DoModal to retrieve the ending page number in the range of pages to be printed.

Example

See the example for CPrintDialog::m_pd.

CPrintDialog::m_pd

A structure whose members store the characteristics of the dialog object.

PRINTDLG& m_pd;

Remarks

After constructing a CPrintDialog object, you can use m_pd to set various aspects of the dialog box before calling the DoModal member function. For more information on the m_pd structure, see PRINTDLG in the Windows SDK.

If you modify the m_pd data member directly, you'll override any default behavior.

Example

// Display the Windows Print dialog box with "Pages" radio button
// initially selected. "All" and "Pages" radio buttons are
// enabled as well.
CPrintDialog dlg(FALSE, PD_PAGENUMS | PD_USEDEVMODECOPIES);
dlg.m_pd.nMinPage = dlg.m_pd.nFromPage = 1;
dlg.m_pd.nMaxPage = dlg.m_pd.nToPage = 10;
if (dlg.DoModal() == IDOK)
{
   // Determine the starting and ending page numbers for the range 
   // of pages to be printed.

   int from_page = -1, to_page = -1;
   if (dlg.PrintAll())              // print all pages in the document
   {
      from_page = dlg.m_pd.nMinPage;
      to_page = dlg.m_pd.nMaxPage;
   }
   else if (dlg.PrintRange())       // print only a range of pages 
   {                                // in the document 
      from_page = dlg.GetFromPage();
      to_page = dlg.GetToPage();
   }
   else if (dlg.PrintSelection())   // print only the currently selected 
                                    // items
   {
      from_page = to_page = -1;     // -1 to denote unknown yet
   }

   TRACE(_T("Print from %d to %d\n"), from_page, to_page);
}

CPrintDialog::PrintAll

Determines whether to print all pages of the document.

BOOL PrintAll() const;

Return Value

Nonzero if all pages in the document are to be printed; otherwise 0.

Remarks

Call this function after calling DoModal to determine whether to print all pages in the document.

Example

See the example for CPrintDialog::m_pd.

CPrintDialog::PrintCollate

Determines whether collated copies are requested.

BOOL PrintCollate() const;

Return Value

Nonzero if the user selects the collate check box in the dialog box; otherwise 0.

Remarks

Call this function after calling DoModal to determine whether the printer should collate all printed copies of the document.

Example

// Display the Windows Print dialog box with Collate check box checked.
CPrintDialog dlg(FALSE, PD_ALLPAGES | PD_COLLATE | PD_NOPAGENUMS |
   PD_HIDEPRINTTOFILE);
if (dlg.DoModal() == IDOK)
{
   // If the collate check box is selected, then GetCopies() will return
   // the number of copies printed. Otherwise, GetCopies() always 
   // returns 1. Then, the number of copies printed can be found from the
   // DEVMODE structure of the printing device.
   if (dlg.PrintCollate())
   {
      int num = dlg.GetCopies();
      TRACE(_T("Number of copies printed = %d\n"), num);
   }
   else
   {
      LPDEVMODE devmode = dlg.GetDevMode();
      TRACE(_T("Number of copies printed = %d\n"), devmode->dmCopies);
   }
}

CPrintDialog::PrintRange

Determines whether to print only a specified range of pages.

BOOL PrintRange() const;

Return Value

Nonzero if only a range of pages in the document are to be printed; otherwise 0.

Remarks

Call this function after calling DoModal to determine whether to print only a range of pages in the document.

Example

See the example for CPrintDialog::m_pd.

CPrintDialog::PrintSelection

Determines whether to print only the currently selected items.

BOOL PrintSelection() const;

Return Value

Nonzero if only the selected items are to be printed; otherwise 0.

Remarks

Call this function after calling DoModal to determine whether to print only the currently selected items.

Example

See the example for CPrintDialog::m_pd.

See also

MFC Sample DIBLOOK
CCommonDialog Class
Hierarchy Chart
CPrintInfo Structure