太 原 重 型 机 械 学 院 软 件工 程 教 研 室
李 邦 庆 王 二 才
---- 说 到 屏 幕 保护, 一
般 人 会 认 为 那 是 操 作 系 统 的 事, 其 实 在 自 己 开发 的 应 用 程 序 中 也 可 实 现 屏 幕 保 护 功 能, 而 且 这 一
功能 除 了 确 实 能 保 护 显 示 器 屏 幕 外, 还 能 增 加 意 想 不 到的 效 果, 比 如 能 将 软 件 版 本、 程 序 图 标、 开
发 人 员 介绍 等 相 关 信 息 以 动 态 文 字 和 动 画 反 复 播 放。 在PowerBuiler 中 使 用idle() 函 数 和idle 事
件 可 实 现 这 一 功 能。
---- 一 . idle()
函数 和idle 事 件
---- idle() 函 数 叫
空闲 函 数, 与 timer() 函 数 有 点 类 似, 功 能 是 为 系 统 设 置 一个 定 时 器, 时 间 一 到 就 触 发idle 事 件,
函 数 的 参 数 为 以秒 为 单 位 的 时 间,idle 事 件 叫 做 空 闲 事 件, 当 系 统 接 到鼠 标 或 键 盘 激 活 的 消 息 时
中 止idle 事 件;
---- 二 . 制 作 屏幕
保 护 窗 口
---- 1 . 新 建 一 窗口w_save_screen
作 为 屏 幕 保 护 窗 口, 因 为 屏 幕 保 护 界 面 一般 是 对 整 个 屏 幕 的, 窗 口 不 含 标 题 条 和 菜 单 条, 这 要求 窗
口 的 类 型 最 好 为response( 响 应 窗 口)。 至 于 窗 口 显 示什 么 样 的 文 本、 图 片 或 动 画, 以 何 种 方 式 显
示, 依 开发 者 的 爱 好 和 用 户 的 需 求 而 定, 本 文 的 屏 幕 保 护 是 动态 显 示 一 幅 介 绍 软 件 的 图 片。
---- 2. 在 屏 幕 保 护窗
口 里 加 入 一 图 形 控 件p_1, 在 窗 口 的open 事 件 写 以 下 代码:
//图形控件p_1装入当前路径下的一幅图,文件名:scgl6.bmp
p_1.picturename= "scgl6.bmp"
//每隔0.1秒触发一次timer事件,形成动画效果
timer(.1)
---- 3. 声 明 窗 口 的实
例 变 量:
integer ii_i = 1 //用于动画可反复播放的循环数
---- 4 . 在 本 例 中,限
于 篇 幅, 为 减 少 相 似 程 序 代 码 量, 图 形 只 可 向 下 平移、 向 右 下 角 斜 移, 读 者 可 稍 作 改 动 就 可 写 出 向
上、向 左、 向 右 平 移, 向 四 个 角 斜 移 斜 的 代 码。 在 窗 口 的timer 事 件 下 写 以 下 代 码
integer li_num //图片位置变量
if ii_i =1 then
for li_num=1 to 1540 step 1
//Y坐标递增,图形向下移
p_1.Move(1,li_num) next
ii_i ++
p_1.Move(1,1)
p_1.SetRedraw(true)
return
end if
if ii_i=2 then
for li_num=1 to 1540 step 1
//X、Y坐标同时递增,向右下角移动
p_1.Move(li_num, li_num)
next
ii_i = 1 //循环复位,重新开始下一轮
p_1.Move(1,1)
p_1.SetRedraw(true)
return
end if
---- 三 . 应 用 程序
代 码 的 编 写
---- 打 开 应 用 程 序的
的script 画 板 中, 在open 事 件 中 增 加 下 面 一 行 代 码:
idle(120) //2分种没有鼠标或键盘消息触发idle事件
在idle事件中写下面的代码用于打开屏幕保护窗口
open(w_save_screen)
至此一个完整的屏幕保护功能就实现了。
---- 四 . 更 进 上步
的 说 明
---- 本 例 子 较 为 简单,
如 启 动 屏 幕 保 护 的 时 间 只 能 限 制 在2 分 钟, 不 够 灵活, 其 实 这 一 缺 点 也 容 易 克 服, 方 法 是: 把 启 动
时 间定 义 为 一 个 全 局 变 量, 将 其 保 存 在 一 配 置 文 件 中, 由用 户 自 己 设 置 启 动 时 间, 甚 至 可 以 关 闭 屏
幕 保 护 功能, 每 次 应 用 程 序 启 动 时 从 配 置 文 件 中 读 取 这 一 参数, 然 后 传 给idle() 函 数。
|