CPen

CPen 类 封 装 了 Windows 图 形 设 备 接 口 ( GD I ) 画 笔 。

#include <afxwin.h>

请 参 阅 CBrush

Construction

Cpen 构 造 一 个 CPen 对象

Initialization

CreatePen 用 指 定 风 格 、 宽 度 和 画 刷 属 性 创 建 一 个 逻 辑 装 饰画 笔 或 几 何 画 笔 , 并 将 它 连 接 到 CPen 对 象 上

CreatePenIndirect 用 在 一 个 LOGPEN 结 构 中 给 出 的 风 格 、 宽 度 和 颜

色 来 创 建 一 只 画 笔 , 并 将 它 连 接 到 CPen 对 象 上

Operations

FromHandle 当 给 予 一 个 W indows HPEN 时 ,返 回 一 个 指 向 CPen

对 象 的 指 针

Attributes

Operator HPEN 返 回 连 接 到 CPen 对 象 上 的 W indows 句 柄

Attributes

GetLogPen 获 取 一 个 LOGPEN 基 础 结 构

GetExtLogPen 获 取 一 个 EXTLOGPEN 基 础 结 构

CPen::CPen

CPen();

CPen( int nPenStyle , int nWidth , COLORREF crColor ); throw( CResourceException );

CPen( int nPenStyle , int nWidth , const LOGBRUSH* pLogBrush , int nStyleCount = 0,

const DWORD* lpStyle = NULL ); throw( CResourceException );

参 数

nPenStyle

指 定 画 笔 的 风 格 。 在 构 造 函 数 的 第 一 个 版 本 中 , 此 参 数 可 以 取 下 列 值 之一 :

  • PS_SOLID

创 建 一 支 实 线 画 笔 。

  • PS_DASH

创 建 一 支 虚 线 画 笔 。 只 有 当 画 笔 宽 度 为

1

或 更 小 ( 以 设 备

单 位 计 算 ) 时 才 有 效 。

  • PS_DOT 创 建 一 支 点 线 画 笔 。 只 有 当 画 笔 宽 度 为 1 或 更

    小 ( 以 设备 单 位 计 算 ) 时 才 有 效 。

  • PS_DASHDOT 创 建 一 支 虚 线 和 点 交 替 的 画 笔 。 只 有 当 画 笔

    宽 度 为 1

或 更 小 ( 以 设 备 单 位 计 算 ) 时 才 有 效 。

  • PS_DASHDOTDOT 创 建 一 支 虚 线 和 两 点 交 替 的 画 笔 。 只 有 当

    画 笔 宽度为 1 或 更 小 ( 以 设 备 单 位 计 算 ) 时 才 有 效 。

  • PS_NULL 创 建 一 支 空 画 笔 。

  • PS_INSIDEFRAME 创 建 一 支 画 笔 , 该 画 笔 在 W indows GDI 输 出

    函数 所 产 生 的 封 闭 形 状 的 框 架 内 画 线 , 此 输 出 函 数 指 定 一 个 限 定 矩 形( 例

如, Ellipse , Rectangle , RoundRec t, Pie 和 Chord 成 员 函 数 ) , 当 此风 格 用 于 没 有 指 定 限 定 矩 形 的 W indows GDI 输 出 函 数 ( 例 如 LineTo 成 员 函 数 ) 时 , 此 画 笔 的 绘 制 区 域 不 受 框 架 的 限 制 。

第 二 种 版 本 的 CP en 构 造 器 指 明 了 类 型 、 风 格 、 尾 帽 和 连 接 等 属 性 组 合 。来 自 每 个 类 别 的 值 应 使 用 位 操 作 符 ( 1 ) 组 合 起 来 , 笔 的 风 格 可 以 是 下 列之 一 :

  • PS_GEOMETRIC 创 建 一 支 几 何 画 笔 。

  • PS_COSMETIC 创 建 一 支 装 饰 画 笔 。

CPen 构 造 函 数 的 第 二 个 版 本 为 nPe n Style 添 加 了 下 列 一 些 画 笔 风 格 :

  • PS_ALTERNATE 创 建 一 支 交 替 设 置 像 素 的 画 笔 ( 此 风 格 只

    用 于 装 饰画 笔 ) 。

  • PS_USERSTYLE 创 建 一 支 使 用 用 户 提 供 的 风 格 数 组 的 画 笔

尾 帽 可 以 是 下 列 值 之 一 :

  • PS_ENDCAP_ROUND 尾 帽 是 圆 的 。

  • PS_ENDCAP_SQUARE 尾 帽 是 方 的 。

  • PS_ENDCAP_FLAT 尾 帽 是 平 面 的 。连 接 可 以 是 下 列 值 之 一

  • PS_JOIN _BEVEL 连 接 是 斜 截 式 的 。

  • PS_JOIN_MITER 当 连 接 在 ::SetMiterLimit 函 数 所 设 置 的 当 前

    限 制 之内 时 , 连 接 是 斜 接 式 的 。 如 果 连 接 超 出 这 个 限 制 则 成 为 斜 截 式 的 。

  • PS_JOIN_ROUND 连 接 是 圆 的 。

nWidth

指 定 画 笔 的 宽 度 。

  • 对 于 构 造 函 数 的 第 一 个 版 本 来 说 , 如 果 这 个 值 是 0 ,

    则 不 管 是 什 么 映

射 方 式 , 以 设 备 单 位 计 算 的 宽 度 总 是 一 个 像 素 。

  • 对 于 构 造 函 数 的 第 二 个 版 本 来 说 , 如 果 nPenStyle

    PS_GEOMETRIC , 则 宽 度 以 逻 辑 单 位 给 出 。 如 果 nPenStyle 是 PS_COSMETIC , 则 宽 度 必须 设 置 为 1 。

crColor

包 含 了 画 笔 的 RGB 值 。

pLogBrush

指 向 一 个 LOGBRUSH 结 构 。 如 果 nPenStyle 是 PS_COSMETIC , 则 此LOGBRUSH 结 构 的 lbColor 成 员 指 定 画 笔 的 颜 色 , 此 LOGBRUSH 结构的 lbStyle 成 员 必 须 设 置 为 BS_SOLID 。 如 果 nPenStyle

PS_GEOMETRIC , 则 此 结 构 的 所 有 成 员 都 必 须 用 于 指 定 画 笔 画 刷 属 性 。

nStyleCount

指 定 lpStyle 数 组 的 长 度 ( 以 双 字 为 单 位 ) 。 如 果 nPenStyle 不 是

PS_USERSTYLE , 这 个 值 必 须 是 零 。

lpStyle

指 向 一 个 双 字 值 的 数 组 。 第 一 个 值 指 定 一 个 用 户 定 义 的 风 格 中 第 一 段 虚

线 的 长 度 , 第 二 个 值 指 定 第 一 段 空 白 的 长 度 , 如 此 等 等 。 如 果 nPenStyle

不 是 PS_USERSTYLE , 则 这 个 指 针 必 须 为 NULL 。

说 明

如 果 你 使 用 的 是 没 有 参 数 的 构 造 函 数 , 你 就 必 须 用 CreatePen, CreatePenIndirect 或 CreateStockObject 成 员 函 数 来 初 始 化 所 生 成 的 CPen 对 象 。 如 果 你 使 用 的 是带 参 数 的 构 造 函 数 , 则 不 再 需 要 进 一 步 的 初 始 化 。 如 果 有 错 误 发 生 , 则 带 参 数的 构 造 函 数 可 能 会 抛 出 一 个 异 常 , 但 是 不 带 参 数 的 构 造 函 数 则 总 是 会 成 功 。

请 参 阅 CPen::CreatePen , CPen::CreatePenIndirect ,

CGdiObject::CreateStockObject

CPen::CreatePen

BOOL CreatePen( int nPenStyle , int nWidth , COLORREF cfColor ); BOOL CreatePen( int nPenStyle , intz , const LOGBRUSH* pLogBrush ,

int nStyleCount = 0, const DWORD* lpStyle = NULL );

返 回 值

如 果 成 功 则 返 回 非 零 值 或 逻 辑 画 笔 的 句 柄 ; 否 则 返 回 0 。

参 数

nPenStyle

指 定 画 笔 的 风 格 。其 可 能 取 值 的 列 表 ,请 参 见 CPen 构 造 函 数 中 的 nPenStyle

参 数 。

nWidth

指 定 画 笔 的 宽 度 。

  • 对于 CreatePen 的 第 一 个 版 本 来 说 , 如 果 这 个 值 为 0 , 则

    不 管 是 什 么 映射 模 式 , 以 设 备 单 位 表 示 的 宽 度 总 是 一 个 像 素 。

  • 对于 CreatePen 的 第 二 个 版 本 , 如 果 nPenStyle 是 PS_GEOMETRIC

    , 则 宽 度 以 逻 辑 单 位 给 出 。 如 果 nPenStyle 是 PS_COSMETIC , 则 宽 度 必须 设 置 为 1 。

crColor

包 含 画 笔 的 一 个 RGB 颜 色 。

pLogBrush

指 向 一 个 LOGBRUSH 结 构 。 如 果 nPenStyle 是 PS_COSMETIC , 则 此LOGBRUSH 结 构 的 lbColor 成 员 指 定 画 笔 的 颜 色 , 此 LOGBRUSH 结构的 lbStyle 成 员 必 须 设 置 为 BS_SOLED 。 如 果 nPenStyle 为PS_GEOMET R IC , 则 此 结 构 的 所 有 成 员 都 必 须 用 于 指 定 画 笔 画 刷 属 性 。

nStyleCount

指 定 lpStyle 数 组 的 长 度 ( 以 双 字 为 单 位 ) 。 如 果 nPenStyle 不 是

PS_USERSTYLE , 这 个 值 必 须 是 零 。

lpStyle

指 向 一 个 双 字 值 的 数 组 。 第 一 个 值 指 定 一 个 用 户 定 义 的 风 格 中 第 一 段 虚

线 的 长 度 , 第 二 个 值 指 定 第 一 段 空 白 的 长 度 , 如 此 等 等 。 如 果 nPenStyle

不 是 PS_USERSTYLE , 则 这 个 指 针 必 须 为 NULL 。

说 明

CreatePen 的 第 一 个 版 本 用 指 定 的 风 格 、 宽 度 和 颜 色 来 初 始 化 一 支 画 笔 。 此 画 笔以 后 可 选 作 为 任 何 设 备 环 境 的 当 前 画 笔 。

宽 度 大 于 1 个 像 素 的 画 笔 总 是 具 有 PS_NULL ,PS_SOLED 或 PS_INSIDEFRAME

风 格 。

如 果 画 笔 具 有 PS_INSIDEFRAME 风 格 和 某 一 不 匹 配 逻 辑 调 色 板 中 颜 色 的 颜色 , 则 此 画 笔 用 一 个 混 合 色 来 进 行 绘 制 。 PS_SOLID 画 笔 风 格 不 能 用 一 个 混 合色 来 创 建 一 支 画 笔 。 当 画 笔 的 宽 度 小 于 或 等 于 1 时 , PS_INSIDEFRAME 风 格等 同 于 PS_SOLID 风 格 。

CreatePen 的 第 二 个 版 本 初 始 化 一 支 具 有 指 定 的 风 格 、 宽 度 和 刷 子 属 性 的 逻 辑 装饰 画 笔 或 几 何 画 笔 。 一 支 装 饰 画 笔 的 宽 度 总 是 1 ; 几 何 画 笔 的 宽 度 总 是 由 世 界单 位 指 定 。 当 应 用 程 序 创 建 了 一 支 逻 辑 画 笔 之 后 , 它 可 通 过 调 用CDC ::SelectObject 函 数 来 将 此 画 笔 选 入 一 个 设 备 环 境 中 。 当 一 支 画 笔 被 选 入 一个 设 备 环 境 之 后 , 它 就 可 以 用 于 画 直 线 或 曲 线 。

  • 如 果 nPenStyle 为 PS_COSMETIC 和 PS_USERSTYLE , 则 lpStyle

    数 组 中 的项 指 定 风 格 单 位 中 虚 线 和 空 白 的 长 度 。 一 个 风 格 单 位 由 使 用 此 画 笔 画 线 的设 备 定 义 。

  • 如 果 nPenStyle 为 PS_GEOMETRIC 和 PS_USERSTYLE , 则 lpStyle

    数 组 中的 项 指 定 虚 线 和 空 白 的 长 度 ( 用 逻 辑 单 位 表 示 ) 。

  • 如 果 nPenStyle 为 PS_ALTERNATE , 则 忽 略 风 格 单 位 而 交 替

    设 置 像 素 。

当 一 个 应 用 程 序 不 再 需 要 一 支 给 定 的 画 笔 时 ,它 将 调 用 CGdiObject::DeleteObject 成 员 函 数 或 销 毁 CPen 对 象 , 以 使 资 源 不 再 使 用 。 当 一 支 画 笔 被 选 入 一 个 设 备环 境 后 , 应 用 程 序 就 不 能 删 除 这 支 画 笔 了 。

请 参 阅 CPen::CreatePenIndirec t, CPen::CPen , CGdiObject::DeleteObjec t, LOGBRUSH

CPen::CreatePenIndirect

BOOL CreatePenIndirect( LPLOGPEN lpLogPen );

返 回 值

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

参 数

lpLogPen

指向 Windows LOGPEN 结 构 , 此 结 构 包 含 了 此 画 笔 的 信 息 。

说 明

此 函 数 初 始 化 一 支 画 笔 , 此 画 笔 具 有 lp L ogPen 所 指 向 的 结 构 中 给 定 的 风 格 、 宽度 和 颜 色 。

宽 度 大 于 1 个 像 素 的 画 笔 总 是 具 有 PS_NULL ,PS_SOLID 或 PS_INSIDEFRAME

风 格 。

如 果 画 笔 具 有 PS_INSIDEFRAME 风 格 和 某 种 不 匹 配 逻 辑 调 色 板 中 颜 色 的 颜色 , 则 画 笔 用 一 支 混 合 色 来 绘 制 。 如 果 画 笔 宽 度 小 于 或 等 于 1 , 则PS_INSIDEFRAME 风 格 等 同 于 PS_SOLID 风 格 。

请 参 阅 CPen::CreatePen , CPen::CPen

CPen::FormHandle

static CPen* PASCAL FromHandle( HPEN hPen );

返 回 值

如 果 成 功 则 返 回 一 个 指 向 CPen 对 象 的 指 针 ; 否 则 返 回 NULL 。

参 数

hPen

Windows GDI 画 笔 的 HPEN 句 柄 。

说 明

当 给 予 一 个 W indows GDI 画 笔 对 象 时 , 此 函 数 返 回 指 向 一 个 CPen 对 象 的 指 针 。如 果 此 句 柄 没 有 连 接 一 个 CPen 对 象 ,则 将 创 建 一 个 临 时 CPen 对 象 ,并 将 此 CPen 对 象 连 接 到 此 HPEN 句 柄 上 。 这 个 临 时 CPen 对 象 只 能 有 效 到 下 次 应 用 程 序 的事 件 循 环 有 空 闲 时 间 时 , 到 那 时 所 有 临 时 图 形 对 象 都 将 被 删 除 。 也 就 是 说 , 临时 对 象 仅 在 处 理 一 条 Windows 消 息 的 期 间 有 效 。

CPen::GetExtLogPen

int GetExtLogPen( EXTLOGPEN* pLogPen );

返 回 值

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

参 数

pLogPen

指 向 一 个 EXTLOGPEN 结 构 , 此 结 构 包 含 此 画 笔 的 消 息 。

说 明

此 函 数 用 来 获 取 一 个 EXTLOGPEN 基 础 结 构 。 该 EXTLOGPEN 结 构 定 义 了 画笔 的 风 格 、 宽 度 和 刷 子 属 性 。 例 如 , 调 用 GetExtLogPen 来 匹 配 一 支 画 笔 的 特别 的 风 格 。

参 见“ W in32 SDK 程 序 员 参 考 ” 中 的 下 列 主 题 , 可 以 获 取 有 关 画 笔 属 性 的 信 息 :

  • GetObject

  • EXTLOGPEN

  • LOGPEN

  • ExtCreatePen

示 例

下 面 的 例 子 代 码 演 示 了 调 用 GetExtLogPen 来 获 取 一 支 画 笔 的 属 性 , 然 后 创 建一 支 新 的 、 具 有 相 同 颜 色 的 装 饰 画 笔 。

EXTLOGPEN extlogpen; penExisting.GetExtLogPen( &extlogpen ); CPen penOther;

LOGBRUSH LogBrush = { extlogpen.elpBrushStyle,extlogpen.elpColor, extlogpen.elpHatch } ;

penOther.CreatePen( PS_COSMETIC, 1, &LogBrush );

请 参 阅 CPen::GetLogPen , CPen::CreatePen

CPen::GetLogPen

int GetLogPen( LOGPEN* pLogPen );

返 回 值

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

参 数

pLogPen

指 向 一 个 包 含 画 笔 信 息 的 LOGPEN 结 构 。

说 明

此 函 数 用 来 获 取 一 个 LOGPEN 基 础 结 构 。 该 LOGPEN 结 构 定 义 了 画 笔 的 风 格 、宽 度 和 画 笔 模 式 。

例 如 , 调 用 GetLogPen 来 匹 配 一 支 画 笔 的 特 别 风 格 。

参 见“ W in32 SDK 程 序 员 参 考 ” 中 的 下 列 主 题 , 可 以 获 取 有 关 画 笔 属 性 的 信 息 :

  • GetObject

  • LOGPEN

示 例

下 面 的 例 子 代 码 演 示 了 调 用 GetLogPen 来 获 取 一 支 画 笔 的 特 征 , 然 后 创 建 一 支新 的 、 具 有 相 同 颜 色 的 装 饰 画 笔 。

LOGPEN logpen; penExisting.GetLogPen( &logpen );

CPen penOther( PS_SOLID, 0, lo g pen.l o pnColor );

请 参 阅 CPen::GetExtLogPen

CPen::operator HPEN operator HPEN() const; 返 回 值

如 果 成 功 , 则 返 回 一 个 CPen 对 象 所 代 表 的 W indows GDI 对 象 句 柄 ; 否 则 返 回

0 。

说 明

此 操 作 符 用 来 获 取 连 接 到 CPen 对 象 上 的 Windows GDI 句 柄 。 此 操 作 符 是 一 个强 制 转 换 操 作 符 , 它 支 持 直 接 使 用 一 个 HPEN 对 象 。

要 获 取 更 多 有 关 使 用 图 形 对 象 的 信 息 , 请 参 见 “ Win32 SDK 程 序 员 参 考 ” 中 的文 章 “ 图 形 对 象 ” 。