如何在PowerBuilder下设计动画 第一步：建立一个C＋＋类用户对象 在PowerBuilder主窗口工具栏中点击“User Object”图标，再在打开的“Select User Object”窗口中选择“New”，新建一个用户对象。当出现“New User Object”窗口时，选择C＋＋类，即建立一个 C＋＋类用户对象。并将动态连接库的名字保存为An_drawing.dll。 第二步：定义用户对象函数 选择“Declare”菜单项的“User Object Function”选项，在“Select Function User Object”窗口中选择“New”，定义如下三个对象函数：
void cf_play_drawing(int hwnd,char*filename)
//用于播放动画文件
void cf_stop_drawing() //停止动画播放
boolean cf_status_drawing() //检测播放状态
第三步：定义一个实例变量
选择“Declare”菜单项的“Instance Variables”选项， 定义一个实例变量用以保存设备号。变量名为drawing_id，类型为integer。
第四步：编写C语言源代码
选择菜单项“Design”的选项“Invoke C＋＋ Editor”,或在用户对象窗口中右击鼠标，在快捷菜单中选择“Invoke C＋＋ Editor”选项，出现含源文件项的窗口，这表明前面定义的用户对象已转换成了C＋＋源代码框架文件。现在，我们在文件uo_dra31.cpp和uo_dra31.hpp中分别加入程序源代码（见附一和附二）。
第五步：编译并链接生成动态库文件
在“Watcom IDE”窗口中，选择“Options”菜单项的“Linker Switches”选项，并设置好链接参数，选择菜单项“Sources”的下拉菜单选项“Make”，进行编译和链接。
第六步：建立一个应用并调用动态连接库
（1）在PowerBuilder主窗口中选取工具栏中的
“Application”画笔，建立一个应用App_drawing。
（2）选取工具栏中的“Window”画笔，创建一个新的窗口w_drawing，调整其大小，设置类型为“popup”，去掉Title、Control menu、 Max box、 Min box、 Resizable这五个选项。
（3）定义一个全局变量：uo_drawing ani_drawing。对窗口w_drawing的timer事件和close事件分别编写如下程序：
//timer事件程序
if ani_drawing.cf_status_drawing() then
ani_drawing.cf_stop_drawing()
close(w_drawing)
end if
// close事件程序
ani_drawing.cf_stop_drawing()
(4) 回到应用对象“App_drawing”的窗口，点击“Script”图标，写入如下代码：
ani_drawing=create uo_drawing
open(w_drawing)
ani_drawing.cf_play_drawing(handle(w_drawi_ng),“c:\zzl\dgame.flc")
timer(.05,w_drawing)
保存并运行应用，则会有一幅令人兴奋的动画闪烁到你面前。你可以选择你所喜爱的动画文件替换上述程序中的文件“dgame.flc”，将它加入到你的应用程序中，必使你的应用软件锦上添花。
附一：
＃include
＃include "uo_dra31.hpp"/＊＄PB＄－－begin generated code for object. Do not modify this code＊／
void uo_drawing::cf_play_drawing(short hwnd, char＊filename)
{ DWORD err;
LPSTR msg;
msg=new char(180);
cf_stop_drawing();
MciOpenParm1.dwCallback=0L;
MciOpenParm1.wDeviceID=0;
MciOpenParm1.wReserved0=0;
MciOpenParm1.lpstrDeviceType="Animation_1";
MciOpenParm1.lpstrElementName=(LPSTR)filename;
MciOpenParm1.lpstrAlias=NULL;
MciOpenParm1.dwStyle=WS_CHILD;
MciOpenParm1.hWndParent=hwnd;
if((err=micSendCommand(0,MCI_OPEN,(DWORD)(MCI_WAIT|MCI_OPEN_ELEMENT|MCI_OPEN_TYPE|MCI_ANIM_
OPEN_PARENT|MCI_ANIM_OPEN_WS),(DWORD)(LPMCI_OPEN_PARMS)＆MciOpenParm1))!=0L) //打开播放设备
{
mciGetErrorString(err,msg,80);
MessageBox(hwnd,msg,"错误信息",MB_OK);
return;
}
drawing_id=MciOpenParm1.wDeviceID; //得到设备号
MciPlayParm.dwCallback=(unsigned long)hwnd;
MciPlayParm.dwForm=0;
MciPlayParm.dwTo=0;
if((err=mcisendcommand(drawing_id,MCI_PLAY,MCI
_ NOTIFY,(DWORD)(LPMCI_PLAY_PARMS)＆MciPlayPARM))!=0L)
{
mciGetErrorString(err,msg,80);
MessageBox(hwnd,msg,"错误信息",MB_OK);
cf_stop_drawing();
return;
}
}
void uo_drawing::cf_stop_drawing( )
{
MCI_GENERIC_PARMS MciGenParm;
if(drawing_id==0) return;
MciGenParm.dwCallback=0L;
mcisendcommand(drawing_id,MCI_STOP,MCI_WAIT,(DWORD)(LPMCI_GENERIC_PARMS)＆MciGenPARM);
//停止动画文件的播放
mcisendcommand(drawing_id,MCI_CLOSE,MCI_WAIT,(DWORD)(LPMCI_GENERIC_PARMS)＆MciGenPARM);
//关闭动画播放设备
drawing_id=0;//初始化动画设备号
}
short uo_drawing::cf_status_drawing( )
{
MCI_STATUS_PARMS MciStatusParm;
LONG drawingLength;
LONG currentPos;
McistatusParm.dwItem=MCI_status_length;
mcisendcommand(drawing_id,MCI_STATUS,MCI_STATUS
_ITEM,(DWORD)(LPMCI_STATUS_PARMS)＆MciStatusPARM);
drawingLength=McistatusParm.dwreture;
McistatusParm.dwItem=MCI_status_POSITION;
mcisendcommand(drawing_id,MCI_STATUS,MCI_STATUS
_ITEM,(DWORD)(LPMCI_STATUS_PARMS)＆MciStatusPARM);
currentPos=McistatusParm.dwreture;
//如果动画播放完成则返回TURE,否则返回FALSE
if(currentPos
return FALSE;
else
return TRUE;
}
附二：
＃include
＃include
class uo_drawing
{
public:
virtual void cf_play_drawing( short hwnd, char ＊ filename );
virtual short cf_status_ing( );
virtual void cf_stop_drawing( );
public:
virtual ～uo_drawing() {}
MCI_ANIM_OPEN_PARMS MciOpenParm1;
//MCI相关的一些变量
MCI_open_parms MciOpenParm;
MCI_Play_parms MciPlayParm;
MCI_GENERIC_PARMS MciGenParm;
}
(郭 峰）