PRINTDLG结构包含PrintDlg函数用于初始化“打印公共”对话框的信息。在用户关闭对话框后,系统会在此结构中返回有关用户定义的打印选择的信息。
typedef struct tagPD { // pd
DWORD lStructSize;
HWND hwndOwner;
HANDLE hDevMode;
HANDLE hDevNames;
HDC hDC;
DWORD Flags;
WORD nFromPage;
WORD nToPage;
WORD nMinPage;
WORD nMaxPage;
WORD nCopies;
HINSTANCE hInstance;
DWORD lCustData;
LPPRINTHOOKPROC lpfnPrintHook;
LPSETUPHOOKPROC lpfnSetupHook;
LPCTSTR lpPrintTemplateName;
LPCTSTR lpSetupTemplateName;
HANDLE hPrintTemplate;
HANDLE hSetupTemplate;
} PRINTDLG;
会员
lStructSize
指定结构大小(以字节为单位)。
hwndOwner
标识拥有该对话框的窗口。该成员可以是任何有效的窗口句柄,如果对话框没有所有者,它可以为NULL。
hDevMode
标识包含DEVMODE结构的可移动全局内存对象。在调用PrintDlg函数之前,结构成员可能包含用于初始化对话框控件的数据。当PrintDlg返回时,结构成员指定对话框控件的状态。
如果使用该结构初始化对话框控件,则必须分配空间并创建DEVMODE结构。(你应该分配一个可移动的内存块)
如果不使用结构初始化对话框控件,hDevMode可能为NULL。在这种情况下,PrintDlg为结构分配内存,初始化其成员,并返回一个标识它的句柄。
如果指定打印机的设备驱动程序不支持扩展设备模式,PrintDlg返回时,hDevMode为NULL。
如果设备名称(dmDeviceName DEVMODE结构的成员指定)没有出现在WIN.INI的[devices]部分,PrintDlg将返回一个错误。
因为这个结构是一个可移动的全局内存对象,所以在PrintDlg的执行过程中hDevMode的值可能会改变。
有关系统如何解决由hDevMode和hDevNames成员指定的值之间的可能数据冲突的讨论,请参阅以下备注部分。
hDevNames
标识包含DEVNAMES结构的可移动全局内存对象。此结构包含三个指定驱动程序名称,打印机名称和输出端口名称的字符串。在调用PrintDlg之前,结构成员包含用于初始化对话框控件的字符串。当PrintDlg返回时,结构成员包含用户键入的字符串。调用应用程序使用这些字符串来创建设备上下文或信息上下文。
如果使用结构初始化对话框控件,则必须为其分配空间并创建DEVNAMES结构。(你应该分配一个可移动的全局内存块)
如果不使用结构初始化对话框控件,hDevNames可能为NULL。在这种情况下,PrintDlg为结构分配内存,初始化其成员(通过使用DEVMODE结构中指定的打印机名称),并返回一个标识它的句柄。当PrintDlg在DEVNAMES结构中初始化成员时,使用WIN.INI的[devices]部分中显示的第一个端口名称。例如,如果[devices]部分中出现以下字符串,则该函数将使用“LPT1:”作为端口名称:
PCL / HP LaserJet=HPPCL,LPT1:,LPT2:
如果hDevMode和hDevNames均为NULL,PrintDlg将使用当前的默认打印机初始化hDevNames.
因为这个结构是一个可移动的全局内存对象,所以在PrintDlg的执行过程中hDevNames的值可能会改变。
有关系统如何解决由hDevNames和hDevMode指定的值之间可能的数据冲突的讨论,请参阅本主题后面的备注部分。
hDC
根据旗成员是否指定PD_RETURNDC或PC_RETURNIC标志,标识设备上下文或信息上下文。如果没有指定标志,则该成员的值未定义。如果指定了两个标志,则PD_RETURNDC具有优先级。
旗
一组位标记,可用于初始化“打印公共”对话框。当对话框返回时,它设置这些标志以指示用户的输入。该成员可以是以下标志的组合:
PD_ALLPAGES | |||||
默认标志,表示最初选择了全部单选按钮。该标志用作占位符来指示未指定PD_PAGENUMS和PD_SELECTION标志。 | |||||
PD_COLLATE | |||||
在输入上设置时,在“分页”复选框中放置一个复选框。当PrintDlg函数返回时,此标志指示用户选择了“逐份打印”选项,打印机驱动程序不支持排序规则。在这种情况下,应用程序必须提供整理。如果PrintDlg在返回时设置PD_COLLATE标志,则DEVMODE结构的dmCollat?? ??ê成员未定义。 | |||||
PD_DISABLEPRINTTOFILE | |||||
禁用打印到文件复选框。 | |||||
PD_ENABLEPRINTHOOK | |||||
启用lpfnPrintHook成员中指定的挂接过程。这将启用打印对话框的挂钩过程。 | |||||
PD_ENABLEPRINTTEMPLATE | |||||
表示的hInstance和lpPrintTemplateName成员指定一个对话框模板,以替代“打印”对话框的默认模板。 | |||||
PD_ENABLEPRINTTEMPLATEHANDLE | |||||
表示hPrintTemplate成员标识包含预加载对话框模板的数据块。系统使用此模板代替“打印”对话框的默认模板。如果指定了此标志,系统将忽略lpPrintTemplateName成员。 | |||||
PD_ENABLESETUPHOOK | |||||
启用lpfnSetupHook成员中指定的挂接过程。这将启用打印设置对话框的挂钩过程。 | |||||
PD_ENABLESETUPTEMPLATE | |||||
表示的hInstance和lpSetupTemplateName成员指定一个对话框模板,用于替代“打印设置”对话框的默认模板。 | |||||
PD_ENABLESETUPTEMPLATEHANDLE | |||||
表示hSetupTemplate成员标识包含预加载对话框模板的数据块。系统使用此模板代替“打印设置”对话框的默认模板。如果指定了此标志,系统将忽略lpSetupTemplateName成员。 | |||||
PD_HIDEPRINTTOFILE | |||||
隐藏打印到文件复选框。 | |||||
PD_NOPAGENUMS | |||||
禁用页面单选按钮和关联的编辑控件。 | |||||
PD_NOSELECTION | |||||
禁用选择单选按钮。 | |||||
PD_NOWARNING | |||||
当没有默认打印机时,防止显示警告信息。 | |||||
PD_PAGENUMS | |||||
当创建对话框时,使页面单选按钮处于选定状态。当PrintDlg返回时,如果“页面”单选按钮处于选中状态,则此标志置位。 | |||||
PD_PRINTSETUP | |||||
导致系统显示“打印设置”对话框,而不是“打印”对话框。 | |||||
PD_PRINTTOFILE | |||||
创建对话框时,勾选“打印到文件”复选框。 当PrintDlg返回时,如果勾选此复选框,则此标志置位。在这种情况下,由DEVNAMES结构wOutputOffset成员指定的偏移量包含字符串“FILE:”。当您调用StartDoc功能开始打印操作时,请在DOCINFO结构的lpszOutput成员中指定此“FILE:”字符串。指定此字符串会导致打印子系统向用户查询输出文件的名称。 | |||||
PD_RETURNDC | |||||
导致PrintDlg返回与用户在对话框中进行的选择相匹配的设备上下文。设备上下文在hDC中返回。 | |||||
PD_RETURNDEFAULT | |||||
PrintDlg功能不会显示对话框。而是将hDevNames和hDevMode成员设置为为系统默认打印机初始化的DEVMODE和DEVNAMES结构的句柄。hDevNames??或hDevMode必须为NULL,否则PrintDlg返回错误。如果系统默认打印机由旧的打印机驱动程序支持(早于Windows 3.0版),则只返回hDevNames hDevMode为NULL。 | |||||
PD_RETURNIC | |||||
与PD_RETURNDC标志类似,除了该标志返回信息上下文而不是设备上下文。如果未指定PD_RETURNDC或PD_RETURNIC,则hDC在输出上未定义。 | |||||
PD_SELECTION | |||||
当创建对话框时,使选择单选按钮处于选定状态。当PrintDlg返回时,如果选择了“选择”单选按钮,则会指定此标志。如果既不设置PD_PAGENUMS也不设置PD_SELECTION,则选择“全部”单选按钮。 | |||||
PD_SHOWHELP | |||||
导致对话框显示帮助按钮。hwndOwner成员必须指定窗口以接收当用户单击“帮助”按钮时对话框发送的HELPMSGSTRING注册消息。 | |||||
PD_USEDEVMODECOPIES | |||||
与PD_USEDEVMODECOPIESANDCOLLATE相同 | |||||
PD_USEDEVMODECOPIESANDCOLLATE | |||||
如果打印机驱动程序不支持多个副本,则禁用“副本”编辑控件,如果打印机驱动程序不支持排序规则,则禁用“逐份打印”复选框。如果未指定此标志,PrintDlg将为DEVMODE结构的dmCopies和dmCollat?? ??ê成员存储份数和整理选项的用户选择。 | |||||
如果未设置此标志,则如果驱动程序支持多个副本和排序规则,则会在DEVMODE结构中返回副本和整理信息。如果驱动程序不支持多个副本和排序规则,则会在PRINTDLG结构中返回该信息。这意味着应用程序只需要查看NCOPIES和PD_COLLATE来确定需要渲染的副本数,以及是否需要打印它们进行整理。 |
nFromPage
指定起始页面编辑控件的初始值。当PrintDlg函数返回时,nFromPage指定用户指定的起始页面。该值仅在指定了PD_PAGENUMS标志时有效。
nToPage
指定结束页面编辑控件的初始值。当PrintDlg函数返回时,nToPage指定用户指定的结束页面。该值仅在指定了PD_PAGENUMS标志时有效。
nMinPage
指定“发件人”和“到”页面编辑控件中指定的页面范围的最小值。
nMaxPage
指定“发件人”和“到”页面编辑控件中指定的页面范围的最大值。
NCOPIES
如果hDevMode为NULL,则包含Copies编辑控件的初始份数;否则,DEVMODE结构的dmCopies成员包含初始值。当PrintDlg返回时,此成员包含要打印的实际份数。如果打印机驱动程序不支持多个副本,则此值可能大于1,并且应用程序必须打印所有请求的副本。如果在旗成员中设置了PD_USEDEVMODECOPIESANDCOLLATE值,返回时NCOPIES始终设置为1,DEVMODE中的dmCopies成员将收到要打印的实际份数。
的hInstance
如果在旗成员中设置了PD_ENABLEPRINTTEMPLATE或PD_ENABLESETUPTEMPLATE标志,则的hInstance是包含由lpPrintTemplateName或lpSetupTemplateName成员命名的对话框模板的应用程序或模块实例的句柄。
lCustData
指定系统传递给由lpfnPrintHook或lpfnSetupHook成员标识的挂接过程的应用程序定义数据。当系统向挂钩过程发送WM_INITDIALOG消息时,消息的【lParam的】参数是指向创建对话框时指定的PRINTDLG结构的指针。挂钩过程可以使用此指针获取lCustData值。
lpfnPrintHook
指向可以处理打印对话框的消息的PrintHookProc挂接过程。除非在旗成员中设置了PD_ENABLEPRINTHOOK标志,否则该成员将被忽略。
lpfnSetupHook
指向可以处理打印设置对话框的消息的SetupHookProc挂接过程。除非在旗成员中设置了PD_ENABLESETUPHOOK标志,否则此成员将被忽略。
lpPrintTemplateName
指向由的hInstance成员标识的模块中指定对话框模板资源的以null结尾的字符串。此模板代替标准打印对话框模板。除非在旗成员中设置了PD_ENABLEPRINTTEMPLATE标志,否则此成员将被忽略。
lpSetupTemplateName
指向由的hInstance成员标识的模块中的对话框模板资源的以null结尾的字符串。此模板代替标准的“打印设置”对话框模板。除非在旗成员中设置了PD_ENABLESETUPTEMPLATE标志,否则此成员将被忽略。
hPrintTemplate
如果在旗成员中设置了PD_ENABLEPRINTTEMPLATEHANDLE标志,则hPrintTemplate是包含对话框模板的内存对象的句柄。此模板代替标准打印对话框模板。
hSetupTemplate
如果在旗成员中设置了PD_ENABLESETUPTEMPLATEHANDLE标志,则hSetupTemplate是包含对话框模板的内存对象的句柄。此模板代替标准的“打印设置”对话框模板。
备注
hDevNames和hDevMode指定的值之间可能存在数据冲突,因为DEVNAMES结构的wDeviceOffset成员应与DEVMODE结构的dmDeviceName成员相同。如果不是,系统将使用wDeviceOffset的值来解决数据冲突。
如果用户在公共打印对话框中检查“逐份打印”复选框,但打印机驱动程序不支持排序规则,PRINTDLG PRINTDLG结构返回的PRINTDLG结构的旗成员包括PD_COLLATE标志。此外,由hDevMode成员标识的DEVMODE结构的dmCollat?? ??ê成员设置为COLLATE_TRUE。如果设置了PD_COLLATE标志,则应用程序必须模拟排序规则。
如果设置了PD_USEDEVMODECOPIESANDCOLLATE标志,则如果打印机驱动程序不支持排序规则,则“逐份打印”复选框将显示为灰色。这确保用户只能选择一个副本,并且NCOPIES将是一个副本。如果司机确实支持多份,dmCopies将包含份数,NCOPIES将是一份。
在输入PrintDlg时,NCOPIES结构的NCOPIES成员指定未设置PD_USEDEVMODECOPIESANDCOLLATE的副本数。从PrintDlg退出时,如果打印机驱动程序不支持多个副本,则NCOPIES包含副本数。否则设置为1。如果从PrintDlg退出时NCOPIES大于一个,则应用程序必须打印文档的多个副本。
也可以看看
CreateDC, CreateIC, PrintDlg, DEVMODE, DEVNAMES, WM_INITDIALOG