⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bcb_g10.htm

📁 C++Builder教学大全
💻 HTM
字号:
 

<html>

<head>

<title>用C++Builder3制作屏幕保护程序</title>

<meta http-equiv="目录类型" content="文本/html; 字符集=gb2312">

</head>

<body bgcolor="#FFFFFF">

<table width="100%" border="0" height="285">

  <tr> 

    <td height="35"> 

      <div align="center" class="p14"><font color="#000000">用C++Builder 3制作屏幕保护程序</font></div>   

    </td>   

  </tr>   

  <tr valign="top">    

    <td>西 北 工 业 大 学483 信 箱(710072) 郭 志 鹏<br>   

      <br>   

      <p><font color=#ffffff>----</font>屏 幕 保 护 程 序 是 以scr 为 扩 展 名 的 标 准 Windows    

        可 执 行 程 序, 在 激 活 控 制 面 板 的 显 示 器 属 性 的“ 屏 幕 保 护 程 序” 页 时, 该 模 块 会 自 动    

        在Windows 启 动 目 录(Windows 目 录 和 系 统 目 录) 下 查 找 扩 展 名 是scr 的 基 于Windows    

        的 可 执 行 文 件。 使 用 屏 幕 保 护 程 序, 不 仅 可 以 延 长 显 示 器 的 使 用 寿 命, 还 可 以 保 护 私    

        人 信 息。 </p>   

      <p><font color=#ffffff>----</font>编 制 屏 幕 保 护 程 序 不 仅 要 涉 及 消 息 的 处 理, 还    

        要 涉 及 命 令 行 参 数 的 处 理。 在Win32 SDK 文 档 中 描 述 了 编 制 基 于Win32 的 标 准 的 屏 幕    

        保 护 程 序 所 必 须 遵 守 的 严 格 标 准。 按 照 这 些 标 准, 屏 幕 保 护 程 序 必 须 要 输 出 两 个 函    

        数:ScreenSaverProc 和ScreenSaverConfigureDialog, 但 是 在Windows 系 统 中 的 很    

        多 屏 幕 保 护 程 序 并 没 有 遵 循 这 些 标 准( 使 用impdef 或 者tdump 实 用 工 具 查 看 即 可),    

        并 且 使 用 该 文 档 中 介 绍 的 方 法 编 写 屏 幕 保 护 程 序, 不 仅 要 使 用 资 源 编 辑 器, 并 且 在    

        链 接 时 还 要 利 用Scrsaver.lib 文 件( 在C + + Builder 3 环 境 下, 不 能 成 功 连 接), 不    

        仅 要 涉 及 消 息 的 处 理, 还 要 涉 及 命 令 行 参 数 的 处 理。 </p>   

      <p><font color=#ffffff>----</font>C + + Builder 3 提 供 了 许 多 类 型 的 应 用 程    

        序 开 发 模 板, 但 没 有 提 供 开 发 屏 幕 保 护 程 序 的 模 板, 并 且 在 其 在 线 帮 助 中 也 没 有 提    

        及 如 何 开 发 这 类 应 用 程 序。 经 过 本 人 的 研 究, 找 到 了 用C + + Builder 3 编 制 屏 幕 保    

        护 程 序 的 方 法。 </p>   

      <p align=center><font color=#ffffff>----</font>在 控 制 面 板 的“ 显 示 器 属 性" 项    

        的“ 屏 幕 保 护 程 序" 页 中 进 行 设 置 时, 要 遇 到 三 种 类 型 的 命 令 行 参 数, 并 且, 各 种 情 况    

        下 的 屏 幕 保 护 程 序 的 显 示 结 果 也 各 不 相 同, 一 般 来 讲, 就 需 要 三 种 类 型 的 窗 体。 下 面    

        将 分 四 步 来 具 体 地 说 明 如 何 编 制 屏 幕 保 护 程 序。 </p>   

      <h3 align=center>屏 幕 保 护 程 序 的 选 择</h3>   

      <p><br>   

        <font color=#ffffff>----</font>如 果 在 标 题 为“ 屏 幕 保 护 程 序" 的 下 拉 列 表 框 中    

        选 中 了 某 个 保 护 程 序 时, 系 统 会 自 动 启 动 该 程 序, 这 个 程 序 的 显 示 范 围 是 在 这 个 页    

        面 上 的 显 示 器 图 形 的 屏 幕 范 围, 同 时, 会 将 两 个 命 令 行 参 数( 一 个 是“/p"; 另 一 个 是    

        显 示 窗 口 的 句 柄) 传 递 给 这 个 被 选 中 的 程 序。 因 此, 这 类 程 序 首 先 应 该 能 够 处 理 命 令    

        行 参 数。 在C + + Builder3 中, 与 命 令 行 参 数 处 理 有 关 的 函 数 是:ParamCount() 和ParamStr(),    

        具 体 的 申 明 方 式 如 下: </p>   

      <p><font color=#ffffff>----</font> 1.extern PACKAGE int __fastcall ParamCount(void);    

      </p>   

      <p><font color=#ffffff>----</font>该 函 数 返 回 命 令 行 参 数 的 个 数, 但 不 包 含 应 用    

        程 序 本 身。 </p>   

      <p><font color=#ffffff>----</font> 2.extern PACKAGE AnsiString __fastcall    

        ParamStr(int Index); </p>   

      <p><font color=#ffffff>----</font>该 函 数 返 回 指 定 索 引 值 的 命 令 行 参 数。 ParamStr(0)    

        返 回 的 是 应 用 程 序 本 身。 </p>   

      <p><font color=#ffffff>----</font>所 以, 在 这 步 骤 中 的 参 数 判 断 的 语 句 如 下: </p>   

      <pre>if(UpperCase(ParamStr(1)) == “ -p&quot; 

 || UpperCase(ParamStr(i)) == “/p&quot;)

     {

       // add the code in here 

       }  </pre>   

      <p><font color=#ffffff>----</font>在 完 成 了 参 数 判 断 后, 就 应 该 对 显 示 窗 口 处 理。    

        为 能 够 使 程 序 在 显 示 器 图 形 的 屏 幕 区 域 内 显 示, 就 要 重 新 设 置 程 序 的 父 窗 口 和 显 示    

        区 域。 这 要 涉 及 到 父 窗 口 句 柄 的 获 得 及 父 窗 口 的 设 置, 以 及API 函 数 的 调 用, 这 种 环    

        境 下 的 父 窗 口 句 柄 就 是 传 递 过 来 的 第 二 个 命 令 行 参 数。 设 置 父 窗 口, 只 需 设 置 窗 体    

        的ParentWindow 属 性 即 可。 这 段 程 序 如 下: </p>   

      <pre>    RECT rc;  // Line1

HWND hWnd=(HWND)(atol(ParamStr(2).c_str())); 

 // Line2

    ::GetClientRect(hWnd, &rc);  // Line3

    ParentWindow=hWnd;  // Line4

    Left=rc.left; // Line5

    Top=rc.top; // Line6

    Width=rc.right -rc.left; // Line7

    Height=rc.bottom -rc.top; // Line8</pre>   

      <p><font color=#ffffff>----</font>在 上 面 的 程 序 片 段 中, 第2 行 语 句 是 将 传 递 过    

        来 的 第2 个 参 数 转 换 成 窗 口 句 柄; 第3 行 语 句 利 用 这 个 窗 口 句 柄, 调 用API 函 数 以 获 得    

        该 窗 口 的 客 户 区 域; 第4 行 语 句 将 选 中 的 屏 幕 保 护 程 序 的 父 窗 口 设 置 为 指 定 的 窗 口;    

        余 下 的 语 句 是 将 该 程 序 的 窗 口 大 小 设 置 成 副 窗 口 的 客 户 区 大 小。 这 一 程 序 的 位 置 应    

        该 是 在 窗 体 的OnCreate 事 件 处 理 中。 </p>   

      <p><font color=#ffffff>----</font>需 要 说 明 的 是, 这 种 类 型( 包 括 第 三 步 介 绍 的    

        窗 体) 的 窗 体 样 式 应 是: </p>   

      <p><font color=#ffffff>----</font>FormStyle=fsStayOnTop; </p>   

      <p><font color=#ffffff>----</font>窗 体 边 界 的 样 式 应 为: </p>   

      <p><font color=#ffffff>----</font>BorderStyle=bsNone; </p>   

      <p><font color=#ffffff>----</font>当 然, 这 时 也 不 需 要 鼠 标 图 形, 因 此, 可 以 将 鼠    

        标 的 形 状 设 为crNone: </p>   

      <p><font color=#ffffff>----</font>Cursor=crNone; </p>   

      <p align=center><font color=#ffffff>----</font>单 击“ 显 示 器 属 性" 模 块 的“ 屏    

        幕 保 护 程 序" 页 面 中 的“ 设 置" 按 钮 时, 系 统 会 启 动 指 定 的 保 护 程 序 的 初 始 值 设 置 对    

        话 框, 这 时 传 递 过 来 的 命 令 行 参 数 是:“/c" 或“ -c"( 参 数 的 处 理 与 前 面 介 绍 的 相 同)。    

        通 过 该 对 话 框, 可 以 设 置 保 护 程 序 的 一 些 初 始 参 数, 比 如 图 形 的 变 化 快 慢 等。 在 这 段    

        程 序 中, 还 要 涉 及 到 初 始 化 文 件 或 注 册 表 的 读 写, 用 以 记 录 初 始 化 参 数, 便 于 保 护 程    

        序 启 动 时 使 用。 </p>   

      <h3 align=center>预 览 及 运 行</h3>   

      <p><br>   

        <font color=#ffffff>----</font>预 览 的 效 果 就 是 屏 幕 保 护 程 序 被 激 活 后 的 显 示。    

        单 击“ 显 示 器 属 性" 模 块 的“ 屏 幕 保 护 程 序" 页 面 中 的 “ 预 览" 按 钮, 就 可 以 观 察 保 护    

        程 序 运 行 的 实 际 效 果。 这 时, 系 统 启 动 该 程 序 时 传 递 过 来 的 命 令 行 参 数 是:“/s" 或“    

        -s"。 对 于 命 令 行 参 数 的 处 理 与 前 面 的 步 骤 相 同, 但 在 这 一 步 中, 还 要 对 几 个 消 息 进    

        行 处 理, 这 些 消 息 是:WM_MOUSEMOVE,WM_LBUTTONDOWN, WM_MBUTTONDOWN,WM_RBUTTONDOWN,WM_KEYDOWN,    

        WM_ACTIVATE。 对WM_MOUSEMOVE 和WM_ACTIVATE 消 息 的 处 理 形 式 如 下: </p>   

      <pre>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;

  ......

  }

}</pre>   

      <p><font color=#ffffff>----</font>对 于 其 他 的 消 息 仅 仅 是 调 用Close() 函 数 来 关    

        闭 应 用 程 序 即 可。 应 用 这 种 消 息 处 理 方 式 时, 必 须 在 类 定 义 时 进 行 消 息 映 射, 不 然 的    

        话, 就 要 在 相 应 的 消 息 响 应 中 进 行 处 理。 </p>   

      <p><font color=#ffffff>----</font>与 第 一 步 类 似, 在 该 步 骤 中, 也 不 需 要 具 体 的    

        鼠 标 指 针 的 形 状, 因 此, 将 鼠 标 指 针 设 为crNone: </p>   

      <p align=center><font color=#ffffff>----</font>Cursor=crNone; </p>   

      <h3 align=center>修 改 项 目 源 文 件</h3>   

      <p><br>   

        <font color=#ffffff>----</font>在C + + Builder 3 中, 一 个 窗 体 也 就 是 一 个 类,    

        换 句 话 说, 具 有 某 些 特 性 的 类 也 就 是 一 个 窗 体, 因 此, 编 制 屏 幕 保 护 程 序 时, 也 不 需    

        要 什 么 主 窗 体, 同 时, 也 不 用 自 动 创 建 某 些 窗 体 了, 这 时 就 要 修 改 项 目 源 文 件。 下 面    

        所 列 出 的 程 序 就 是 笔 者 在 编 制 某 屏 幕 保 护 程 序 时 使 用 的 项 目 源 文 件, 供 读 者 参 考。    

      </p>   

      <pre>WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)

{

 CreateMutex(NULL, true, “ScreenSaver&quot;);

 if(GetLastError()!=ERROR_ALREADY_EXISTS)

  {

   try

 {

  Application -&gt;Initialize();

  Application -&gt;Title = “ 屏 幕 保 护 程 序 测 试&quot;;

  if(UpperCase(ParamStr(1))==

              “/C&quot; || UpperCase(ParamStr(1))==“ -C&quot;

                    ||ParamCount()==0)

     {TScrSaverConfiguerF 

     *ScrCfg=new TScrSaverConfiguerF(NULL);

      ScrCfg -&gt;ShowModal();

      delete ScrCfg;

      return 0;

      } // 单 击 “ 设 置&quot; 按 钮

else if(UpperCase(ParamStr(1))==

     “/P&quot;||UpperCase(ParamStr(1))==“ -P&quot;)

     {TScrForP *ScrFP=new TScrForP(NULL);

      ScrFP -&gt;ShowModal();

      delete ScrFP;

      return 0;

      } // 在“ 屏 幕 保 护 程 序

          &quot; 下 拉 列 表 框 中 选 择 一 个 程 序

else if(UpperCase(ParamStr(1))==

          “/S&quot;||UpperCase(ParamStr(1))==“ -S&quot;)

     {TScreenSaveF *ScreenSave=new TScreenSaveF(NULL);

      ScreenSave -&gt;ShowModal();

      delete ScreenSave;

      return 0;

      } // 单 击“ 预 览&quot; 按 钮,

            及 运 行 屏 幕 保 护 程 序

    else

     return 1;

    }

   catch (Exception &exception)

    {

     Application -&gt;ShowException( &exception);

     }

   }

 return 0;

} //the WinMain Function end</pre>   

      </td>   

  </tr>   

</table>   

<br>   

</body>   

</html>   

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -