“页面设置”对话框
显示允许用户设置打印页的以下属性的模式对话框:
- 纸张类型 (信封、法律、信件等)
- 纸张源 (手动进纸、拖拉机进纸、纸张送纸器等)
- 页面方向 (纵向或横向)
- 页边距的宽度
通过初始化 PAGESETUPDLG 结构并将该结构传递给 PageSetupDlg 函数,可以创建并显示“页面设置”对话框。 但是,对话框中显示的属性因打印机的功能而异。 下图显示了典型的 “页面设置 ”对话框。
如果用户单击“确定”按钮,在 PAGESETUPDLG 结构中设置各种成员以指定用户的选择后,PageSetupDlg 将返回 TRUE。 ptPaperSize 和 rtMargin 成员包含用户指定的值。 hDevMode 和 hDevNames 成员包含 DEVMODE 和 DEVNAMES 结构的全局内存句柄。 这些结构包含其他页面信息以及有关打印机的信息。 可以使用此信息准备要发送到所选打印机的输出。
如果用户取消“ 页面设置 ”对话框或发生错误, PageSetupDlg 将返回 FALSE。 若要确定错误的原因,请调用 CommDlgExtendedError 函数来检索扩展的错误值。
本部分讨论以下主题。
初始化“页面设置”对话框
默认情况下,“ 页面设置 ”对话框显示有关当前默认打印机的信息。 若要指示对话框显示有关特定打印机的信息,请设置 DEVMODE 或 DEVNAMES 结构的成员,并将这些结构的全局内存句柄分配给 PAGESETUPDLG 中的相应成员。 如果指定当前未安装的打印机的名称,对话框将显示一条错误消息。 若要防止对话框显示错误消息,请使用 PSD_NOWARNING 值。 若要检索有关默认打印机的信息而不显示“ 页面设置 ”对话框,请使用 PSD_RETURNDEFAULT 值。
如果默认度量系统为英寸,则对话框使用千分之几英寸作为默认度量单位。 如果默认度量系统为公制,则对话框使用百分之几毫米作为默认度量单位。 若要替代默认度量单位,请在 PAGESETUPDLG 结构的 Flags 成员中设置 PSD_INHUNDREDTHSOFMILLIMETERS 或 PSD_INTHOUSANDTHSOFINCHES 标志。
默认情况下,边距的初始值为 1 英寸。 如果设置 PSD_MARGINS 标志,对话框将显示 rtMargin 成员中指定的初始边距值。 用户可以为边距指定的默认最小值是打印机允许的最小边距。 如果设置 PSD_MINMARGINS 标志,对话框将强制实施 rtMinMargin 成员中指定的最小边距。
若要防止用户选择某些选项,请设置以下标志的任意组合以禁用相应的控件。
标志 | 含义 |
---|---|
PSD_DISABLEMARGINS | 禁用用户在其中输入边距设置的编辑控件。 |
PSD_DISABLEORIENTATION | 禁用“ 纵向 ”和“ 横向 ”单选按钮。 |
PSD_DISABLEPAPER | 禁用用于选择纸张大小和纸张来源的控件。 |
PSD_DISABLEPRINTER | 禁用“ 打印机 ”按钮。 |
自定义“页面设置”对话框
你可以为“ 页面设置 ”对话框提供自定义模板,例如,如果想要包含应用程序独有的其他控件。 PageSetupDlg 函数使用自定义模板代替默认模板。
为“页面设置”对话框提供自定义模板
- 通过修改 Prnsetup.dlg 文件中指定的默认模板来创建自定义模板。 默认 页面设置 对话框模板中使用的控件标识符在 Dlgs.h 文件中定义。
- 使用 PAGESETUPDLG 结构启用模板,如下所示:
-
如果自定义模板是应用程序或动态链接库中的资源,请在 Flags 成员中设置PSD_ENABLEPAGESETUPTEMPLATE标志。 使用 结构的 hInstance 和 lpPageSetupTemplateName 成员标识模块和资源名称。
-或-
如果自定义模板已在内存中,请设置 PSD_ENABLEPAGESETUPTEMPLATEHANDLE 标志。 使用 hPageSetupTemplate 成员标识包含模板的内存对象。
-
若要筛选发送到对话框过程的消息,可以提供 PageSetupHook 挂钩过程。 如果使用自定义模板来定义其他控件,则必须提供 PageSetupHook 挂钩过程来处理控件的输入。 此外,可以提供 PagePaintHook 挂钩过程来自定义“ 页面设置 ”对话框显示的示例页的内容。 有关 PagePaintHook 挂钩过程的详细信息,请参阅 自定义示例页。
启用 PageSetupHook 挂钩过程
- 在 PAGESETUPDLG 结构的 Flags 成员中设置PSD_ENABLEPAGESETUPHOOK标志。
- 在 lpfnPageSetupHook 成员中指定挂钩过程的地址。
处理 WM_INITDIALOG 消息后,对话框过程会将 WM_INITDIALOG 消息发送到 PageSetupHook 挂钩过程。 此消息的 lParam 参数是指向用于初始化对话框的 PAGESETUPDLG 结构的指针。
自定义示例页
“ 页面设置 ”对话框包含示例页面的图像,该图像显示用户的选择如何影响打印输出的外观。 图像由一个矩形组成,该矩形表示所选纸张或信封类型,其中虚线矩形表示当前边距,部分 (希腊文文本) 字符显示文本在打印页上的外观。
调用 PageSetupDlg 函数时,可以提供 PagePaintHook 挂钩过程来自定义示例页面的外观。
启用 PagePaintHook 挂钩过程
- 在 PAGESETUPDLG 结构的 Flags 成员中设置PSD_ENABLEPAGEPAINTHOOK标志。
- 在 lpfnPagePaintHook 成员中指定挂钩过程的地址。
每当对话框即将绘制示例页的内容时,挂钩过程将按照消息的列出顺序接收以下消息。
消息 | 含义 |
---|---|
WM_PSD_PAGESETUPDLG | 对话框即将绘制示例页。 挂钩过程可以使用此消息来准备绘制示例页的内容。 |
WM_PSD_FULLPAGERECT | 对话框即将绘制示例页。 此消息指定示例页的边框。 |
WM_PSD_MINMARGINRECT | 对话框即将绘制示例页。 此消息指定边距矩形。 |
WM_PSD_MARGINRECT | 对话框即将绘制边距矩形。 |
WM_PSD_GREEKTEXTRECT | 对话框即将在边距矩形内绘制希腊文本。 |
WM_PSD_ENVSTAMPRECT | 对话框即将在信封示例页的信封标记矩形中绘制。 此消息仅为信封发送。 |
WM_PSD_YAFULLPAGERECT | 对话框将绘制信封示例页的寄信人地址部分。 此消息针对信封和其他纸张大小发送。 |
如果挂钩过程对绘图序列的前三条消息中的任何一个返回 TRUE , (WM_PSD_PAGESETUPDLG、 WM_PSD_FULLPAGERECT或 WM_PSD_MINMARGINRECT) 对话框不会再发送任何消息,并且不会在示例页中绘制,直到系统下次需要重新绘制示例页为止。 如果挂钩过程对所有三条消息返回 FALSE ,则对话框将发送绘图序列的剩余消息。
如果挂钩过程为绘图序列中的任何剩余消息返回 TRUE ,则对话框不会绘制示例页的相应部分。 如果挂钩过程为这些消息中的任何一个返回 FALSE ,则对话框将绘制示例页的该部分。
若要防止对话框绘制示例页的内容,可以设置 PSD_DISABLEPAGEPAINTING 标志。 此标志不会影响 PagePaintHook 挂钩过程,该过程仍接收所有 WM_PSD_* 消息,并且可以绘制示例页面内容。