CPageSetupDia log

CPageSetupDialog 类 封 装 了 W indows 通 用 OLE Page SetUp 对 话 框 提 供 的 服 务 , 并 且 还 添 加 了 对 设 置 和 修 改 打 印 页 边 距 的 支 持 。这 个 类 是 设 计 来 代 替 Print Setup

对 话 框 的 。

要 使 用 一 个 CPageSetupDialog 对 象 , 首 先 用 CPageSetupDialog 构 造 函 数 创 建 对象 。 一 旦 已 经 构 造 了 对 话 框 , 就 可 以 设 置 或 修 改 数 据 成 员 m_psd 的 任 意 值 来 初始 化 对 话 框 的 控 件 。 m_psd 结 构 是 PAGESETUPDLG 类 型 。 W in32 SDK 文 档 中的 “ 设 置 打 印 页 ” 主 题 中 给 出 了 初 始 化 这 个 结 构 的 例 子 。

在 初 始 化 对 话 框 控 件 之 后 , 调 用 DoModal 成 员 函 数 来 显 示 对 话 框 , 并 允 许 用 户选 择 打 印 选 项 。 DoModal 返 回 值 说 明 了 用 户 是 选 择 了 O K ( IDOK ) 还 是 选 择 了Cancel( IDCANCEL ) 按 钮 。

如 果 DoModal 返 回 的 是 IDOK ,你 就 可 以 用 几 个 CPageSetupDialog 的 成 员 函 数 , 或 访 问 m_psd 数 据 成 员 来 获 取 用 户 输 入 的 信 息 。

注 意 在 通 用 的 OLE Page Setup 对 话 框 被 取 消 后 , 用 户 作 出 的 任 何 改 变

都 不 会 被 框 架 保 存 。 应 用 程 序 必 须 自 己 负 责 来 将 对 话 框 中 的 所 有 值 保 存到 一 个 永 久 的 地 方 , 比 如 应 用 程 序 文 档 或 应 用 程 序 类 的 成 员 。

#include <afxdlgs.h>

CPageSetupDialog 类 成 员

Attributes

CreatePrinterDC 为 打 印 创 建 一 个 设 备 环 境

GetDeviceName 返 回 打 印 机 的 设 备 名 称

GetDevMode 返 回 打 印 机 的 当 前 DEVMODE

GetDiverName 返 回 打 印 机 使 用 的 驱 动 程 序

GetMargins 返 回 打 印 机 当 前 的 页 边 距 设 置

GetPortName 返 回 输 出 端 口 名

GetPaperSize 返 回 打 印 机 的 纸 张 大 小

Construction

CPageSetupDialog 构 造 一 个 CPageSetupDialog 对 象

Data Members

m_psd 一 个 用 来 定 制 CPageSetupDialog 对 象 的 结 构

Operation s DoModal 显 示 对 话 框 并 让 用 户 做 一 次 选 择

Overridables

OnDrawPage 框 架 调 用 来 给 出 一 个 打 印 页 的 屏 幕 图 像 。

PreDrawPage 在 给 出 一 个 打 印 页 的 屏 幕 图 像 之 前 由 框 架 调 用

成 员 函 数

CPageSetupDialog:: CPageSetupDialog

CPageSetupDialog( DWORD dwFlags = PSD_MARGINS | PSD_INWININIINTLMEASURE,

CWnd* pParentWnd = NULL );

参 数

dwFlags

你 可 以 使 用 一 个 或 多 个 标 志 来 定 制 对 话 框 的 设 置 。 这 些 值 可 以 用 位 或 操作 符 来 组 合 。 这 些 值 的 意 义 如 下 所 示 :

  • PSD_DEFAULTMINMARGINS 将 允 许 的 页 边 距 的 最 小 宽 度 设 置 得

    与打 印 机 允 许 的 最 小 宽 度 一 样 。 如 果 PSD_MARGINS 和PSD_MINMARGINS 标 志 也 被 指 定 了 , 则 这 个 标 志 可 以 忽 略 。

  • PSD_INWININIINTLMEASURE 不 执 行 。

  • PSD_MINMARGINS 使 系 统 使 用 在 rtMinMargin 成 员 中 指 定 的 值

    作 为允 许 的 左 、 上 、 右 和 下 边 距 的 最 小 宽 度 。 系 统 将 禁 止 用 户 输 入 的 宽 度小 于 指 定 的 最 小 值 。 如 果 PSD_MINMARGINS 没 有 被 指 定 , 则 系 统 将允 许 的 最 小 宽 度 设 置 得 与 打 印 机 允 许 的 一 样 。

  • PSD_MARGINS 激 活 边 距 控 制 区 域 。

  • PSD_INTHOUSANDTHSOFINCHES 使 对 话 框 的 单 元 按 1/1000 英 寸来 测

    量 。

  • PSD_INTHUNDREDTHSOFMILLIMETERS 使 对 话 框 的 单 元 按 1/100

毫 米 来 测 量 。

  • PSD _ D ISABLEMARGINS 使 边 距 对 话 框 控 件 无 效 。

  • PSD _ D ISABLEPRINTER 使 Printer 按 钮 无 效 。

  • PSD _ NOWARNING 当 没 有 缺 省 的 打 印 机 时 , 禁 止 显 示 警 告

    消 息 。

  • PSD _ D ISABLEORIENTATION 使 页 面 方 向 控 件 无 效 。

  • PSD _ RETURNDEFAULT 不 显 示 对 话 框 就 使 CPageSetupDialog 返

    回DEVMODE 和 DEVNAMES 结 构 , 这 两 个 结 构 是 为 系 统 缺 省 的 打 印 机而 初 始 化 的 。 它 假 设 hDevNames 和 hDevMode 都 是 NULL ; 否 则 , 函

数 就 返 回 一 个 错 误 。 如 果 系 统 的 缺 省 打 印 机 是 由 一 个 老 的 打 印 机 驱 动程 序( 早 于 W indows 3.0 版 本 )驱 动 的 ,则 只 返 回 hDevNames ;hDevMode 是 NULL 。

  • PSD _ D ISABLEPAPER 使 页 面 选 择 控 件 无 效 。

  • PSD _ SHOWHELP 使 对 话 框 显 示 Help 按 钮 。 如 果 这 个 标 志 被

    指 定 , 则 hwndOwner 成 员 必 须 是 NULL 。

  • PSD _ ENABLEPAGESETUPHOOK 使 hook 函 数 在 lpfnSetupHook 中被 指 定

  • PSD _ ENABLEPAGESETUPTEMPLATE 使 操 作 系 统 用 由 hInstance 和

lpSetupTem- plateName 标 识 的 对 话 框 模 板 来 创 建 对 话 框 。

  • PSD _ ENABLEPAGESETUPTEMPLATEHANDLE 表 明 hInstance 标 识一 个 包

    含 预 先 载 入 的 对 话 框 模 板 的 数 据 块 。 如 果 此 标 志 被 指 定 , 则 系

统 忽 略 lpSetupTemplate- Nam e。

  • PSD _ ENABLEPAGEPAINTHOOK 使 在 lpfnPagePaintHook 中 指 定 的钩 子

    函 数 有 效 。

  • PSD _ D ISABLEPAGEPAINTING 使 对 话 框 的 绘 画 区 无 效 。

pParentWnd

指 向 对 话 框 的 父 或 属 主 的 指 针 。

说 明

此 函 数 用 来 构 造 一 个 CPageSetupDialog 对 象 。 使 用 DoModal 函 数 来 显 示 此 对话 框 。

请 参 阅 CPrintDialog , CPageSetupDialog

CPageSetupDialog::CreatePrinterDC

HDC CreatePrinterDC();

返 回 值

返 回 新 创 建 的 打 印 机 设 备 环 境 ( DC ) 的 句 柄 。

说 明

从 DEVMODE 和 DEVNAMES 结 构 创 建 一 个 打 印 机 设 备 环 境 。

请 参 阅 CPageSetupDialog::GetDevMode , CPageSetupDialog::GetDeviceNam e, CPageSetupDialog::GetD riverName

CPageSetupDialog::DoModal

virtual int DoModal();

返 回 值

返 回 IDOK 或 IDCANCEL 。 如 果 返 回 的 是 IDCANCEL , 则 调 用 W indows CommDlgExtended - Error 函 数 来 确 定 是 否 发 生 了 一 个 错 误 。

ID O K 和 IDCANCEL 都 是 常 量 ,它 们 用 来 表 明 用 户 选 择 的 是 O K 按 钮 还 是 Cancel

按 钮 。

说 明

此 函 数 用 来 显 示 W indows 通 用 OLE Page Setup 对 话 框 , 并 允 许 用 户 选 择 不 同的 打 印 设 置 选 项 , 比 如 打 印 边 距 、 页 面 大 小 、 页 面 方 向 , 和 打 印 机 目 标 。 另 外 , 用 户 页 可 以 访 问 如 网 络 位 置 和 所 选 打 印 机 的 属 性 等 打 印 机 设 置 选 项 。

如 果 你 希 望 通 过 设 置 m_psd 结 构 的 成 员 来 初 始 化 不 同 的 Page Setup 对 话 框 选

项 , 你 必 须 在 调 用 DoModal 之 前 和 构 造 此 对 话 框 之 后 进 行 。 在 调 用 DoModal

之 后 , 调 用 其 它 的 成 员 函 数 来 获 取 用 户 在 对 话 框 中 输 入 的 设 置 和 信 息 。

如 果 你 想 传 送 用 户 输 入 的 当 前 设 置 , 请 调 用 C W inApp::SelectPrinte r。 这 个 函 数读 取 来 自 CPageSetupDialog 对 象 的 信 息 并 初 始 化 和 选 择 一 个 具 有 适 当 属 性 的 新打 印 机 DC 。

AfxGetApp() – >SelectPrinter(dlg.m_psd.hDevNames, dlg.m_psd.hDevMode );

请 参 阅 CPageSetupDialog::m_psd

CPageSetupDialog::GetDeviceName

CString GetDeviceName() const;

返 回 值

由 CPageSetupDialog 对 象 使 用 的 设 备 名 称 。

说 明

在 DoModal 之 后 调 用 此 函 数 来 获 取 当 前 选 择 的 打 印 机 名 称 。

CPageSetupDialog::GetDevMode LPDEVMODE GetDevMode() const; 返 回 值

返 回 DEVMODE 数 据 结 构 , 该 结 构 包 含 了 有 关 设 备 初 始 化 和 打 印 机 驱 动 程 序环 境 的 信 息 。 你 必 须 用 W indows GlobalUnlock 函 数 解 锁 这 个 结 构 所 占 的 内 存 , 这 在 “ Platform SDK ” 中 有 描 述 。

说 明

在 DoModal 之 后 调 用 此 函 数 来 获 取 有 关 CPageSetupDialog 对 象 的 打 印 机 设 备

环 境 的 信 息 。CPageSetupDialog::GetDriverName CString GetDriverNam e()Cons t;

返 回 值

返 回 当 前 选 择 的 打 印 机 设 备 驱 动 程 序 的 名 称 。

说 明

在 DoModal 之 后 调 用 此 函 数 来 获 取 当 前 选 择 的 打 印 机 设 备 驱 动 程 序 的 名 称 。

请 参 阅 CPageSetupDialog::GetDeviceNam e, CPageSetupDialog::GetDevMode, CPageSetupDialog::GetPortName

CPageSetupDialog::GetMargins

void GetMargins( LPRECT lpRectMargins , LPRECT lpRectMinMargins ) cons t;

参 数

lpRectMargins

指 向 RECT 结 构 或 CRect 结 构 的 指 针 , 这 两 个 结 构 描 述 ( 用 1/1000 英 寸或 1/100 毫 米 ) 了 当 前 选 择 的 打 印 机 的 打 印 边 距 。 如 果 对 这 个 矩 形 并 不感 兴 趣 , 可 以 将 此 参 数 设 置 为 NULL 。

lpRectMinMargins

指 向 RECT 结 构 或 CRect 结 构 的 指 针 , 这 两 个 结 构 描 述 ( 用 1/1000 英 寸或 1/100 毫 米 ) 了 当 前 选 择 的 打 印 机 的 最 小 打 印 边 距 。 如 果 对 这 个 矩 形并 不 感 兴 趣 , 可 以 将 此 参 数 设 置 为 NUL L 。

说 明

在 DoModal 之 后 调 用 这 个 函 数 来 获 取 打 印 机 设 备 驱 动 程 序 的 边 距 。

CPageSetupDialog::GetPaperSize

CSize GetPaperSize() cons t;

返 回 值

  • 个 包 含 打 印 纸 张 尺 寸 ( 以 1/1000 英 寸 或 1/100 毫 米 为 单

    位 ) 的 CSize 对 象 。

说 明

此 函 数 用 来 获 取 打 印 纸 张 的 尺 寸 。

CPageSetupDialog::GetPortName

CString GetPortName() const;

返 回 值

返 回 当 前 所 选 打 印 端 口 的 名 称 。

说 明

在 DoModal 之 后 调 用 此 函 数 来 获 取 当 前 所 选 打 印 端 口 的 名 称 。

请 参 阅 CPageSetupDialog ::GetDeviceNam e, CPageSetupDialog ::GetDriverName

CPageSetupDialog::OnDrawPage

virtual UINT OnDrawPage( CDC* pDC , U INT nMessage , LPRECT lpRect );

返 回 值

如 果 被 处 理 则 返 回 非 零 值 ; 否 则 返 回 0 。

参 数

pDC

指 向 打 印 机 设 备 环 境 的 指 针 。

nMessage

指 明 一 个 消 息 , 表 示 当 前 绘 画 页 面 的 区 域 。 可 以 是 下 列 值 之 一 :

  • WM_PSD_FULLPAGERECT 整 个 页 面 区 。

  • WM_PSD_MINMARGINRECT 当 前 最 小 边 距 。

  • WM_PSD_MARGINRECT 当 前 边 距 。

  • WM_PSD_GREEKTEXTRECT 页 面 的 内 容 。

  • WM_PSD_ENVSTAMPRECT 为 贴 邮 票 而 保 留 的 区 域 。

  • WM_PSD_YAFULLPAGERECT 用 于 返 回 地 址 的 区 域 。 这 个 区 域

    延伸 到 示 例 页 区 域 的 边 界 。

lpRect

指 向 一 个 CRect 或 RECT 对 象 的 指 针 , 这 两 个 对 象 包 含 了 绘 画 区 的 坐 标 。

说 明

由 框 架 调 用 来 画 一 个 打 印 页 面 的 屏 幕 图 像 。 然 后 这 个 图 像 作 为 通 用 OLE Page Setup 对 话 框 的 一 部 分 来 显 示 。 函 数 的 缺 省 实 现 是 画 一 个 文 本 页 的 图 像 。

重 载 这 个 函 数 可 以 定 制 是 画 图 像 的 指 定 区 域 , 还 是 画 整 个 图 像 。 你 可 以 使 用

switch 和 case 语 句 来 检 查 nMessage 的 值 。 例 如 , 为 了 定 制 获 取 表 示 图 像 的 内容 , 你 可 以 使 用 下 面 的 例 子 代 码 :

Switch( nType )

{

case WM_PSD_GREEKTEXTRECT:

DrawMyImage( pDC, lpRect); //画 我 的 指 定 图 像 。

return 1; default:

return ::Draw(CDC* pDC, UINT nDrawType, LPRECT lpRect);

} ;

注 意 : 你 不 需 要 处 理 nMessage 的 每 一 个 取 值 。 可 以 选 择 处 理 图 像 的 某 一部 分 , 某 几 个 部 分 或 整 个 区 域 。

请 参 阅 CPageSetupDialog::PreDrawPage

CPageSetupDialog::PreDrawPage

virtual UINT PreDrawPage( W O R D wPape r , W O R D wFlags ,LPPAGESETUPDLG

pPSD );

返 回 值

如 果 被 处 理 则 返 回 非 零 值 ; 否 则 返 回 0 。

参 数

wPaper

指 定 一 个 用 来 表 明 纸 张 尺 寸 的 值 。 这 个 值 可 以 是 一 个 DMPAPER_ 值 , 在

DEVMODE 结 构 的 描 述 中 有 这 些 值 的 列 表 。

wFlags

表 明 纸 张 或 信 封 的 方 向 ,以 及 表 明 打 印 机 是 点 阵 式 的 还 是 HPPC L( Hewlett Packard Printer Control Language ) 设 备 。 此 参 数 可 以 是 下 列 值 之 一 :

  • 0x001 纸 张 是 横 向 放 置 ( 点 阵 式 ) 。

  • 0x003 纸 张 是 横 向 放 置 ( HPPC L )。

  • 0x005 纸 张 是 纵 向 放 置 ( 点 阵 式 ) 。

  • 0x007 纸 张 是 纵 向 放 置 ( HPPC L )。

  • 0x00b 信 封 是 横 向 放 置 ( HPPC L )。

  • 0x00d 信 封 是 纵 向 放 置 ( 点 阵 式 ) 。

  • 0x019 信 封 是 横 向 放 置 ( HPPC L )。

  • 0x01f 信 封 是 纵 向 放 置 ( 点 阵 式 ) 。

pPSD

指 向 一 个 PAGESETUPDLG 结 构 的 纸 张 。 要 获 取 有 关 这 个 结 构 的 更 多 消息 , 请 参 见 W in32 文 档 。

说 明

在 画 用 于 页 面 的 屏 幕 图 像 之 前 由 框 架 调 用 。 重 载 这 个 函 数 来 定 制 图 像 的 绘 画 。如 果 你 重 载 这 个 函 数 并 返 回 TRUE , 则 你 必 须 画 整 个 图 像 。 如 果 你 重 载 这 个 函

请 参 阅 CPageSetupDialog::OnDrawPage

数 据 成 员

CPageSetupDialog::m_psd

说 明

一 个 PAGESETUPDLG 类 型 的 结 构 , 它 的 成 员 保 存 了 对 话 框 对 象 的 特 征 。 在 构造 了 一 个 CPageSetupDialog 对 象 之 后 ,在 调 用 DoModal 之 前 ,你 可 以 使 用 m_psd 来 设 置 对 话 框 的 不 同 方 面 。

如 果 你 直 接 修 改 m_psd 数 据 成 员 , 则 你 将 重 载 任 何 缺 省 的 行 为 。