在VC中实现特性表

发表于:2007-07-04来源:作者:点击数: 标签:
特 性 表 Windows 95 以 及Windows NT 4.0 较 之 以 前 的Windows 操 作 系 统 增 加 了 许 多 先 进 特 性, 特 性 表 就 是 其 中 之 一。 大 家 熟 知 的 特 性 表 实 例 是Windows 中 屏 幕 显 示 属 性 的 设 置, 它 包 括 背 景、 屏 幕 保 护 程 序
 

  特 性 表

  Windows 95 以 及Windows NT 4.0 较 之 以 前 的Windows 操 作 系 统 增 加 了 许 多 先 进 特 性, 特 性 表 就 是 其 中 之 一。 大 家 熟 知 的 特 性 表 实 例 是Windows 中 屏 幕 显 示 属 性 的 设 置, 它 包 括 背 景、 屏 幕 保 护 程 序、 外 观、 设 置 等 特 性 页。 使 用 特 性 表 的 最 大 好 处 在 于 它 可 以 非 常 方 便 地 将 大 量 的 信 息 提 供 给 用 户, 从 而 有 效 地 节 省 屏 幕 空 间, 因 为 它 是 包 含 若 干 个 其 他 对 话 框 的 对 话 框。

  创 建 特 性 表

  Visual C + + 中MFC 提 供 了 两 个 类:CPropertySheet 和CPropertyPage, 使 编 程 人 员 可 以 轻 松 地 在 程 序 中 实 现 特 性 表。 以VC4.0 为 例, 在 程 序 中 建 立 一 个 特 性 表 的 步 骤 如 下:

  1. 在Microsoft Developer Studio 中 选 择 菜 单Insert /Component..., 屏 幕 上 会 弹 出 一 个“Component Gallery” 对 话 框( 注 意: 此 对 话 框 本 身 就 是 特 性 表 的 一 种)。

  2. 在 对 话 框 中 的Microsoft 页 选 中Property Sheet, 单 击“Insert”, 屏 幕 上 出 现 创 建 特 性 表 的 向 导。

  3. 在 向 导 的 第 一 步 选 择“Property Sheet”; 第 二 步 选 择 是 否 生 成 无 模 式 的 特 性 表 以 及 是 否 要 在 特 性 表 中 支 持 预 览 功 能; 第 三 步 选 择 创 建 特 性 表 函 数 作 为 哪 一 个 类 的 成 员 函 数( 即 在 哪 一 个 类 中 启 用 特 性 表); 第 四 步 设 置 特 性 表 所 包 含 的 页 数; 第 五 步 为 新 生 成 的 类( 特 性 表 本 身 及 其 包 含 的 每 一 页 都 是 一 个 单 独 的 类) 确 定 名 称。 这 样, 一 个 特 性 表 就 生 成 了。Visual C + + 已 经 编 写 了 基 本 的 源 代 码。

  4. 在 自 动 生 成 的 代 码 中, 启 动 此 特 性 表 的 函 数 一 般 名 为OnProperties( ), 在 需 要 的 地 方 调 用 它, 进 行 编 译、 连 接、 运 行, 然 后 会 看 到 一 个 特 性 表 已 经 可 以 在 需 要 的 地 方 弹 出 来 了。

  5. 至 此, 特 性 表 中 的 每 一 页 还 是 空 白。 在 一 页 中 加 入 需 要 的 控 件(controls) 和 一 般 的 对 话 框 一 样 简 单, 因 为 它 本 身 就 是 一 种 对 话 框。 打 开ResourceView 中 的Dialog, 特 性 表 的 每 一 页 都 作 为 一 个 对 话 框 列 于 其 中, 只 要 对 它 们 进 行 编 辑, 再 在 程 序 中 实 现 相 应 功 能 即 可。 现 在, 一 个 特 性 表 已 经 全 部 完 成。

  特 性 表 中 的 页 虽 然 和 普 通 对 话 框 基 本 一 致, 但 还 有 几 点 需 要 注 意:

  1. 页 中 的 各 控 件 不 能 使 用 其 扩 展 风 格(extended styles);

  2. 页 中 的 各 控 件 不 能 使 用Help ID;

  3. Control ID 不 能 是DWORD 类 型;

  4. 不 能 在 页 的 字 体 中 设 置 粗 细、 斜 体、 字 符 集 等 属 性。 如 果 不 能 遵 循 以 上 规 则, 程 序 运 行 时 将 会 出 现 错 误。

  特 性 表 的 编 程

  用Component Gallery 创 建 的 特 性 表 的 下 端 包 括 确 定、 取 消、 应 用、 帮 助 等 按 钮。 但 是, 有 时 侯 我 们 需 要 的 不 是 这 几 个 按 钮, 甚 至 完 全 不 需 要 按 钮, 那 么 如 何 修 改 呢 ?

  在MFC 程 序 内 部, 这 几 个 按 钮 都 有 着 自 己ID, 分 别 为IDOK、IDCANCEL、ID_APPLY_NOW、IDHELP。 这 些 宏 在 文 件AFXRES.H 和WINRES.H 中 定 义, 应 用 程 序 一 般 已 经 间 接 地 包 含 了 它 们, 可 以 直 接 引 用。 利 用 它 们 调 用GetDlgItem 函 数 可 以 得 到 各 按 钮 的 窗 口 句 柄。 有 了 句 柄, 对 按 钮 进 行 改 动 就 变 得 非 常 简 单: 用SetWindowText 改 变 按 钮 的 字 符, 用ShowWindow 和EnableWindow 隐 含 按 钮, 用MoveWindow 改 变 按 钮 位 置。

  假 设 特 性 表 的 类 名 为CMyPropertySheet, 以 隐 含‘ 应 用’、‘ 帮 助’ 两 个 按 钮 为 例, 则 在 特 性 表 的 程 序 中 加 入 如 下 代 码:

. . . . . . static int rgiButtons[]= { IDOK, IDCANCEL, ID_APPLY_NOW, IDHELP }; . . . . . . BOOL CMyPropertySheet::OnInitDialog() { BOOL bResult = CPropertySheet::OnInitDialog(); for ( int i = 2; i < 4; i + + ) { HWND hWnd = ::GetDlgItem( m_hWnd, rgiButtons[i]); if ( hWnd != NULL ) { ::ShowWindow( hWnd, SW_HIDE ); ::EnableWindow( hWnd, FALSE ); } } CenterWindow(); return bResult; }

  如 果 在 四 个 按 钮 之 外 还 需 加 入 另 外 一 些 按 钮 则 相 对 复 杂 一 些, 因 为 这 不 能 在ResourceView 中 实 现, 必 须 完 全 在 代 码 中 完 成。

  首 先, 在 类CMyPropertySheet 中 加 入 成 员 变 量:

protected: CButton m_btn;

  其 次, 为 按 钮 加 入 点 按 响 应 的 成 员 函 数 的 定 义。 为 了 使 之 能 为ClassWizard 所 识 别, 代 码 如 下:

protected: //{{AFX_MSG(CMyPropertySheet) afx_msg void OnBnClicked(); //}}AFX_MSG

  然 后, 在 程 序 中 加 入 如 下 消 息 映 射:

BEGIN_MESSAGE_MAP(CMyPropertySheet, CPropertySheet) //{{AFX_MSG_MAP(CMyPropertySheet) ON_BN_CLICKED(ID_MYBUTTON,OnBnClicked) //}}AFX_MSG_MAP END_MESSAGE_MAP()

  以 上 准 备 工 作 完 毕 之 后, 在OnInitDialog 函 数 中 创 建 此 按 钮:

CRect rect; rect.SetRect(BUTTONLEFT, BUTTNTOP, BUTTON RIGHT, BUTTONBOTTOM); m_btn.Create(“MyButton", BS_PUSHBUTTON|WS_VISIBLE, rect, this, ID_MYBUTTON);

  最 后, 在 程 序 中 完 成 点 按 按 钮 的 响 应 函 数:

void CMyPropertySheet::OnBnClicked() { . . . . . . }

  结 论

  基 本 上 大 部 分Windows 95 程 序 都 会 用 到 特 性 表, 特 性 表 可 以 有 效 地 节 省 屏 幕 空 间。 本 文 介 绍 了 一 些 相 关 技 术, 相 似 的 技 术 也 可 以 用 在 另 一 项 技 术 ─ ─ 向 导(Wizard) 中, 读 者 可 以 自 己 去 尝 试。

back.gif (1185 字节)

原文转自:http://www.ltesting.net