C W a itCursor
CWaitCursor没 有 基 类 。
CWaitCursor 类 提 供 了 显 示 等 待 光 标 的 直 接 方 式 , 当 你 进 行 冗 长 的 操 作 时 , 它通 常 显 示 出 一 个 沙 漏 。 好 的 W indows 编 程 方 式 要 求 你 在 执 行 耗 用 大 量 时 间 的 操作 时 显 示 等 待 光 标 。
如 果 要 显 示 等 待 光 标 , 仅 需 在 进 入 执 行 冗 长 操 作 的 代 码 之 前 定 义 一 个
CWaitCursor变 量 。 整 个 对 象 的 构 造 函 数 自 动 地 显 示 等 待 光 标 。
当 对 象 超 出 作 用 域 时 ( 在 定 义 了 CWaitCursor 对 象 的 代 码 块 的 末 尾 ) , 它 的 析构 函 数 将 光 标 设 为 原 来 的 光 标 。 换 句 话 说 , 该 对 象 自 动 执 行 必 要 的 清 除 工 作 。
注 意 由 于 它 们 的 构 造 函 数 和 析 构 函 数 的 工 作 方 式 , CWaitCursor 对 象 总是 被 定 义 为 局 部 变 量 – – 它 们 从 不 被 定 义 为 全 局 变 量 , 也 不 用 new 来 分配 。
如 果 你 执 行 了 可 能 会 使 光 标 改 变 的 操 作 , 比 如 显 示 消 息 框 或 对 话 框 , 则 应 调 用Restore 成 员 函 数 以 恢 复 光 标 。 即 使 当 前 正 在 显 示 等 待 光 标 也 可 以 调 用 Restore 函 数 。
显 示 等 待 光 标 的 另 一 种 方 式 是 使 用 CCmdTarget::BeginWaitCursor 和CCmdTarget::EndWait Cursor 的 组 合 , 可 能 还 有CCmdTarget::RestoreWaitCursor。 但 是 , CWaitCursor 更 易 于 使 用 , 因 为 你 在 完成 了 冗 长 的 操 作 之 后 不 必 将 光 标 恢 复 到 原 来 的 光 标 。
注 意 MFC 使 用 虚 拟 函 数 CWinApp::DoWaitCursor 来 设 置 和 恢 复 光 标 。 你可 以 重 载 这 个 函 数 以 提 供 自 定 义 的 表 现 方 式 。
#include <afxwin.h>
请 参 阅 CCmdTarget::BeginWaitCursor, CCmdTarget::EndWaitCursor, CCmdTarget::Restore - W aitCursor, CWinApp::DoWaitCursor
CWaitCursor 类 成 员
Construction /Destruction
CWaitCursor 构 造 一 个 CWaitCursor 对 象 并 显 示 等 待 光 标
Operations
Restore 在 光 标 被 改 变 后 恢 复 等 待 光 标
成 员 函 数
CWaitCursor::C W a itCursor
CWaitCursor( );
说 明
如 果 要 显 示 等 待 光 标 , 只 需 在 冗 长 操 作 的 代 码 之 前 定 义 一 个 CWaitCursor对 象 。其 构 造 函 数 自 动 显 示 等 待 光 标 。
当 对 象 超 出 作 用 域 ( 在 定 义 CWaitCursor 对 象 的 代 码 块 的 末 尾 处 ) , 它 的 析 构函 数 将 光 标 设 为 原 来 的 光 标 。 换 句 话 说 , 这 个 对 象 自 动 执 行 必 要 的 清 除 操 作 。
析 构 函 数 是 在 代 码 块 的 末 尾 被 调 用 的 ( 可 能 是 在 函 数 末 尾 的 前 面 ) , 你 可 以 利用 这 个 特 性 使 等 待 光 标 只 将 你 的 函 数 的 一 部 分 激 活 。 下 面 的 第 二 个 例 子 演 示 了这 种 技 术 。
注 意 由 于 它 们 的 构 造 函 数 和 析 构 函 数 的 工 作 方 式 , CWaitCursor 对 象 总是 被 定 义 为 局 部 变 量 – – 它 们 从 不 被 定 义 为 全 局 变 量 , 也 不 用 new 来 分配 。
示 例
// 下 面 的 例 子 演 示 了 在 冗 长 操 作 的 过 程 中 显 示 等 待 光 标 的 一 般 方 式 。
void LengthyFunction( )
{
// 你 有 可 能 在 显 示 等 待 光 标 之 前 显 示 一 个 对 话 框
CWaitCursor wait; // 显 示 等 待 光 标
// 执 行 一 些 冗 长 的 操 作
} // 析 构 函 数 自 动 清 除 等 待 光 标
// 这 个 例 子 演 示 了 在 代 码 块 内 部 使 用 CWaitCursor 对 象 ,
// 因 此 只 有 当 程 序 执 行 冗 长 的 操 作 时 才 会 显 示 等 待 光 标 。
void ConditionalFunction( )
{
if ( SomeCondition )
{
CWaitCursor wait; // 仅 在 本 代 码 块 内 部 才 显 示 等 待 光 标 。
// 执 行 一 些 冗 长 的 操 作 。
} // 在 这 个 地 方 , 析 构 函 数 清 除 等 待 光 标 。
else
{
// 没 有 等 待 光 标 – – 只 有 快 速 操 作
}
}
请 参 阅 CWaitCursor::Restore, CCmdTarget::BeginWaitCursor, CCmdTarget::EndWaitCursor
CWaitCursor::Restore
void Restore( );
说 明
如 果 想 要 恢 复 等 待 光 标 , 则 应 在 完 成 操 作 后 调 用 这 个 函 数 , 比 如 显 示 消 息 框 或对 话 框 , 这 可 能 会 使 等 待 光 标 变 为 其 它 光 标 。
如 果 当 前 正 显 示 等 待 光 标 , 也 可 以 调 用 Restore 函 数 。
如 果 你 需 要 在 没 有 定 义 CWaitCursor 对 象 的 函 数 内 部 恢 复 等 待 光 标 , 则 应 调 用
CCmdTar- get::Restore W aitCurso r。
示 例
// 这 个 例 子 演 示 了 改 变 等 待 光 标 的 操 作
// 在 完 成 改 变 光 标 的 操 作 以 后 , 你 应 当 调 用
// CWaitCursor::Restore 以 恢 复 光 标 。
void AnotherLengthyFunction( )
{
CWaitCursor wait; // 显 示 等 待 光 标
// 执 行 一 些 冗 长 操 作
// 对 话 框 通 常 会 将 光 标 变 为 标 准 的 箭 头 光 标 。
CSomeDialog dlg; dlg.DoModal( );
// 为 了 将 光 标 变 回 等 待 光 标 , 必 须 调 用 Restore 函 数 。
wait.Restore( );
// 执 行 一 些 冗 长 操 作
// 析 构 函 数 自 动 清 除 等 待 光 标
}
// 如 果 等 待 光 标 被 创 建 它 的 函 数 所 调 用 的 函 数 改 变 ,
// 你 可 以 调 用 CCmdTarget::RestoreWaitCursor 来 恢 复 等 待 光 标 。
void CalledFunction()
{
CSomeDialog dlg; dlg.DoModal();
// 由 于 C W inApp 是 从 CCmdTarget 继 承 的 , 我 们 可 以
// 使 用 应 用 程 序 对 象 的 指 针 来 调 用 CCmdTarget::RestoreWaitCursor。AfxGetApp()->RestoreWaitCursor( );
// 还 有 其 它 冗 长 操 作 ...
}
请 参 阅 CCmdTarget::RestoreWaitCursor