如果
DoModal
返回
IDOK
,则你可以使用
CPrintDialog
的成员函数之一来检索用户输入的信息。
CPrintDialog::GetDefaults
成员函数可用于在不显示对话框的情况下检索当前打印机默认值。 此成员函数不需要用户交互。
可以使用 Windows
CommDlgExtendedError
函数来确定对话框初始化期间是否发生了错误,并了解有关错误的详细信息。 有关此函数的详细信息,请参阅 Windows SDK。
CPrintDialog
依赖于 Windows 3.1 和更高版本随附的
COMMDLG.DLL
文件。
若要自定义对话框,请从
CPrintDialog
派生类,提供自定义对话框模板,并添加消息映射以处理来自扩展控件的通知消息。 任何未处理的消息应传递给基类。 不需要自定义挂钩函数。
若要根据对话框是“打印”还是“打印设置”来以不同方式处理同一消息,必须为每个对话框派生一个类。 此外,必须重写 Windows
AttachOnSetup
函数,在“打印”对话框中选择了“打印设置”按钮时,该函数将处理新对话框的创建。
有关如何使用
CPrintDialog
的详细信息,请参阅
通用对话框类
。
继承层次结构
CObject
CCmdTarget
CDialog
CCommonDialog
CPrintDialog
标头
:
afxdlgs.h
CPrintDialog::CPrintDialog
构造 Windows“打印”或“打印设置”对话框对象。
CPrintDialog(
BOOL bPrintSetupOnly,
DWORD dwFlags = PD_ALLPAGES | PD_USEDEVMODECOPIES | PD_NOPAGENUMS | PD_HIDEPRINTTOFILE | PD_NOSELECTION,
CWnd* pParentWnd = NULL);
bPrintSetupOnly
指定是要显示标准 Windows“打印”对话框还是“打印设置”对话框。 将此参数设置为 TRUE
会显示标准 Windows“打印设置”对话框。 将其设置为 FALSE
会显示 Windows“打印”对话框。 如果 bPrintSetupOnly
为 FALSE
,则“打印设置”选项按钮仍会显示在“打印”对话框中。
dwFlags
可以使用一个或多个标志来自定义对话框的设置,并使用按位“或”运算符组合这些设置。 例如,PD_ALLPAGES
标志将默认打印范围设置为文档的所有页面。 有关这些标志的详细信息,请参阅 Windows SDK 中的 PRINTDLG
结构。
pParentWnd
指向对话框的父窗口或所有者窗口的指针。
此成员函数只构造对象。 使用 DoModal
成员函数显示对话框。
请注意,在 bPrintSetupOnly
设置为 FALSE
的情况下调用构造函数时,会自动使用 PD_RETURNDC
标志。 调用 DoModal
、GetDefaults
或 GetPrinterDC
后,将在 m_pd.hDC
中返回打印机 DC。 必须由 CPrintDialog
的调用方通过 DeleteDC
调用来释放此 DC。
// 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
从 DEVMODE
和 DEVNAMES
结构创建打印机设备上下文 (DC)。
HDC CreatePrinterDC();
新建的打印机设备上下文的句柄。
此 DC 假定为当前打印机 DC,先前获取的任何其他打印机 DC 必须由用户删除。 可以调用此函数并使用生成的 DC,而无需显示“打印”对话框。
// 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
显示 Windows 通用打印对话框并允许用户选择各种打印选项,例如份数、页面范围以及是否应整理页面。
virtual INT_PTR DoModal();
IDOK
或 IDCANCEL
。 如果返回 IDCANCEL
,则调用 Windows CommDlgExtendedError
函数以确定是否发生了错误。
IDOK
和 IDCANCEL
是常量,指示用户选择的是“确定”按钮还是“取消”按钮。
如果要通过设置 m_pd
结构的成员来初始化各种打印对话框选项,则应在调用 DoModal
之前但在构造对话框对象之后执行此操作。
在调用 DoModal
之后,可以调用其他成员函数来检索用户在对话框中输入的设置或信息。
请注意,在 bPrintSetupOnly
设置为 FALSE
的情况下调用构造函数时,会自动使用 PD_RETURNDC
标志。 调用 DoModal
、GetDefaults
或 GetPrinterDC
后,将在 m_pd.hDC
中返回打印机 DC。 必须由 CPrintDialog
的调用方通过 DeleteDC
调用来释放此 DC。
请参阅 CPrintDialog::CreatePrinterDC
的示例。
CPrintDialog::GetCopies
检索请求的份数。
int GetCopies() const;
请求的份数。
调用 DoModal
后可以调用此函数来检索请求的份数。
请参阅 CPrintDialog::PrintCollate
的示例。
CPrintDialog::GetDefaults
在不显示对话框的情况下检索默认打印机的设备默认值。
BOOL GetDefaults();
如果该函数成功,则为非零;否则为 0。
检索到的值将放在 m_pd
结构中。
在某些情况下,调用此函数会在 bPrintSetupOnly
设置为 FALSE
的情况下调用 CPrintDialog
的构造函数。 在这种情况下,会自动分配打印机 DC、hDevNames
和 hDevMode
(位于 m_pd
数据成员中的两个句柄)。
如果在 bPrintSetupOnly
设置为 FALSE
的情况下调用 CPrintDialog
的构造函数,则此函数不仅会将 m_pd.hDevNames
和 m_pd.hDevMode
中的 hDevNames
和 hDevMode
返回给调用方,而且还会在 m_pd.hDC
中返回打印机 DC。 处理完 CPrintDialog
对象后,调用方需负责删除打印机 DC 并在句柄上调用 Windows GlobalFree
函数。
此代码片段获取默认打印机的设备上下文,并向用户报告打印机的分辨率(每英寸点数)。 (打印机功能的此属性通常称为 DPI。)
CPrintDialog dlg(FALSE);
if (!dlg.GetDefaults())
AfxMessageBox(_T("You have no default printer!"));
// 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);
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
检索当前所选打印机设备的名称。
CString GetDeviceName() const;
当前所选打印机的名称。
在调用 DoModal
后可以调用此函数来检索当前所选打印机的名称,或者在调用 GetDefaults
后调用此函数来检索默认打印机的当前设备默认值。 将指向由 GetDeviceName
返回的 CString
对象的指针用作 CDC::CreateDC
调用中的 lpszDeviceName
值。
此代码片段演示用户的默认打印机名称及其连接到的端口,以及打印机使用的后台处理程序名称。 例如,该代码可能会显示一个消息框,其中指出“Your default printer is HP LaserJet IIIP on \\server\share using winspool.”。
CPrintDialog dlg(FALSE);
if (!dlg.GetDefaults())
AfxMessageBox(_T("You have no default printer!"));
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
检索 DEVMODE
结构。
LPDEVMODE GetDevMode() const;
DEVMODE
数据结构,其中包含有关打印驱动程序的设备初始化和环境的信息。 必须使用 Windows GlobalUnlock
函数解锁此结构占用的内存,Windows SDK 中对该函数进行了介绍。
在调用 DoModal
或 GetDefaults
后可以调用此函数来检索有关打印设备的信息。
请参阅 CPrintDialog::PrintCollate
的示例。
CPrintDialog::GetDriverName
检索当前所选打印机驱动程序的名称。
CString GetDriverName() const;
指定系统定义的驱动程序名称的 CString
。
在调用 DoModal
或 GetDefaults
后可以调用此函数来检索系统定义的打印机设备驱动程序的名称。 将指向由 GetDriverName
返回的 CString
对象的指针用作 CDC::CreateDC
调用中的 lpszDriverName
值。
请参阅 CPrintDialog::GetDeviceName
的示例。
CPrintDialog::GetFromPage
检索打印范围的起始页面。
int GetFromPage() const;
要打印的页面范围内的起始页码。
在调用 DoModal
后可以调用此函数来检索要打印的页面范围内的起始页码。
请参阅 CPrintDialog::m_pd
的示例。
CPrintDialog::GetPortName
检索当前所选打印机端口的名称。
CString GetPortName() const;
当前所选打印机端口的名称。
在调用 DoModal
或 GetDefaults
后可以调用此函数来检索当前所选打印机端口的名称。
请参阅 CPrintDialog::GetDeviceName 的示例。
CPrintDialog::GetPrinterDC
检索打印机设备上下文的句柄。
HDC GetPrinterDC() const;
如果成功,则返回打印机设备上下文的句柄;否则返回 NULL
。
如果 CPrintDialog
构造函数的 bPrintSetupOnly
参数为 FALSE
(指示显示“打印”对话框),则 GetPrinterDC
将返回打印机设备上下文的句柄。 使用完设备上下文后,必须调用 Windows DeleteDC
函数将其删除。
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
检索打印范围的结束页面。
int GetToPage() const;
要打印的页面范围内的结束页码。
在调用 DoModal
后可以调用此函数来检索要打印的页面范围内的结束页码。
请参阅 CPrintDialog::m_pd
的示例。
CPrintDialog::m_pd
一个结构,其成员存储对话框对象的特征。
PRINTDLG& m_pd;
构造 CPrintDialog
对象后,可以在调用 DoModal
成员函数之前使用 m_pd
来设置对话框的各个方面。 有关 m_pd
结构的详细信息,请参阅 Windows SDK 中的 PRINTDLG
。
如果直接修改 m_pd
数据成员,将会重写任何默认行为。
// 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
确定是否打印文档的所有页面。
BOOL PrintAll() const;
如果要打印文档中的所有页面,则返回非零值;否则返回 0。
调用 DoModal
后可以调用此函数来确定是否打印文档中的所有页面。
请参阅 CPrintDialog::m_pd
的示例。
CPrintDialog::PrintCollate
确定是否请求了已整理的副本。
BOOL PrintCollate() const;
如果用户在对话框中选中了整理复选框,则返回非零值;否则返回 0。
在调用 DoModal
后可以调用此函数来确定打印机是否应整理文档的所有打印副本。
// 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);
LPDEVMODE devmode = dlg.GetDevMode();
TRACE(_T("Number of copies printed = %d\n"), devmode->dmCopies);
CPrintDialog::PrintRange
确定是否只打印指定范围的页面。
BOOL PrintRange() const;
如果仅打印文档中某个范围内的页面,则返回非零值;否则返回 0。
调用 DoModal
后可以调用此函数来确定是否仅打印文档中某个范围内的页面。
请参阅 CPrintDialog::m_pd
的示例。
CPrintDialog::PrintSelection
确定是否只打印当前所选项。
BOOL PrintSelection() const;
如果仅打印选定项,则返回非零值;否则返回 0。
调用 DoModal
后可以调用此函数来确定是否仅打印当前选定项。
请参阅 CPrintDialog::m_pd
的示例。
MFC 示例 DIBLOOK
CCommonDialog
类
层次结构图
CPrintInfo
结构