“打印”对话框
“ 打印 ”对话框允许用户选择特定打印作业的选项。 例如,用户可以指定要使用的打印机、要打印的页面范围和份数。
可以使用 PrintDlgEx 函数显示“打印属性表”,该页包含类似于“打印”对话框的控件的“常规”页。 属性表还可以在 “常规 ”页之后具有其他特定于应用程序的属性页和特定于驱动程序的属性页。
可以通过初始化 PRINTDLG 结构并将结构传递给 PrintDlg 函数来创建并显示“打印”对话框。
下图显示了典型的“ 打印 ”对话框。
如果用户单击“ 确定” 按钮, PrintDlg 将返回 TRUE ,并使用 PRINTDLG 结构返回有关用户选择的信息。 例如, hDevMode 和 hDevNames 成员通常返回 和 DEVNAMES 结构的全局内存句柄。 可以使用这些结构中的信息为所选打印机创建设备上下文或信息上下文。
如果用户取消“ 打印 ”对话框或发生错误, PrintDlg 返回 FALSE。 可以使用 CommDlgExtendedError 函数检索扩展错误值来确定错误原因。
“ 打印 ”对话框包含一组单选按钮的 “打印范围 ”,这些按钮指示用户是要打印所有页面、一系列页面还是仅打印所选文本。 在调用 PrintDlg 之前,可以设置 PD_ALLPAGES、 PD_SELECTION或 PD_PAGENUMS 标志之一,以指示最初选择哪个按钮。 当 PrintDlg 返回 TRUE 时,函数将设置其中一个标志来指示用户的选择。 如果设置了PD_PAGENUMS,PRINTDLG 结构的 nFromPage 和 nToPage 成员包含用户指定的起始页和结束页。 若要禁用 “页面” 单选按钮及其关联的“ 发件人 ”和“ 要编辑” 控件,请设置 PD_NOPAGENUMS 标志。 若要禁用 “选择” 单选按钮,请设置 PD_NOSELECTION 标志。
该对话框包含一个编辑控件,用户可以在其中键入要打印的副本数。 如果 PRINTDLG 结构的 hDevMode 成员为非 NULL,则结构的 dmCopies 成员指定此编辑控件的初始值。 如果 hDevMode 为 NULL,PRINTDLG 结构的 nCopies 成员将指定初始值。 当 PrintDlg 返回时,nCopies 通常指示用户指定的副本数。 但是,如果在创建对话框时设置PD_USEDEVMODECOPIESANDCOLLATE标志,nCopies 在返回时始终设置为 1,DEVMODE 的 dmCopies 成员指示要打印的副本数。
“整理检查框指示在打印多个副本时用户是否要整理页面。 如果选择了“整理检查”框,则会设置PD_COLLATE标志。 如果应用程序不支持多个副本或模拟排序规则,请在 PRINTDLG 结构的 Flags 成员中设置PD_USEDEVMODECOPIESANDCOLLATE标志。 这将禁用“排序检查”框和“份数”编辑控件,除非打印机驱动程序支持多个副本和排序规则。
“打印到文件检查”框指示用户是否要将输出发送到文件而不是打印机。 可以设置PD_PRINTTOFILE标志,以便最初选择检查框。 若要隐藏检查框,请设置PD_HIDEPRINTTOFILE标志。 若要禁用它,请设置 PD_DISABLEPRINTTOFILE 标志。 如果用户选择“打印到文件”选项,PrintDlg 将设置PD_PRINTTOFILE标志,并在 DEVNAMES 结构的 wOutputOffset 成员指示的偏移量处返回“FILE:”。 调用 函数以启动打印操作时,请在结构的 lpszOutput 成员中指定此“FILE:”字符串。 指定此字符串会导致打印子系统向用户查询输出文件的名称。
默认情况下,“ 打印 ”对话框最初显示有关当前默认打印机的信息。 若要显示另一台已安装打印机的信息,请初始化 和 DEVNAMES 结构,并将结构的全局内存句柄分配给 hDevMode 和 hDevNames 成员。 在 DEVMODE 结构的 dmDeviceName 成员和 DEVNAMES 结构的 wDriverOffset 成员中指定的设备名称必须标识也列在Win.ini文件的 [Devices] 部分中的打印机设备。 如果未列出设备, PrintDlg 将返回错误。
可以通过在 PRINTDLG 结构的 Flags 成员中设置 PD_RETURNDC 或 PD_RETURNIC 标志来指示 PrintDlg 为打印机创建设备上下文或信息上下文。 函数返回 hDC 成员中的设备上下文或信息上下文的句柄。 如果使用 PD_RETURNDC 标志,则可以使用设备上下文为打印机生成输出。
若要在不显示“ 打印 ”对话框的情况下检索有关默认打印机的信息,请设置 PD_RETURNDEFAULT 标志。 在这种情况下, PrintDlg 在将 hDevMode 和 hDevNames 成员设置为包含信息的结构句柄后立即返回。
默认情况下, PrintDlg 在发生错误时显示消息框。 例如,如果未安装打印机,函数会显示错误消息。 若要防止函数显示这些警告消息,请设置 PD_NOWARNING 标志。
本节将讨论以下主题。
自定义“打印”对话框
你可以为“ 打印 ”对话框提供自定义模板,例如,如果要包含应用程序唯一的其他控件。 PrintDlg 函数使用自定义模板代替默认模板。
若要为“ 打印 ”对话框提供自定义模板,请执行以下操作:
- 通过修改 Prnsetup.dlg 文件中指定的默认模板创建自定义模板。 默认打印对话框模板中使用的控件标识符在 Dlgs.h 文件中定义。
- 使用 PRINTDLG 结构启用模板,如下所示:
如果自定义模板是应用程序或动态链接库中的资源,请在 Flags 成员中设置PD_ENABLEPRINTTEMPLATE标志。 使用结构的 hInstance 和 lpPrintTemplateName 成员标识模块和资源名称。
-或-
如果自定义模板已在内存中,请设置 PD_ENABLEPRINTTEMPLATEHANDLE 标志。 使用 hPrintTemplate 成员标识包含模板的内存对象。
可以为“打印”对话框提供 PrintHookProc 挂钩过程。 挂钩过程可以处理发送到对话框的消息。 它还可以将消息发送到对话框。 如果使用自定义模板来定义其他控件,则必须提供挂钩过程来处理控件的输入。
为“ 打印 ”对话框启用挂钩过程:
- 在 PRINTDLG 结构的 Flags 成员中设置PD_ENABLEPRINTHOOK标志。
- 在 lpfnPrintHook 成员中指定挂钩过程的地址。
在处理 其WM_INITDIALOG 消息后,对话框过程会将 WM_INITDIALOG 消息发送到挂钩过程。 此消息的 lParam 参数是指向用于初始化对话框的 PRINTDLG 结构的指针。
“打印设置”对话框
可以通过在调用 PrintDlg 函数时设置 PD_PRINTSETUP 标志来创建和显示“打印设置”对话框。 但是,“ 打印设置 ”对话框已被 “页面设置 ”对话框取代,不应在新应用程序中使用。
以下标志仅适用于“ 打印设置 ”对话框:
- PD_ENABLESETUPHOOK
- PD_ENABLESETUPTEMPLATE
- PD_ENABLESETUPTEMPLATEHANDLE