---- 在VC5.0 中 开 发 大 型 应 用 程 序 时, 工 具 条 通 常 是 程 序 中 必 不 可 少 的 功 能 因 素, 在 整 个 窗 口 的 停 靠 位 置 尤 其 关 键, 它 直 接 影 响 到 程 序 界 面 的 外 观 形 象。 本 文 介 绍 各 类 工 具 条 停 靠 位 置 的 控 制 技 巧, 供 参 阅。
---- 标 准 工 具 条 的 停 靠 控 制
---- VC5.0 应 用 程 序 向 导 生 成 的 框 架 代 码 中, 都 具 有 普 通 工 具 条 的 控 制 方 法。 正 常 情 况 下 工 具 条 类CToolBar 是 控 制 条 类CControlBar 的 派 生 类, 其 显 示 的 初 始 停 靠 位 置 是 通 过 调 用 继 承 的 函 数CControlBar::EnableDocking(DWORD dwStyle) 来 确 定 的, 其 参 数dwStyle 用 来 指 定 停 靠 的 具 体 位 置, 与 本 文 有 关 的 格 式 如 下( 其 余 请 参 阅VC5.0 的 联 机 文 档):
---- CBRS -ALIGN -TOP 停 靠 在 框 架 窗 口 客 户 区 域 顶 部;
---- CBRS -ALIGN -BOTTOM 停 靠 在 框 架 窗 口 客 户 区 域 底 部;
---- CBRS -ALIGN -LEFT 停 靠 在 框 架 窗 口 客 户 区 域 左 边;
---- CBRS -ALIGN -RIGHT 停 靠 在 框 架 窗 口 客 户 区 域 右 边;
---- CBRS -ALIGN -ANY 停 靠 在 框 架 窗 口 客 户 区 域 任 何 位 置。
---- 在 利 用 应 用 程 序 向 导AppWizard 生 成 的 应 用 程 序 中, 其 控 制 代 码 默 认 的 停 靠 位 置 为CBRS -ALIGN -ANY, 即 允 许 停 靠 在 框 架 窗 口 客 户 区 域 的 任 何 边 上。 工 具 条 在 正 常 显 示 时 停 靠 在 窗 口 客 户 区 域 的 顶 部, 控 制 指 令 为EnableDocking(CBRS_ALIGN_ANY) 或m_wndToolBar. EnableDocking(CBRS_ALIGN_ANY), 注 意 在 实 际 程 序 控 制 时 前 者 必 须 处 于 所 有 其 他 控 制 代 码 的 前 面, 否 则 浮 动 工 具 条 或 特 殊 工 具 条 等 部 分 代 码 可 能 无 法 奏 效。 具 体 控 制 方 法 请 参 考 利 用 应 用 程 序 向 导 生 成 的 任 何 一 个 程 序 实 例 框 架 代 码 部 分 中 建 立 的 函 数ONCREATE()。
---- 应 用 程 序 的 单 文 档 和 多 文 档 的 窗 口 框 架 类 均 由CFrameWnd::EnableDocking(DWORD dwDockS tyle) 来 实 现 的, 其 可 选 的 参 数 除 上 述 五 种 之 外, 还 增 加 了CBRS ??FLOAT ??MULTI 参 数, 该 参 数 主 要 是 为 设 计 浮 动 工 具 条 而 增 加 的, 用 来 确 定 一 个 框 架 窗 口 中 允 许 存 在 多 个 浮 动 工 具 条。 同 样 利 用 应 用 程 序 向 导AppWizard 生 成 的 应 用 程 序, 其 默 认 的 停 靠 位 置 也 是CBRS -ALIGN -A NY, 即 允 许 工 具 条 停 靠 在 框 架 窗 口 的 任 何 边 上, 其 默 认 的 初 始 位 置 为 框 架 窗 口 的 顶 部, 即En ableDocking(CBRS_ALIGN_ANY) 或m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY)。
---- 浮 动 工 具 条 的 停 靠 控 制
---- 当 一 个 框 架 窗 口 中 存 在 多 个 标 准 或 浮 动 工 具 条 时, 则 需 要 利 用 函 数void DockControlBar(CC ontrolBar *pBar,UINT nDockBarID=0,LPCRECT lpRect=NULL) 来 确 定 要 控 制 停 靠 位 置 的 工 具 条, 它 也 是CFrameWnd 类 的 成 员 函 数。 其 中 参 数pBar 用 来 指 向 被 控 制 停 靠 位 置 的 工 具 条 对 象 指 针, 参 数nDockBarID 用 来 确 定 工 具 条 停 靠 在 框 架 窗 口 的 哪 条 边 上, 其 控 制 的 具 体 取 值 为:
---- AFX -IDW -DOCKBAR -TOP 停 靠 在 框 架 窗 口 的 顶 部;
---- AFX -IDW -DOCKBAR -BOTTOM 停 靠 在 框 架 窗 口 的 底 部;
---- AFX -IDW -DOCKBAR -LEFT 停 靠 在 框 架 窗 口 的 左 边;
---- AFX -IDW -DOCKBAR -RIGHT 停 靠 在 框 架 窗 口 的 右 边。
---- 当 参 数nDockBarID 的 取 值 为0 时, 则 工 具 条 可 停 靠 在 框 架 窗 口 中 的 任 何 一 个 可 停 靠 的 边 上, 其 默 认 的 初 始 位 置 为 窗 口 顶 部。
---- 并 列 工 具 条 的 停 靠 控 制
---- 很 多 大 型 应 用 程 序 中 都 存 在 将 多 个 工 具 条 同 时 并 列 停 靠 在 某 窗 口 的 某 一 条 边 上 的 情 况。 对 这 种 停 靠 方 法, 可 利 用 上 述 工 具 条 控 制 函 数DockControlBar 的lpRect 参 数, 通 过 控 制 工 具 条 的 停 靠 矩 形 区 域 的 方 法 来 实 现。 实 现 的 函 数 如 下:
---- 1. 在 实 现 文 件MainFrm.h 中 增 加 如 下 成 员 函 数 定 义:
---- void DockControlBarLeftOf(CToolBar *Bar,CToolBar * LeftOf);
---- 2. 在 实 现 文 件MainFrm.cpp 中 增 加 如 下 成 员 函 数:
---- void CMainFrame::DockControlBarLeftOf(CToolBar * Bar,CTooIBar * LeftOf)
---- {// 设 置 工 具 条 并 列 停 靠 在 同 一 条 边 上
---- CRect rect; // 矩 形 区 域 定 义
---- DWORD dw;
---- UINT n=0;
---- RecalcLayout(); // 重 新 显 示
---- LeftOf ->GetWindowRect( &rect);
---- rect.Offset(1,0); // 设 置 偏 移 植 以 停 靠 在 同 一 边 上
---- dw=LeftOf ->GetBarStyle();
---- n=(dw &CBRS_ALIGN_TOP)?AFX_IDW_DOCKBAR_TOP:n;
---- n=(dw &CBRS_ALIGN_BOTTOM & &n==0)?AFX_IDW_DOCKBAR_BOTTOM:n;
---- n=(dw &CBRS_ALIGN_LEFT & &n==0)?AFX_IDW_DOCKBAR_LEFT:n;
---- n=(dw &CBRS_ALIGN_RIGHT & &n==0)?AFX_IDW_DOCKBAR_RIGHT:n;
---- DockControlBar(Bar,n, &rect);
---- }
---- 在 这 个 函 数 中 应 注 意 对RecalcLayout() 函 数 和OffestRect() 函 数 的 调 用, 前 者 用 来 重 新 显 示 被 调 整 的 客 户 区 和 工 具 条, 后 者 用 来 重 新 确 定 矩 形 区 域, 这 相 当 于 利 用 鼠 标 将 第 二 个 工 具 条 窗 口 拖 动 到 前 一 个 工 具 条 上 然 后 释 放。
---- 3. 修 改 应 用 程 序 建 立 函 数OnCreate() 中 的 相 应DockControlBar() 函 数 为DockControlBarOf() 函 数, 并 正 确 设 置 工 具 条 对 象 的 指 针。 笔 者 在 实 现 程 序 中 的 控 制 代 码 如 下:
---- EnableDocking(CBRS_ALIGN_ANY);// 停 靠 位 置 必 须 在 最 前 面
---- / / 工 具 条 建 立 函 数
---- m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
---- m_wndTestToolBar.EnableDocking(CBRS_ALIGN_ANY);
---- DockControlBar( &m_wndToolBar,AFX_IDW_DOCKBAR_TOP);
---- / / 使 两 个 工 具 条 并 列 停 靠
---- DockControlBarLeftOf( &m_wndTestToolBar, &m_wndToolBar);
---- 工 具 条 的 顶 部 停 靠 控 制
---- 1. 打 开 菜 单 资 源 增 加 顶 部 位 置 控 制 菜 单 项IDD_DLGBARTOP;
---- 2. 在 实 现 文 件MainFrm.h 中 增 加 成 员 控 制 变 量m_bDialogTop:
---- BOOL m_bDialogTop;
---- 并 在 构 造 函 数 中 设 置 初 始 值;
---- 3. 利 用 类 向 导ClassWizard 为 菜 单 项 设 置 响 应 函 数;
---- 4. 在 实 现 文 件MainFrm.cpp 中 通 过 充 分 利 用SetWindowPos() 成 员 完 善 消 息 映 射 功 能。
void CMainFrame::OnButtonDIgbartop() {// 定 制 工 具 条 顶 部 位 置 控 制 函 数if (m_bDialogTop) m_wndDIgBar.SetWindowPos( &m_wndStatusBar,0,0,0,0, SWP_NOSIZESWP_NOMOVE); // 顶 部 工 具 条 停 靠 在 窗 口 边, 左 右 工 具 条 停 靠 其 下else m_wndDIgBar.SetWindowPos( &wndTop,0,0,0,0, SWP_NOSIZESWP_NOMOVE);// 停 靠 在 最 顶 部RecalcLayout();// 重 新 显 示 窗 口m_bDialogTop=!m_bDialogTop;// 改 变 变 量 标 志}void CMainFrame::OnUpdateButtonDIgbartop(CCmdUI * pCmdUI){// 设 置 菜 单 项 检 查 状 态 更 新 函 数 pCmdUI -SetCheck(m_bDialogTop);}
---- 这 样, 就 可 利 用 菜 单 项 来 控 制 定 制 工 具 条 的 顶 部 停 靠 位 置。