bcb_g9.htm

来自「C++Builder教学大全」· HTM 代码 · 共 142 行

HTM
142
字号
 

<html>

<head>

<title>在C++Builder中实现动画</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中实现动画</font></div>

    </td>

  </tr>

  <tr valign="top"> 

    <td>

      <h3>一、 直 接 使 用Animate 部 件 </h3>   

      <p><font color=#ffffff>----</font>在 您 的 程 序 中 只 要 增 加 一 个Animate 部 件, 并    

        设 置 其 部 分 属 性 就 可 实 现 动 画, 但 缺 点 就 在 于Animate 部 件 只 能 打 开 已 有 的AVI 视 屏    

        文 件( 或 使 用Windows 公 用AVI), 有 一 定 的 系 统 开 销。 </p>   

      <p><font color=#ffffff>----</font>在 板2(Panel2) 中 加 入 一 个Animate 部 件 (Animate1),    

        我 们 设 置 其FileName 或CommonAVI 及Active 属 性 以 使 其 执 行 某AVI 视 屏 文 件 或Windows    

        公 用AVI。 设 置Animate1 的CommonAVI 属 性 值 为aviFindFolder, 它 将 执 行 我 们 常 见 的    

        在 搜 索 文 件 夹 过 程 中 的 搜 索 动 画。 </p>   

      <p><font color=#ffffff>----</font>为 控 制Animate1 的 动 作, 为 第 一 个 复 选 框 (CheckBox1)    

        的OnClick 事 件 增 加 代 码 如 下: </p>   

      <pre>void  __fastcall  TDemoForm::

CheckBox1Click(TObject *Sender)

{

  Animate1 -&gt;Active = CheckBox1 -&gt;Checked;    

}

</pre>   

      <h3>二、 使 用Timer 部 件 定 时 绘 制 画 面 </h3>   

      <p><font color=#ffffff>----</font>在C + +Builder 的System 标 签 中 有 一 个Timer    

        部 件, 使 用Timer 部 件 实 际 上 是 使 用Windows 定 时 器, 定 时 绘 制 部 分 画 面, 达 到 动 画 效    

        果。 </p>   

      <p><font color=#ffffff>----</font>Pic0.bmp Pic1.bmp Pic2.bmp Pic3.bmp 在    

        板3(Panel3) 中 加 入Image 部 件(Image1), 并 预 装 入 一 幅 图  

      片。 </p>  

      <p><font color=#ffffff>----</font>为 在 程 序 中 存 储 这 些 图 片, 在 主 窗 体 的 头 文 件    

        中 增 加 变 量 定 义: </p>   

      <pre>TPicture *pic[4];  //  存 储 图 片 的 指 针

int number;      //  记 录 当 前 图 片 序 号

</pre>   

      <p><font color=#ffffff>----</font>并 为 主 窗 口 的OnCreate 事 件 增 加 代 码, 在 程 序    

        主 窗 口 创 建 时 装 入 图 片, 即: </p>   

      <pre>void  __fastcall  TDemoForm::FormCreate(TObject *Sender)

{

  number = 0;

  AnsiString Path = ExtractFilePath(Application -&gt;ExeName);

  for(int i=0; i&lt;4; i + +) { pic[i]=&quot;new&quot; TPicture(); try { pic[i] -&gt;LoadFromFile(Path +

                 “pic&quot; +IntToStr(i) +“.bmp&quot;);

    }

    catch(...) {

       Application -&gt;MessageBox

      (“\n 无 法 打 开 图 片 文 件...\t\n&quot;, 

    “ 错 误&quot;, MB_ICONWARNING|MB_OK);

    }  }

}

</pre>   

      <p><font color=#ffffff>----</font>增 加Timer 部 件(Timer1), 设 置 其 时 间 间 隔 Interval    

        属 性 为200 毫 秒; 另 外, 设 置Timer1 的Enabled 属 性 值 为false。 为 定 时 更 换 绘 制 图 片,    

        为Timer1 的OnTimer 事 件 增 加 代 码 如 下: </p>   

      <pre>void  __fastcall  TDemoForm::

Timer1Timer(TObject *Sender)

{

  Image1 -&gt;Canvas -&gt;CopyRect

  (Image1 -&gt;ClientRect,

    pic[number] -&gt;Bitmap -&gt;Canvas,

    Rect(0, 0, pic[number] -&gt;Width,

      pic[number] -&gt;Height));

  number + +;

  number %=4;    

}

</pre>   

      <p><font color=#ffffff>----</font>为 第 二 个 复 选 框(CheckBox2) 的OnClick 事 件    

        增 加 代 码 如 下, 以 控 制 动 画 的 执 行 与 停 止: </p>   

      <pre>void  __fastcall  TDemoForm::CheckBox2Click

(TObject *Sender)

{

  Timer1 -&gt;Enabled = CheckBox2 -&gt;Checked;    

}

</pre>   

      <p><font color=#ffffff>----</font>使 用Timer 部 件, 定 时 绘 制 画 面 也 并 不 复 杂, 但    

        因 为 要 存 储 多 幅 图 片, 系 统 开 销 却 是 相 当 大 的, 但 其 动 画 效 果 却 也 相 当 好。 </p>   

      <h3>三、 利 用 程 序 空 闲 时 间 更 换/ 重 绘 画 面 </h3>   

      <p><font color=#ffffff>----</font>OnIdle 事 件 是TApplication 类 的 事 件 之 一。    

        当 应 用 程 序 空 闲 时, 程 序 就 会 产 生OnIdle 事 件, 利 用 程 序 空 闲 执 行 动 画 不 是 很 妙 吗    

        ? </p>   

      <p><font color=#ffffff>----</font>首 先 在 演 示 程 序 主 窗 体 的 第 四 个 板 (Panel4)    

        上 增 加 一 个 标 签(Lable1), 根 据 你 的 个 人 爱 好 设 置 其 Caption 及Font 等 属 性。 再 在    

        主 窗 体 的 类 定 义 中 增 加 一 个OnIdle 事 件 处 理 函 数, 它 像 普 通 函 数 一 样 定 义, 但 需 保    

        证 其 原 型 正 确。 我 们 定 义 的OnIdle 事 件 处 理 函 数 在 主 窗 体 的 头 文 件 中 作 如 下 申 明:    

      </p>   

      <p><font color=#ffffff>----</font>void __fastcall MyIdleHandler(TObject    

        *Sender, bool & Done); </p>   

      <p><font color=#ffffff>----</font>其 完 整 代 码 为: </p>   

      <pre>void __fastcall TDemoForm::MyIdleHandler

(TObject *Sender, bool &Done)

{

  int StartTime = GetTickCount();

  if(Label1 -&gt;Top +Label1 -&gt;Height&gt;0) {

    Label1 -&gt;Top - -;

  }

  else {

    Label1 -&gt;Top = Panel4 -&gt;Height;

  }

  while(GetTickCount() -StartTime &lt;50); } </pre>  

 <pre></pre>   

   

<p><font color=#ffffff>----</font>请 注 意, 为 避 免 移 动 标 签 速 度 过    

快, 使 用 了 下 面 的 代 码 段: </p><pre>int StartTime = GetTickCount();

...

while(GetTickCount() -StartTime &lt;50); </pre>   

      <p><font color=#ffffff>----</font>它 保 证 了 动 画 的 时 间 间 隔 不 少 于50 毫 秒。 </p>   

      <p><font color=#ffffff>----</font>为 第 三 个 复 选 框(CheckBox3) 的OnClick 事 件    

        增 加 代 码 如 下: </p>   

      <pre>void __fastcall TDemoForm::CheckBox3Click

(TObject *Sender)

{

  if(CheckBox3 -&gt;Checked) {

    Application -&gt;OnIdle = MyIdleHandler;

  }

  else {

    Application -&gt;OnIdle = NULL;

  }

}

</pre>   

      <p><font color=#ffffff>----</font>为 保 证 程 序 执 行 的 安 全 性, 还 需 在 程 序 结 束 时    

        做 一 些 必 要 的 处 理( 如 释 放 程 序 运 行 过 程 中 分 配 的 空 间)。 为 主 窗 体 的OnDestroy 事    

        件 增 加 代 码 如 下: </p>   

      <pre>void  __fastcall  TDemoForm::FormDestroy

(TObject *Sender)

{

  for(int i=0; i&lt;4; i + +) { delete pic[i]; } Application -&gt;OnIdle = NULL;

}</pre>   

      </td>   

  </tr>   

</table>   

<br>   

</body>   

</html>   

⌨️ 快捷键说明

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