荔园在线

荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀

[回到开始] [上一篇][下一篇]


发信人: jek (好好学习天天向上), 信区: Program
标  题: 用C++ Builder 3制作屏幕保护程序
发信站: BBS 荔园晨风站 (Sat Mar 11 13:39:03 2000), 转信


屏 幕 保 护 程 序 是 以scr 为 扩 展 名 的 标 准Windows 可 执 行 程 序, 在 激
活 控 制 面 板 的 显 示 器 属 性 的" 屏 幕 保 护 程 序" 页 时, 该 模 块 会 自
 动 在Windows 启 动 目 录(Windows 目 录 和 系 统 目 录) 下 查 找 扩 展 名 是
scr 的 基 于Windows 的 可 执 行 文 件。 使 用 屏 幕 保 护 程 序, 不 仅 可 以
延 长 显 示 器 的 使 用 寿 命, 还 可 以 保 护 私 人 信 息。

---- 编 制 屏 幕 保 护 程 序 不 仅 要 涉 及 消 息 的 处 理, 还 要 涉 及 命 令
 行 参 数 的 处 理。 在WIN32 SDK 文 档 中 描 述 了 编 制 基 于WIN32 的 标 准
的 屏 幕 保 护 程 序 所 必 须 遵 守 的 严 格 标 准。 按 照 这 些 标 准, 屏 幕
 保 护 程 序 必 须 要 输 出 两 个 函 数:ScreenSaverProc 和
ScreenSaverConfigureDialog, 但 是, 在Windows 系 统 中 的 很 多 屏 幕 保 护
程 序 并 没 有 遵 循 这 些 标 准( 使 用impdef 或 者tdump 实 用 工 具 查 看 即
可)。 并 且 使 用 该 文 档 中 介 绍 的 方 法 编 写 屏 幕 保 护 程 序, 不 仅
要 使 用 资 源 编 辑 器, 并 且 在 链 接 时 还 要 利 用Scrsaver.lib 文 件( 在
C++ Builder 3 环 境 下, 不 能 成 功 连 接)。 不 仅 要 涉 及 消 息 的 处 理,
 还 要 涉 及 命 令 行 参 数 的 处 理。
---- C++ Builder 3 是 一 种 快 速 的 应 用 程 序 开 发 工 具, 提 供 了 许 多
类 型 的 应 用 程 序 开 发 模 板, 但 没 有 提 供 开 发 屏 幕 保 护 程 序 的
模 板, 并 且 在 其 在 线 帮 助 中 也 没 有 提 及 如 何 ? 遇 到 三 种 类 型
的 命 令 行 参 数, 并 且, 各 种 情 况 下 的 屏 幕 保 护 程 序 的 显 示 结 果
 也 各 不 相 同, 一 般 来 讲, 就 需 要 三 种 类 型 的 窗 体( 或 两 种, 在
随 后 的 内 容 中 讨 论)。 下 面 将 分 四 步 来 具 体 地 说 明 如 何 编 制 屏
 幕 保 护 程 序。

一、 屏 幕 保 护 程 序 的 选 择

---- 如 果 在 标 题 为" 屏 幕 保 护 程 序" 的 下 拉 列 表 框 中 选 中 了 某 个
 保 护 程 序 时, 系 统 会 自 动 启 动 该 程 序, 这 个 程 序 的 显 示 范 围
是 在 这 个 页 面 上 的 显 示 器 图 形 的 屏 幕 范 围, 同 时, 会 将 两 个 命
 令 行 参 数: 一 个 是"/p"; 另 一 个 是 显 示 窗 口 的 句 柄, 传 递 给 这
个 被 选 中 的 程 序。 因 此, 这 类 程 序 首 先 应 该 能 够 处 理 命 令 行 参
 数。 在C++ Builder3 中, 与 命 令 行 参 数 处 理 有 关 的 函 数 是:
ParamCount() 和ParamStr(), 具 体 的 申 明 方 式 如 下:

---- 1 . extern PACKAGE int __fastcall ParamCount(void);

---- 该 函 数 返 回 命 令 行 参 数 的 个 数, 但 不 包 含 应 用 程 序 本 身。

---- 2 . extern PACKAGE AnsiString __fastcall ParamStr(int Index);

---- 该 函 数 返 回 指 定 索 引 值 的 命 令 行 参 数。ParamStr(0) 返 回 的 是
应 用 程 序 本 身。

---- 所 以, 在 这 以 步 骤 中 的 参 数 判 断 的 语 句 如 下:

if(UpperCase(ParamStr(1)) ==
"-p" || UpperCase(ParamStr(i)) == "/p")
     {
       // add the code in here
       }
---- 在 完 成 了 参 数 判 断 后, 就 应 该 对 显 示 窗 口 的 处 理, 为 能 够
使 程 序 在 显 示 器 图 形 的 屏 幕 区 域 内 显 示, 就 要 重 新 设 置 程 序
的 父 窗 口 和 显 示 区 域。 这 要 涉 及 到 父 窗 口 句 柄 的 获 得 及 父 窗
口 的 设 置, 以 及API 函 数 的 调 用。 这 种 环 境 下 的 父 窗 口 句 柄 就 是
 传 递 过 来 的 第 二 个 命 令 行 参 数; 要 设 置 父 窗 口, 只 需 设 置 窗
体 的ParentWindow 属 性 即 可。 这 段 程 序 如 下:


    RECT rc;  // Line1
HWht-rc.left; // Line7
    Height=rc.bottom-rc.top; // Line8
---- 在 上 面 的 程 序 片 段 中, 第2 行 语 句 是 将 传 递 过 来 的 第2 个 参
数 转 换 成 窗 口 句 柄; 然 后, 第3 行 语 句 利 用 这 个 窗 口 句 柄, 调 用
API 函 数 以 获 得 该 窗 口 的 客 户 区 域; 第4 行 语 句 将 选 中 的 屏 幕 保
 护 程 序 的 父 窗 口 设 置 为 指 定 的 窗 口; 余 下 的 语 句 是 将 该 程 序
的 窗 口 大 小 设 置 成 副 窗 口 的 客 户 区 大 小。 这 一 程 序 片 段 的 位
置 应 该 是 在 窗 体 的OnCreate 事 件 处 理 中。

---- 需 要 说 明 的 是, 这 种 类 型( 包 括 第 三 步 介 绍 的 窗 体) 的 窗
体 样 式 应 是:

     FormStyle=fsStayOnTop;

---- 窗 体 边 界 的 样 式 应 为:

     BorderStyle=bsNone;
---- 当 然, 这 时 也 不 需 要 鼠 标 图 形, 因 此, 可 以 将 鼠 标 的 形 状
设 为 crNone:

     Cursor=crNone;

二、 初 始 化 参 数 的 设 置

---- 单 击" 显 示 器 属 性" 模 块 的" 屏 幕 保 护 程 序" 页 面 中 的" 设 置"
按 钮 时, 系 统 会 启 动 指 定 的 保 护 程 序 的 初 始 值 设 置 对 话 框, 这
 时 传 递 过 来 的 命 令 行 参 数 是:"/c" 或"-c"( 参 数 的 处 理 与 前 面 介
 绍 的 相 同)。 通 过 该 对 话 框, 可 以 设 置 保 护 程 序 的 一 些 初 始 参
 数, 比 如 图 形 的 变 化 快 慢 等。 在 这 段 程 序 中, 还 要 涉 及 到 初 始
 化 文 件 或 注 册 表 的 读 写, 用 以 记 录 初 始 化 参 数, 便 于 保 护 程
序 启 动 时 使 用。


---- 三、 预 览 及 运 行

---- 预 览 的 效 果 就 是 屏 幕 保 护 程 序 被 激 活 后 的 显 示。 单 击 单 击
" 显 示 器 属 性" 模 块 的" 屏 幕 保 护 程 序" 页 面 中 的" 预 览" 按 钮, 就
可 以 观 察 保 护 程 序 运 行 的 实 际 效 果。 这 时, 系 统 启 动 该 程 序 时
 传 递 过 来 的 命 令 行 参 数 是:"/s" 或"-s"。 对 于 命 令 行 参 数 的 处 理
 与 前 面 的 步 骤 相 同, 但 在 这 一 步 中, 还 要 对 几 个 消 息 进 行 处
理, 这 些 消 息 是:WM_MOUSEMOVE,WM_LBUTTONDOWN,WM_MBUTTONDOWN,
WM_RBUTTONDOWN,WM_KEYDOWN,WM_ACTIVATE。 对WM_MOUSEMOVE 和WM_ACTIVATE 消 息
的 处 理 形 式 如 下:

void __fastcall HandleSomeMessage(TMessage &Msg)
{
 switch(Msg.Msg)
 {// ......
  case WM_ACTIVATE: if(Msg.WParamLo==WA_INACTIVE)
                       Close()
                     break;
  case WM_MOUSEMOVE: if(OldMouseX==-1 && OldMouseY==-1)
//In the constructor, OldMouseX and
OldMouseY must be initialized by -1.
                       { OldMouseX = Msg.LParamLo;
                         OldMouseY = Msg.LParamHi;
                        }
                      else if (OldMouseX != Msg.LParamLo
                     || OldMouse!= Msg.LParamHi)
                        Close();
                      break;
  ......
  }
}
---- 对 于 其 他 的 消 息 仅 仅 是 调 用Close() 函 数 来 关 闭 应 用 程 序 即
合 用 一 个 窗 体)。

---- 与 第 一 步 类 似, 在 该 步 骤 中, 也 不 需 要 具 体 的 鼠 标 指 针 的
形 状, 因 此, 将 鼠 标 指 针 设 为crNone:

     Cursor=crNone;



四、 修 改 项 目 源 文 件

---- 在C++ Builder 3 中, 一 个 窗 体 也 就 是 一 个 类, 换 句 话 说, 具 有
某 些 特 性 的 类 也 就 是 一 个 窗 体, 因 此, 编 制 屏 幕 保 护 程 序 时,
也 不 需 要 什 么 主 窗 体, 同 时, 也 不 用 自 动 创 建 某 些 窗 体 了, 这
时 就 要 修 改 项 目 源 文 件, 下 面 所 列 出 的 程 序 就 是 笔 者 在 编 制
某 屏 幕 保 护 程 序 时 使 用 的 项 目 源 文 件, 供 读 者 参 考。

WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
 CreateMutex(NULL, true, "ScreenSaver");
 if(GetLastError()!=ERROR_ALREADY_EXISTS)
  {
   try
   {
    Application- >Initialize()
    Application- >Title = "屏幕保护程序测试";

if(UpperCase(ParamStr(1))==
"/C" || UpperCase(ParamStr(1))=="-C"
               ||ParamCount()==0)
     {TScrSaverConfiguerF *ScrCfg=
     new TScrSaverConfiguerF(NULL);
      ScrCfg- >ShowModal();
      delete ScrCfg;
      return 0;
      } //单击"设置"按钮
else if(UpperCase(ParamStr(1))==
"/P"||UpperCase(ParamStr(1))=="-P")
     {TScrForP *ScrFP=new TScrForP(NULL);
      ScrFP- >ShowModal();
      delete ScrFP;
      return 0;
      } //在"屏幕保护程序"下拉列表框中选择一个程序
else if(UpperCase(ParamStr(1))==
"/S"||UpperCase(ParamStr(1))=="-S")
     {TScreenSaveF *ScreenSave=new TScreenSaveF(NULL);
      ScreenSave- >ShowModal()
      delete ScreenSave;
      return 0;
      } // 单击"预览"按钮,及运行屏幕保护程序
    else
     return 1;
    }
   catch (Exception &exception)
    {
     Application- >ShowException(&exception);
     }
   }
 return 0;
} //the WinMain Function end
---- 前 面 介 绍 了 在C++ Builder 3 下 编 制 屏 幕 保 护 程 序 的 方 法. 对 于
 C++ Builder 3 这 种RAD 工 具 来 讲, 开 发 这 类 程 序 也 是 相 当 方 便 的,
 按 照 前 述 的 方 法, 可 以 在 极 短 的 时 间 开 发 出 屏 幕 保 护 程 序。
对 于 屏 幕 保 护 程 序, 在 本 文 中 没 有 说 明 的 就 是 如 何 设 置 口 令
的 问 题, 这 部 分 就 由 读 者 自 己 摸 索 吧。



--
※ 来源:·BBS 荔园晨风站 bbs.szu.edu.cn·[FROM: 192.168.1.118]


[回到开始] [上一篇][下一篇]

荔园在线首页 友情链接:深圳大学 深大招生 荔园晨风BBS S-Term软件 网络书店