精华区 [关闭][返回]

当前位置:网易精华区>>讨论区精华>>编程开发>>● VB和Basic>>〓〓..技术文章连载..〓〓>>VB邮件>>VB邮件(6.26)

主题:VB邮件(6.26)
发信人: aaaaaaaaa()
整理人: cobe(2000-02-13 00:10:37), 站内信件
                      编者的话
====================================================================
大家好!
    欢迎大家回答问题和提出问题,同时也欢迎大家
提供有关VB和VBA和ASP的好作品。
                                版主   冯德平
                                [email protected]
=============================================
            VB邮件(6.26)
a Web动画图像分解在VB动画设计中的应用

武汉  任清珍 黄可


----------------------------------------------------------------------
----------

    笔者每次浏览Web网页时,总是被许多生动有趣的小动画深深吸引,十分佩服
作者的想象力和制作技巧。在使用VB进行应用软件开发设计中,为使软件的人机
界面新颖友好,总想加点动画作点缀,但又常常苦于一幅幅动画图片的绘制或寻
找!因此萌发了一种奇妙的设想:能否让Web页面上的动画在VB应用软件界面上活
起来?幸运的是,当前图像处理软件甚多,终于将笔者的这一设想变成了现实。 


 

VB动画设计 

    动画的制作原理很简单:首先绘制几幅相近但又有细微变化的图片,然后每
隔一段很短的时间就依次显示其中一幅,由于人眼视觉暂留,就能看到连贯的动
画效果。 使用VB进行动画设计非常方便,因为其工具箱中有图像、图片、时钟控
件。只要获得了一幅幅动画单幅图像文件,把它们放入图像控制数组中去,便可
用时钟控件的控制属性Interval来控制每幅图片的显示间隔,把最终动画显示的
位置确定好后,按时间间隔依次从图像控制数组中取出一幅图显示。如此交替反
复显示,即可产生动画效果,编程实现比较简单。 

    VB动画设计所能接收的单幅图片文件的格式有四种,即*.Bmp、*.Ico、*.Wm
f和*.Dib。其中*.Bmp文件的来源最广,不但可以使用Windows环境下的各种绘图
软件来绘制(但费时费力,且不是每个人都有绘画的天才),也可以使用Windows所
提供的现成的位图文件,或者用彩色扫描仪扫入等等。在此,笔者所感兴趣的则
是从Internet上Web站点网页上下载自己喜爱的动画图像文件,再经过图形软件分
解、处理成一幅幅*.Bmp图片文件,它们会给软件的人机界面带来全新的感受。 


 

Web动画图像分解方法 

    从Web网页上下载静态图像文件比较简单,下载后需要进行分解。 动画图像
文件的分解是动画设计的逆过程,即把一个动画效果的图像文件分解形成它的多
幅图片文件。可使用GIF Construction Set软件打开(此软件可在许多服务器上下
载)要分解的图像文件,该软件即可将动画自动分解为多幅组成动画的单幅图画。
 使用上述软件分解后,首先看看是由几幅图画组成的动画,如果有N幅图画,就
把动画文件拷贝N份。 然后,逐个打开拷贝文件对每个文件进行处理,处理过程
中只需在第一个文件中保留静止的图像,在其它文件中只保留动画图像。 最后,
使用具有图形转换功能的图形处理软件如Phtoshop,就可把得到的N个*.Gif图像
文件都转换成*.Bmp文件的格式。Web动画分解过程概括描述如下: Web动画下载
→Web动画分解(GIF Construction Set)→Web动画格式转换(Phtoshop等)。 

 

一个实例 

    这是一个在数据库查询窗体上设计的眼睛转动查看的动画,此动画的每个单
幅图画就是从Web网页上下载分解得到的。 动画设计实现步骤如下: 首先,用上
述方法把Web网页上转眼睛动画下载保存、分解、格式转换成二幅画Eyesl.Bmp和
Eyes2.Bmp(此动画简单,只由二幅画组成)。 其次,将Eyes1.Bmp和Eyes2.Bmp放
入图像控制数组中。 窗体构造简单表示如下: 

    窗体属性表如下: 

    程序代码如下: 

    在窗体的General中声明: 

Dim Rotateflag as Integer '交替显示标志 

Dim Currenteyes as Integer '当前显示第几幅画

    窗体装载初始化: 

Sub Form_Load() Rotateflag=1 '进入显示(时钟计数开始) 

Currenteyes=0 '第一幅画定位 

End Sub 

    交替显示子程序(时钟控制显示间隔,本例为250ms): 

Sub Tmrtimer_Timer() 

If Rotateflag=1 Then '交替显示开始  

SImgeyes.Picture=Imgeyes(Currenteyes).Picture '开始显示第一幅画 

Currenteyes=Currenteyes+1 '250ms后显示下一幅 

If Currenteyes=2 Then Currenteyes=0 '如果已显示了两幅,则再从第一幅显示
 

End If 

End If 

End Sub '结束 

    利用Web网页动画图像分解成的多个单幅图画,不但可以为VB动画设计提供方
便,也可用于VC等动画编程。目前,Internet的范围日益扩大,使Web与软件编程
联系起来,无疑提高了应用软件的制作效率和质量。



b 播放声音文件  
 
-在 某 些 情 况 下, 例 如 程 序 员 正 在 编 写 一 个 游 戏, 或 是 将
 要 进 行 一 项 非 常 冗 长 无 聊 的 过 程, 可 以 通 过 播 放 音 乐 来
 增 加 游 戏 的 声 光 效 果 或 是 减 少 漫 长 的 等 待 所 带 来 的 困 
倦。 本 文 介 绍 如 何 在Microsoft Visual Basic 中 对 声 音 文 件 进 行
 播 放。 

播 放 声 音 文 件 

---- 在Microsoft Visual Basic 中 进 行 多 媒 体 音 乐 的 播 放 是 一 件
 非 常 轻 松 的 事 情。 在Microsoft Windows 系 统 中 支 持 的 声 音 文
 件 有WAV 文 件 和MIDI 文 件, 通 常 使 用Windows 应 用 程 序 编 程 接
 口(API) 函 数mciExecute 函 数 可 以 对MIDI 文 件 进 行 播 放。 而 使
 用API 函 数sndPlaySound 则 可 以 对WAV 播 放 文 件 进 行 播 放, 当 然
, 你 也 可 以 使 用mciExecute 函 数 来 播 放WAV 文 件。 

---- 为 了 播 放WAV 文 件, 你 需 要 在 你 的 程 序 窗 体 的 通 用 声 
明 部 分 中, 或 是 标 准 模 块 中 添 加 如 下 的 声 明 语 句: 

---- Private Declare Function sndPlaySound Lib "winmm.dll" Alias "sndP
laySoundA" (ByVal lpszSoundName As String, ByVal uFlags As Long) As Lo
ng 

---- 以 及 如 下 的 标 识 常 量: 

---- Public Const SND_SYNC = &H0 
---- Public Const SND_ASYNC = &H1 
---- Public Const SND_NODEFAULT = &H2 
---- Public Const SND_MEMORY = &H4 
---- Public Const SND_ALIAS = &H10000 
---- Public Const SND_FILENAME = &H20000 
---- Public Const SND_RESOURCE = &H40004 
---- Public Const SND_ALIAS_ID = &H110000 
---- Public Const SND_ALIAS_START = 0 
---- Public Const SND_LOOP = &H8 
---- Public Const SND_NOSTOP = &H10 
---- Public Const SND_VALID = &H1F 
---- Public Const SND_NOWAIT = &H2000 
---- Public Const SND_VALIDFLAGS = &H17201F 
---- Public Const SND_RESERVED = &HFF000000 
---- Public Const SND_TYPE_MASK = &H170007 

---- sndPlaySound 函 数 需 要 两 个 参 数, 第 一 个 参 数soundfilenam
e 是 要 播 放 的WAV 文 件 的 名 称。 第 二 个 参 数 是 一 个 表 明 播 
放 方 式 的 标 识 常 量, 其 定 义 的 值 如 上 所 示, 通 常 所 使 用 
的 标 识 意 义 如 下: 

---- SND_SYNC 播 放WAV 文 件, 播 放 完 毕 后 将 控 制 转 移 回 你 的 
应 用 程 序 中。 
---- SND_ASYNC 播 放WAV 文 件, 然 后 将 控 制 立 即 转 移 回 你 的 应
 用 程 序 中, 而 不 管 对WAV 文 件 的 播 放 是 否 结 束。 
---- SND_NODEFAULT 不 要 播 放 缺 省 的WAV 文 件, 以 免 发 生 某 些 意
 外 的 错 误。 
---- SND_MEMORY 播 放 以 前 已 经 加 载 到 内 存 中 的WAV 文 件。 
---- SND_LOOP 循 环 播 放WAV 文 件。 
---- SND_NOSTOP 在 开 始 播 放 其 它 的WAV 文 件 之 前, 需 要 完 成 对
 本WAV 文 件 的 播 放。 

---- 注 意:SND_LOOP 标 识 通 常 需 要 同SND_ASYNC 共 同 使 用, 也 即
 在 两 个 标 识 之 间 添 加 与 播 放 符, 以 免 在 对WAV 文 件 进 行 播
 放 的 时 候 将 系 统 挂 起。 

---- 为 了 播 放MIDI 文 件, 你 需 要 在 你 的 程 序 窗 体 的 通 用 声
 明 部 分 中, 或 是 标 准 模 块 中 添 加 如 下 的 声 明 语 句: 

---- Private Declare Function mciExecute Lib "winmm.dll" Alias "mciExe
cute" (ByVal lpstrCommand As String) As Long 

---- mciExecute 函 数 只 需 要 一 个 参 数,CommandString, 顾 名 思 义
, 它 是 一 个 命 令 字 符 串, 用 于 表 明 对 声 音 文 件 播 放 的 命
 令, 例 如, 希 望 完 整 播 放 声 音 文 件, 则 该 字 符 串 就 是 字 
符 串損lay" 加 上 声 音 文 件 的 路 径 以 及 文 件 名 称, 如 下 所 示
** 

---- Dim ReturnValue As Long 
---- ReturnSoundValue = mciExecute("play C:\WIN95\MEDIA\CANYON.MID") 


---- 如 果 希 望 对 声 音 文 件 的 部 分 进 行 播 放, 可 以 使 用from
...to... 语 句 格 式, 例 如 若 要 播 放CANYON.MID 文 件 的10 毫 秒 到
100 毫 秒 的 部 分, 可 以 使 用 如 下 的 语 句: 

---- Dim ReturnValue As Long 
---- ReturnSoundValue = mciExecute("play C:\WIN95\MEDIA\CANYON.MID fro
m 10 to 100") 
---- mciExecute 函 数 也 可 以 用 来 对WAV 文 件 进 行 播 放, 方 法 同
 播 放MIDI 一 样。 

样 例 程 序 

---- 1. 在Visual Basic 中 开 始 一 个 新 的 项 目, 采 用 缺 省 的 方 
法 建 立Form1。 
---- 2. 将 如 下 的 声 明 语 句 添 加 到Form1 的 通 常 声 明 部 分 中(
 注 意 每 个 声 明 语 句 需 要 被 书 写 在 一 行 内): 

---- Private Declare Function sndPlaySound Lib "winmm.dll" Alias "sndP
laySoundA" (ByVal lpszSoundName As String, ByVal uFlags As Long) As Lo
ng 

---- Const SND_SYNC = &H0 
---- Const SND_ASYNC = &H1 
---- Const SND_NODEFAULT = &H2 
---- Const SND_MEMORY = &H4 
---- Const SND_ALIAS = &H10000 
---- Const SND_FILENAME = &H20000 
---- Const SND_RESOURCE = &H40004 
---- Const SND_ALIAS_ID = &H110000 
---- Const SND_ALIAS_START = 0 
---- Const SND_LOOP = &H8 
---- Const SND_NOSTOP = &H10 
---- Const SND_VALID = &H1F 
---- Const SND_NOWAIT = &H2000 
---- Const SND_VALIDFLAGS = &H17201F 
---- Const SND_RESERVED = &HFF000000 
---- Const SND_TYPE_MASK = &H170007 

---- Private Declare Function mciExecute Lib "winmm.dll" Alias "mciExe
cute" (ByVal lpstrCommand As String) As Long 

---- 3. 在Form1 上 添 加 一 个 文 本 框 控 件, 采 用 缺 省 的 方 法 建
 立Text1。 将 它 的Caption 属 性 设 置 为NULL。 

---- 4. 在Form1 上 添 加 一 个 命 令 按 钮 控 件, 采 用 缺 省 的 方 法
 建 立Command1。 将 它 的Caption 属 性 设 置 为" 使 用sndPlaySound 函 
数敗* 

---- 5. 在Form1 上 添 加 一 个 命 令 按 钮 控 件, 采 用 缺 省 的 方 法
 建 立Command2。 将 它 的Caption 属 性 设 置 为" 使 用mciExecute 函 数
敗* 

---- 6. 将 如 下 的 代 码 添 加 到Command1 的 单 击 事 件 中: 


Private Sub Command1_Click()
    Dim ReturnValue As Long
    Text1.Text = " 使 用sndPlaySound 函 数 播 放TADA.WAV 文 件。"
    ReturnValue = sndPlaySound("C:\WIN95\MEDIA\TADA.WAV", SND_SYNC)
End Sub


---- 7. 将 如 下 的 代 码 添 加 到Command2 的 单 击 事 件 中: 


Private Sub Command2_Click()
    Dim ReturnValue As Long
    Text1.Text = " 使 用mciExecute 函 数 播 放Canyon.mid 文 件。"
ReturnSoundValue = mciExecute
            ("play C:\WIN95\MEDIA\CANYON.MID from 10 to 100")
End Sub


---- 通 过 按 下F5 键 来 执 行 样 例 程 序。 单 击" 使 用sndPlaySound 
函 数" 命 令 按 钮 则 使 用sndPlaySound 函 数 来 播 放C:\WIN95\MEDIA 目
 录 下 面 的TADA.WAV 声 音 文 件, 如 图1。 单 击" 使 用mciExecute 函 
数" 则 使 用mciExecute 函 数 来 播 放C:\WIN95\MEDIA 目 录 下 面 的CANY
ON.MID 文 件 的10 毫 秒 到100 毫 秒 的 部 分, 如 图2 所 示。 



c 避免装载多份应用程序


    你的程序可能只支持单一用户,那么怎么来避免多用户同时使用它吗? 

    你可以利用 App 对象的 PrevInstance 属性来轻易达到你的目的。

    我们可以在程序打开时加入以下代码来验证:

      If App.PrevInstance Then

         MsgBox ("程序已经运行,不能再次装载。"), vbExclamation

         Unload Me

      End If 
=============================================
              VB问答
问题部分:
回答部分:
=============================================
                其它

          网页在7.1日前将更新
====================================================================
欢迎订阅VB免费邮件:
订阅地址  http://server.com/WebApps/mail-list-subscribe.cgi?id=16852  

====================================================================  

如果您觉得这个邮件列表好的话,请告诉您的朋友。  
====================================================================
欢迎投稿  [email protected]  
====================================================================  

网易上的主页地址:http://www4.netease.com/~aaaaaaaaa 
本网站主页镜像地址:goodvbhome.yeah.net 
====================================================================

--
欢迎访问主页:goodvbhonme.yeah.net
或:http://www4.netease.com/~aaaaaaaaa
http://personal.gz168.gnet.gd.cn/vbok/

※ 来源:.月光软件站 http://www.moon-soft.com.[FROM: 202.103.48.63]

[关闭][返回]