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