CPr intDialog

CPrintDialog 类 封 装 了 W indows 通 用 打 印 对 话 框 为 打 印 提 供 的 服 务 。 通 用 打 印对 话 框 以 一 种 与 W indows 标 准 一 致 的 方 式 提 供 了 一 种 实 现 Print 和 Print Setup 对 话 框 的 简 单 方 法 。

如 果 你 愿 意 , 可 以 依 靠 框 架 来 为 应 用 程 序 处 理 许 多 打 印 处 理 方 面 的 事 情 。 在 这种 情 况 下 , 框 架 自 动 显 示 打 印 用 的 W indows 通 用 对 话 框 。 也 可 以 让 框 架 为 应 用程 序 处 理 打 印 操 作 , 但 用 自 己 的 打 印 对 话 框 来 加 载 通 用 的 Print 对 话 框 。

如 果 你 希 望 你 的 应 用 程 序 在 没 有 框 架 干 涉 的 情 况 下 来 处 理 打 印 , 则 可 用 所 提 供的 构 造 函 数 使 用 “ 原 样 ” CPrintDialog 类 , 或 者 从 CPrintDialog 派 生 自 己 的 对话 框 类 , 并 编 制 构 造 函 数 以 满 足 自 己 的 需 要 。 在 这 两 种 情 况 下 , 由 于 这 些 对 话框 都 是 从 类 CCommondDialog 类 派 生 而 来 的 , 因 此 它 们 的 行 为 将 都 类 似 于 标 准MFC 对 话 框 。

为 了 使 用 CPrintDialog 对 象 , 首 先 要 用 CPrintDialog 构 造 函 数 来 创 建 此 对 象 。

一 旦 已 经 构 造 了 对 话 框 , 你 可 以 设 置 或 修 改 m_pd 结 构 中 的 任 何 值 来 初 始 化 对话 框 的 控 件 的 值 。 m_pd 结 构 是 PRINTDLG 类 型 的 。 要 获 取 更 多 有 关 这 个 结 构的 信 息 , 请 参 见 W in32 SDK 文 档 。

如 果 你 在 m_pd 中 没 有 为 hDevMode 和 hDevName 成 员 提 供 自 己 的 句 柄 , 则 要确 保 在 应 用 程 序 使 用 完 此 对 话 框 时 , 调 用 W indows 函 数 G lobalFree 释 放 这 些 句柄 。当 使 用 由 CWinApp::OnFilePrintSetup 函 数 提 供 的 框 架 的 Print Setup 实 现 时 , 应 用 程 序 不 必 释 放 这 些 句 柄 。 这 些 句 柄 由 CWinApp 维 护 , 并 在 CWinApp 的析构 函 数 中 释 放 。 唯 一 必 要 的 是 在 独 立 使 用 CPrintDialog 时 , 释 放 这 些 句 柄 。

在 初 始 化 对 话 框 之 后 , 调 用 DoModal 成 员 函 数 来 显 示 这 个 对 话 框 , 并 允 许 用 户选 择 打 印 选 项 。 DoModal 返 回 用 户 选 择 的 是 O K ( IDOK ) 还 是 Cancel

( IDCANCEL ) 按 钮 。

如 果 DoModal 返 回 IDOK , 则 应 用 程 序 可 以 用 一 个 CPrintDialog 成 员 函 数 来 获

取 用 户 输 入 的 信 息 。

要 在 不 显 示 一 个 对 话 框 的 情 况 下 获 取 当 前 打 印 机 的 缺 省 状 态 , CPrintDialog::GetDefaults 成 员 函 数 是 一 个 有 用 的 函 数 。 这 个 成 员 函 数 不 需 要 用户 的 交 互 作 用 。

你 可 以 调 用 W indows 的 CommDlgExtendedError 函 数 来 确 定 在 对 话 框 的 初 始 化过 程 中 是 否 发 生 了 错 误 , 并 获 得 有 关 错 误 的 进 一 步 消 息 。 要 获 取 有 关 这 个 函 数的 更 多 信 息 , 请 参 见 Win32 SDK 文 档 。

CPrintDialog 依 赖 由 W indows 3.1 及 其 更 高 版 本 引 进 的 COMMDLG.DLL 文 档 。

要 定 制 此 对 话 框 , 先 从 CPrintDialog 派 生 一 个 新 类 , 提 供 一 个 定 制 对 话 框 模 板 , 并 增 加 一 个 处 理 来 自 扩 展 控 件 的 通 知 消 息 的 消 息 映 射 。 任 何 未 处 理 消 息 将 传 递给 基 类 处 理 。 不 需 要 定 制 hook 函 数 。

要 想 根 据 对 话 框 是 Print 还 是 Print Setup 来 不 同 地 处 理 同 一 条 消 息 , 应 用 程 序必 须 为 每 个 对 话 框 派 生 一 个 新 类 。 还 必 须 重 载 Windows 函 数 AttachOnSetup , 它 负 责 处 理 当 在 Print 对 话 框 内 选 择 Print Setup 按 钮 时 新 对 话 框 的 创 建 。

如 果 要 获 取 有 关 使 用 CPrintDialog 的 更 多 信 息 , 请 参 见 “ Visual C++ 程 序 员 指南 ” 中 的 文 章 “ 通 用 对 话 框 类 ” 。

#include <afxdlgs.h>

请 参 阅 CPrintInfo

CPrintDialog 类 成 员

Data M embers

m_pd 用 来 定 制 CPrintDialog 对 话 框 的 结 构

Constructio n

CPrintDialog 构 造 一 个 CPrintDialog 对 话 框

Operations

CreatePrinterDC 创 建 一 个 打 印 机 设 备 环 境 , 但 不 显 示 Print 对 话 框

DoModal 显 示 对 话 框 , 并 允 许 用 户 进 行 选 择

GetCopies 获 取 所 请 求 的 备 份 数 目

GetDefaults 检 取 设 备 缺 省 项 , 但 不 显 示 对 话 框GetDeviceName 检 取 当 前 所 选 打 印 设 备 的 名 字GetDevMode 检 取 DEVMODE 结 构GetDriverName 检 取 当 前 所 选 打 印 机 驱 动 器 的 名 字GetFormPage 检 取 打 印 范 围 的 起 始 页

GetToPage 检 取 打 印 范 围 的 结 束 页

GetPortName 检 取 当 前 所 选 打 印 机 端 口 名

GetPrinterDC 检 取 设 备 环 境 的 句 柄

PrintAll 确 定 是 否 请 求 打 印 文 档 的 所 有 页

PrintCollate 确 定 是 否 请 求 校 对 备 份

PrintRange 确 定 是 否 只 打 印 指 定 范 围 内 的 页

PrintSelection 确 定 是 否 只 打 印 当 前 所 选 项

成 员 函 数

CPrintDialog:: CPrintDialog

CPrintDialog( BOOL bPrintSetupOnly , DWORD dwFlags = PD_ALLPAGES | PD_USEDEVMODECOPIES | PD_NOPAGENUMS | PD_HIDEPRINTTOFILE |

PD_NOSELECTION, CWnd* pParentWnd = NULL );

参 数

bPrintSetupOnly

指 定 是 显 示 标 准 的 W indows Print 对 话 框 还 是 Print Setup 对 话 框 。 设 置 该参 数 为 TRUE , 则 显 示 标 准 W indows Print Setup 对 话 框 。 设 置 该 参 数 为FALSE , 则 显 示 W indows Print 对 话 框 。 如 果 bPrintSetupOnly 为 FALSE , 则 Print Setup 选 项 按 钮 仍 显 示 在 Print 对 话 框 中 。

dwFlags

一 个 或 多 个 标 志 , 可 用 于 定 制 对 话 框 的 设 置 , 这 些 标 志 可 以 用 位 或 O R 操 作 符 来 组 合 。 例 如 , PD_ALLPAGES 标 志 将 缺 省 打 印 范 围 设 置 为 文 档的 所 有 页 。 有 关 这 些 标 志 的 详 细 信 息 , 请 参 见 W indows SDK 中 的PRINTDLG 结 构 。

pParentWnd

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

说 明

此 函 数 用 来 构 造 一 个 W indows Print 或 Print Setup 对 话 框 。 这 个 成 员 函 数 只 构造 此 对 象 。 利 用 DoModal 成 员 函 数 可 显 示 此 对 话 框 。

值 得 注 意 的 是 , 当 你 将 bPrintSetupOnly 设 置 为 FALSE 来 调 用 构 造 函 数 时 , 会自 动 使 用 PD_RETURNDC 标志。在调用 DoModal , GetDefaults 或 GetPrinterDC

的 调 用 者 来 释 放 。

请 参 阅 CPrintDialog ::DoModa l, ::PrintDlg

CPrintDialog::CreatePrinterDC

HDC CreatePrinterDC();

返 回 值

返 回 一 个 新 创 建 的 打 印 机 设 备 环 境 的 句 柄 。

说 明

此 函 数 从 DEVMODE 和 DEVNAMES 结 构 创 建 一 个 打 印 机 设 备 环 境 ( D C )。这 个 D C 被 假 定 为 当 前 打 印 机 DC , 其 它 任 何 先 前 获 得 的 打 印 机 D C 都 必 须 由

请 参 阅 CPrintDialog::GetDevModel

CPrintDialog::DoModal

virtual int DoModal();

返 回 值

返 回 ID O K 或 IDCANCEL 。 如 果 返 回 的 是 IDCANCEL , 则 要 调 用 W indows CommDlgExtendedError 函 数 来 确 定 是 否 发 生 了 一 个 错 误 。 IDOK 和 IDCANCEL 都 是 常 量 , 它 表 明 用 户 选 择 的 是 O K 按 钮 还 是 Cancel 按 钮 。

说 明

此 函 数 用 来 显 示 W indows 的 通 用 打 印 对 话 框 , 并 允 许 用 户 选 择 各 个 打 印 选 项 ,

如 果 你 想 要 提 供 设 置 m_pd 结 构 的 成 员 来 初 始 化 各 个 打 印 对 话 框 选 项 , 则 应 当在 打 印 DoModal 之 前 , 但 在 对 话 框 对 象 构 造 之 后 进 行 。

在 调 用 了 DoModal 之 后 , 你 就 可 以 调 用 其 它 的 成 员 函 数 来 检 取 各 个 设 置 或 用 户在 对 话 框 中 输 入 的 信 息 了 。

请 参 阅 CPrintDialog:: CPrintDialog, CDialog::DoModal

CPrintDialog::GetCopies

int GetCopies() const;

返 回 值

返 回 所 请 求 的 备 份 数 目 。

说 明

在 调 用 DoModal 之 后 调 用 此 函 数 来 获 取 所 请 求 的 备 份 数 目 。

请 参 阅 CPrintDialog::PrintCollate

CPrintDialog::GetDefaults

BOOL GetDefaults();

返 回 值

如 果 函 数 成 功 则 返 回 非 零 值 ; 否 则 返 回 0 。

说 明

此 函 数 用 来 检 取 缺 省 打 印 机 的 设 备 缺 省 值 , 不 需 要 显 示 对 话 框 。 所 检 取 的 值 放在 m_pd 结 构 中 。

在 某 些 情 况 下 , 调 用 这 个 函 数 会 导 致 调 用 CPrintDialog 的 构 造 函 数 , 并 将bPrintSetupOnly 设 置 为 FALSE 。 在 这 些 情 况 下 , 一 个 打 印 机 D C 和 hDevNames 和 hDevMode ( m_pd 数 据 成 员 中 的 两 个 句 柄 ) 将 会 被 自 动 分 配 。

如 果 CPrintDialog 的 构 造 函 数 是 在 bPrintSetupOnly 设 置 为 FALSE 的 情 况 下 被调 用 的 ,则 此 函 数 将 不 仅 仅 是 把 hDevNames 和 hDevMod e( 在 m_pd.hDevNames 和 m_pd.hDevMode 中 ) 返 回 给 调 用 者 , 而 是 还 要 返 回 一 个 在 m_pd.hDC 中的打 印 机 DC 。 由 调 用 者 负 责 删 除 这 个 打 印 机 D C , 并 在 完 成 了 CPrintDialog 对象时 以 此 句 柄 调 用 W indows GlobalFree 函 数 。

请 参 阅 CPrintDialog::m_pd

CPrintDialog::GetDeviceName

CString GetDeviceName() const;

返 回 值

返 回 当 前 所 选 打 印 机 的 名 字 。

说 明

在 调 用 DoModal 之 后 调 用 此 函 数 来 检 取 当 前 所 选 打 印 机 的 名 字 。

请 参 阅 CPrintDialog::GetDriverNam e, CPrintDialog::GetDevMode , CPrintDialog::GetPortName

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

返 回 DEVMODE 数 据 结 构 , 该 结 构 包 含 了 有 关 设 备 初 始 化 和 打 印 机 驱 动 器 环

境 的 信 息 。 你 必 须 调 用 W indows GlobalUnlock 函 数 来 解 锁 这 个 结 构 所 占 的 内存 , 在 “ Platform SDK ” 中 有 关 于 这 个 函 数 的 描 述 。

说 明

在 调 用 DoModal 之 后 调 用 此 函 数 来 检 取 有 关 打 印 机 设 备 的 信 息 。

请 参 阅 CDC::GetDeviceCaps

CPrintDialog::GetDriverName CString GetDriverName() const; 返 回 值

返 回 当 前 所 选 的 打 印 机 设 备 驱 动 器 的 名 字 。

说 明

在 调 用 DoModal 之 后 调 用 此 函 数 来 获 取 当 前 所 选 打 印 机 设 备 驱 动 器 的 名 字 。

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

CPrintDialog::GetFromPage

int GetFromPage() const;

返 回 值

返 回 所 选 打 印 范 围 内 的 首 页 号 码 。

说 明

在 调 用 DoModal 之 后 调 用 此 函 数 来 检 取 所 选 打 印 范 围 内 的 首 页 号 码 。

请 参 阅 CPrintDialog::GetToPage , CPrintDialog::PrintRange

CPrintDialog::GetPortName CString GetPortName() const; 返 回 值

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

说 明

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

请 参 阅 CPrintDialog::GetDriverNam e, CPrintDialog::GetDeviceName

CPrintDialog::GetPrinterDC

HDC GetPrinterDC() const;

返 回 值

如 果 成 功 则 返 回 一 个 打 印 机 设 备 环 境 的 句 柄 ; 否 则 返 回 NULL 。

说 明

如 果 CPrintDialog 构 造 函 数 的 参 数 bPrintSetupOnly 是 FALS E( 表 明 显 示 的 是 Print 对 话 框 ) , 则 GetPrinterDC 返 回 一 个 打 印 机 设 备 环 境 句 柄 。 当 你 使 用 完 这 个 设备 环 境 时 , 你 必 须 调 用 W indows DeleteDC 函 数 来 删 除 它 。

CPrintDialog::GetToPage

int GetToPage() const;

返 回 所 选 打 印 范 围 内 的 结 束 页 号 码 。

说 明

在 调 用 DoModal 之 后 调 用 此 函 数 来 检 取 所 选 打 印 范 围 内 的 结 束 页 号 码 。

请 参 阅 CPrintDialog::GetFromPage, CPrintDialog::PrintRange

CPrintDialog::PrintAll BOOL PrintAll() const; 返 回 值

如 果 文 档 中 的 所 有 页 都 要 打 印 则 返 回 非 零 值 ; 否 则 返 回 0 。

在 调 用 DoModal 之 后 调 用 此 函 数 来 确 定 是 否 要 文 档 中 的 所 有 页 。

请 参 阅 CPrintDialog::PrintRange, CPrintDialog::PrintSelection

CPrintDialog::PrintCollate BOOL PrintCollate() const; 返 回 值

如 果 用 户 选 择 了 对 话 框 中 的 整 理 选 择 框 , 则 返 回 非 零 值 ; 否 则 返 回 0 。

说 明

在 调 用 DoModal 之 后 调 用 此 函 数 来 确 定 打 印 机 是 否 要 整 理 所 有 要 打 印 的 文 档 备份 。

请 参 阅 CPrintDialog::GetCopies

CPrintDialog::PrintRange BOOL PrintRange() const; 返 回 值

如 果 文 档 中 只 有 某 一 个 范 围 的 页 要 打 印 , 则 返 回 非 零 值 ; 否 则 返 回 0 。

说 明

在 调 用 DoModal 之 后 调 用 此 函 数 来 确 定 是 否 只 打 印 文 档 中 某 一 范 围 内 的 页 。

请 参 阅 CPrintDialog::PrintAll , CPrintDialog::PrintSelection , CPrintDialog::GetFromPage, CPrintDialog::GetToPage

CPrintDialog::PrintSelection BOOL PrintSelection() const; 返 回 值

如 果 只 要 打 印 所 选 的 项 , 则 返 回 非 零 值 ; 否 则 返 回 0 。

说 明

在 调 用 DoModal 之 后 调 用 此 函 数 来 确 定 是 否 只 要 打 印 当 前 所 选 的 项 。

请 参 阅 CPrintDialog::PrintRange, CPrintDialog::PrintAll

数 据 成 员

CPrintDialog::m_pd PRINTDLG& m_pd; 说 明

  • 个 结 构 , 它 的 成 员 保 存 了 对 话 框 对 象 的 特 征 。 在 构 造

    一 个 CPrintDialog 对 象之 后 , 在 调 用 DoModal 之 前 , 你 可 以 使 用 m_pd 来 设 置 对 话 框 的 各 个 方 面 。 有关 m_pd 结 构 的 更 多 信 息 , 请 参 见 W in32 SDK 文 档 。

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