“页面设置”对话框

显示允许用户设置打印页的以下属性的模式对话框:

  • 纸张类型 (信封、法律、信件等)
  • 纸张源 (手动进纸、拖拉机进纸、纸张送纸器等)
  • 页面方向 (纵向或横向)
  • 页边距的宽度

通过初始化 PAGESETUPDLG 结构并将该结构传递给 PageSetupDlg 函数,可以创建并显示“页面设置”对话框。 但是,对话框中显示的属性因打印机的功能而异。 下图显示了典型的 “页面设置 ”对话框。

页面设置对话框

如果用户单击“确定”按钮,在 PAGESETUPDLG 结构中设置各种成员以指定用户的选择后,PageSetupDlg 将返回 TRUEptPaperSizertMargin 成员包含用户指定的值。 hDevModehDevNames 成员包含 DEVMODEDEVNAMES 结构的全局内存句柄。 这些结构包含其他页面信息以及有关打印机的信息。 可以使用此信息准备要发送到所选打印机的输出。

如果用户取消“ 页面设置 ”对话框或发生错误, PageSetupDlg 将返回 FALSE。 若要确定错误的原因,请调用 CommDlgExtendedError 函数来检索扩展的错误值。

本部分讨论以下主题。

初始化“页面设置”对话框

默认情况下,“ 页面设置 ”对话框显示有关当前默认打印机的信息。 若要指示对话框显示有关特定打印机的信息,请设置 DEVMODEDEVNAMES 结构的成员,并将这些结构的全局内存句柄分配给 PAGESETUPDLG 中的相应成员。 如果指定当前未安装的打印机的名称,对话框将显示一条错误消息。 若要防止对话框显示错误消息,请使用 PSD_NOWARNING 值。 若要检索有关默认打印机的信息而不显示“ 页面设置 ”对话框,请使用 PSD_RETURNDEFAULT 值。

如果默认度量系统为英寸,则对话框使用千分之几英寸作为默认度量单位。 如果默认度量系统为公制,则对话框使用百分之几毫米作为默认度量单位。 若要替代默认度量单位,请在 PAGESETUPDLG 结构的 Flags 成员中设置 PSD_INHUNDREDTHSOFMILLIMETERSPSD_INTHOUSANDTHSOFINCHES 标志。

默认情况下,边距的初始值为 1 英寸。 如果设置 PSD_MARGINS 标志,对话框将显示 rtMargin 成员中指定的初始边距值。 用户可以为边距指定的默认最小值是打印机允许的最小边距。 如果设置 PSD_MINMARGINS 标志,对话框将强制实施 rtMinMargin 成员中指定的最小边距。

若要防止用户选择某些选项,请设置以下标志的任意组合以禁用相应的控件。

标志 含义
PSD_DISABLEMARGINS 禁用用户在其中输入边距设置的编辑控件。
PSD_DISABLEORIENTATION 禁用“ 纵向 ”和“ 横向 ”单选按钮。
PSD_DISABLEPAPER 禁用用于选择纸张大小和纸张来源的控件。
PSD_DISABLEPRINTER 禁用“ 打印机 ”按钮。

 

自定义“页面设置”对话框

你可以为“ 页面设置 ”对话框提供自定义模板,例如,如果想要包含应用程序独有的其他控件。 PageSetupDlg 函数使用自定义模板代替默认模板。

为“页面设置”对话框提供自定义模板

  1. 通过修改 Prnsetup.dlg 文件中指定的默认模板来创建自定义模板。 默认 页面设置 对话框模板中使用的控件标识符在 Dlgs.h 文件中定义。
  2. 使用 PAGESETUPDLG 结构启用模板,如下所示:
      • 如果自定义模板是应用程序或动态链接库中的资源,请在 Flags 成员中设置PSD_ENABLEPAGESETUPTEMPLATE标志。 使用 结构的 hInstancelpPageSetupTemplateName 成员标识模块和资源名称。

        -或-

      • 如果自定义模板已在内存中,请设置 PSD_ENABLEPAGESETUPTEMPLATEHANDLE 标志。 使用 hPageSetupTemplate 成员标识包含模板的内存对象。

若要筛选发送到对话框过程的消息,可以提供 PageSetupHook 挂钩过程。 如果使用自定义模板来定义其他控件,则必须提供 PageSetupHook 挂钩过程来处理控件的输入。 此外,可以提供 PagePaintHook 挂钩过程来自定义“ 页面设置 ”对话框显示的示例页的内容。 有关 PagePaintHook 挂钩过程的详细信息,请参阅 自定义示例页

启用 PageSetupHook 挂钩过程

  1. PAGESETUPDLG 结构的 Flags 成员中设置PSD_ENABLEPAGESETUPHOOK标志。
  2. lpfnPageSetupHook 成员中指定挂钩过程的地址。

处理 WM_INITDIALOG 消息后,对话框过程会将 WM_INITDIALOG 消息发送到 PageSetupHook 挂钩过程。 此消息的 lParam 参数是指向用于初始化对话框的 PAGESETUPDLG 结构的指针。

自定义示例页

页面设置 ”对话框包含示例页面的图像,该图像显示用户的选择如何影响打印输出的外观。 图像由一个矩形组成,该矩形表示所选纸张或信封类型,其中虚线矩形表示当前边距,部分 (希腊文文本) 字符显示文本在打印页上的外观。

调用 PageSetupDlg 函数时,可以提供 PagePaintHook 挂钩过程来自定义示例页面的外观。

启用 PagePaintHook 挂钩过程

  1. PAGESETUPDLG 结构的 Flags 成员中设置PSD_ENABLEPAGEPAINTHOOK标志。
  2. 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_PAGESETUPDLGWM_PSD_FULLPAGERECTWM_PSD_MINMARGINRECT) 对话框不会再发送任何消息,并且不会在示例页中绘制,直到系统下次需要重新绘制示例页为止。 如果挂钩过程对所有三条消息返回 FALSE ,则对话框将发送绘图序列的剩余消息。

如果挂钩过程为绘图序列中的任何剩余消息返回 TRUE ,则对话框不会绘制示例页的相应部分。 如果挂钩过程为这些消息中的任何一个返回 FALSE ,则对话框将绘制示例页的该部分。

若要防止对话框绘制示例页的内容,可以设置 PSD_DISABLEPAGEPAINTING 标志。 此标志不会影响 PagePaintHook 挂钩过程,该过程仍接收所有 WM_PSD_* 消息,并且可以绘制示例页面内容。