您的位置:软件 > 开发者网络 > 开发工具 > 开发专栏 > BCB > 正文
用C++Builder开发动画DLL
[文章信息]
作者:刘学平
时间:2002-08-12
出处:C++builder资源中心
责任编辑:
[文章导读]
我们在Windows98环境下执行拷贝文件、查找文件等计算机耗时较长的操作时,Windows会显示一个小小的动画......
advertisement
热点推荐
· 专业设计的魅力:精确的定位
· 在金山文字中输入文字
· 认识磁盘
· 小小的精彩Flash:广告作品
· 小小的精彩Flash:过关斩将II
[正文]
  我们在Windows98环境下执行拷贝文件、查找文件等计算机耗时较长的操作时,Windows会显示一个小小的动画,指示正在进行的操作,与死板的静止图像相比增色不少。那么我们自己开发软件时,能否也显示一个这样的动画提示呢?笔者开发了一个能够在PB下调用的动画DLL,由于采用多线程编程,PB调用的DLL函数能够及时将控制权交还给PB,不影响应用系统的运转。

  一、代码与编译选项

  在C++Builder中创建一个空白的DLL项目。

  创建一个空白的Form,修改它的属性为: BorderStyle=bsDialog

BorderIcons的子属性均为False

FormStyle=fsStayOnTop

Position= poScreenCenter

Name=StatusForm

  在Form上添加一个Win32下的Animate控件Animate1,修改它的属性为 Align=alTop在Form上添加一个Standard下的Button控件Button_Cancel,再添加System下的Timer控件Timer1,设置定时Interval时间位250,较快响应用户的取消请求。

  因为PB应用系统与动画窗体代码分别属于两个线程,不能采用PB线程直接关闭动画窗体线程的窗口,否则会引起系统运行不正常,因此采用PB线程设置关闭标志,而动画线程采用Timer控件定时检查标志,一旦检测到关闭标志,就关闭窗口,清除线程标志,结束动画线程。

   5.下面给出编码及编码原理:

  (1)DLL主体代码: /*DLL主体代码

 *定义DLL公用变量

*g_CommonAVI 对Animate控件

动画类型索引

 *gi_Canceled Button_Cancel

按钮是否被选择过

 *gi_AVIType 要显示的动画类型,

由DLL输出函数做为参数输入

 *gi_RequestClose 请求动画线程关闭标志

 *gi_WindowActive 动画窗口所处的状态

 *lpsWinTitle 动画窗体的标题,

由DLL输出函数做为参数输入

 */

  TCommonAVI g_CommonAVI[]={

   aviNone, aviFindFolder,

   aviFindFile, aviFindComputer,

  aviCopyFiles, aviCopyFile,

   aviRecycleFile, aviEmptyRecycle,

  aviDeleteFile

  };

  int gi_Canceled=0,gi_AVIType=0;

  int gi_RequestClose=0,gi_WindowActive=0;

  char lpsWinTitle[256];

  HWND hWndParent=NULL;

  /*定义DLL输出函数*/

  extern"C" __declspec(dllexport) int pascal Dll

EntryPoint(HINSTANCE hinst, unsigned

long reason, void*);

  extern"C" __declspec(dllexport) int pascal

ShowStatus Window

(int AVIType,LPSTR WinTitle,long hWnd);

extern"C" __declspec(dllexport)

int pascal GetStatus(int ai_CloseWin);

extern"C" __declspec(dllexport)

int pascal CloseStatusWindow();

  /*定义线程TformThread:*/

  class TFormThread : public TThread{

  public: // User declarations

  __fastcall TFormThread(bool CreateSuspended);

  void __fastcall Execute(void);

  };

  __fastcall TFormThread::

TFormThread(bool CreateSuspended):

TThread(CreateSuspended){

  }

/*动画线程执行代码, 动画窗体的定时器控件会关闭它,

清除窗体存在标志后结束线程的运行

*/

  void __fastcall TFormThread::Execute(void){

  gi_WindowActive=1;

   StatusForm=new TStatusForm(NULL);

   StatusForm->Caption=lpsWinTitle;

  StatusForm->ShowModal();

   gi_WindowActive=0;

  delete StatusForm;

   gi_RequestClose=0;

  }

  /*定义一个线程实例指针*/

  TFormThread*FormThread;

  /*输出函数代码实现部分

  * DllEntryPoint 32位DLL入口

  * ShowStatusWindow 显示动画窗口,

  它通过创建一个线程来创建窗口,

  避免由于窗口的MODAL属性而使

  控制权不能及时的返还给调用者

  * GetStatus 取得"取消"状态,

  即用户有没有选择"取消"按钮

  * CloseStatusWindow 关闭动画窗口,

  */

  __declspec(dllexport) int WINAPI DllEntryPoint

(HINSTANCE hinst, unsigned long reason, void*)

  {

  return 1;

  }

 __declspec(dllexport) int pascal ShowStatusWindow

(int AVIType,LPSTR WinTitle,long hWnd){

 hWndParent=(HWND)hWnd;

memset(lpsWinTitle,0,sizeof(lpsWinTitle));

 strncpy(lpsWinTitle,WinTitle,sizeof(lpsWin Title)-1);

if (AVIType>0&&AVIType<=8) gi_AVIType="AVIType;"  FormThread="new" TFormThread(true);   FormThread->Priority = tpNormal;

   FormThread->Resume();

  }

 __declspec(dllexport) int pascal GetStatus

(int ai_CloseWin){

  if (gi_Canceled)

  if (gi_WindowActive){

  gi_RequestClose=1;

   while(gi_RequestClose);

   }

   return gi_Canceled;

  }

  __declspec(dllexport) int pascal CloseStatusWindow(){

  if (gi_WindowActive){

  gi_RequestClose=1;

   while(gi_RequestClose);

  }

   return gi_Canceled;

  }

  (2)窗体StatusForm的代码:  TStatusForm*StatusForm;

  extern int gi_Canceled;

  extern int gi_AVIType;

  extern TCommonAVI g_CommonAVI[];

  __fastcall TStatusForm::TStatusForm

(HWND ParentWindow)

   : TForm(ParentWindow)

  {

   gi_Canceled=0;

  }

  //取消按钮并不直接关闭窗体, 而指示设置取消标志,供调用者查看

  void __fastcall TStatusForm::Button_CancelClick

(TObject*Sender)

  {

  gi_Canceled=1;

  // ModalResult=mrCancel;

  }

   //激活动画,在FORMCREATE事件中

  void __fastcall TStatusForm::FormCreate

(TObject*Sender)

  {

   Animate1->CommonAVI=g_CommonAVI[gi_AVI

Type];

  Animate1->Active = true;

  }

 extern int gi_RequestClose;

 //定时器事件检测到结束标志关闭窗体

 void __fastcall TStatusForm::Timer1Timer

(TObject*Sender)

  {

   if (gi_RequestClose){

   ModalResult=mrOk;

   }

  }


  v6.设置编译选项:打开Project Options对话框,清除Linker属性页中的Use DynamicRTL标志,清除Packages属性页中的Build with runtime packages。这样只要单个DLL就可以运行了,而不必安装一些动态连接运行时间库。

  二、使用动画DLL

  1.定义:

  //Declare-> Global External Functions

  FUNCTION Long ShowStatusWindow

(Long AVIType,String WinTitle,long hWnd)

&LIBRARY"STATWIN.DLL" ALIAS FOR

"Show StatusWindow"

  FUNCTION Long GetCancelStatus

(Long CloseWindow)&LIBRARY

"STATWIN.DLL" ALIAS FOR"GetStatus"

  FUNCTION Long CloseStatusWindow()&

 LIBRARY"STATWIN.DLL" ALIAS FOR

"CloseStatusWindow"

  2.调用:

  long ll_EndTime

  //显示查找文件夹动画

  ShowStatusWindow(2)

  setpointer(HourGlass!)

  ll_EndTime = Cpu()+10*1000

  DO

   if GetCancelStatus(0)=1 then

   exit

  end if

   //做想做的事情

  LOOP UNTIL cpu() > ll_EndTime

  CloseStatusWindow()

·"WAP天极之IT新闻资讯,50万元等你拿"    ·天极WAP之游戏狂图,50万元等你下载


发表评论推荐给朋友我想参加相关培训打印我对此感兴趣订阅电子杂志
相关内容阅读排行榜
  • [配置推荐]4100元高性价比配置
  • 软件频道电脑应用多媒体教程
  • 专业设计的魅力:精确的定位
  • 在金山文字中输入文字
  • 认识磁盘
  • 小小的精彩Flash:广告作品
  • 小小的精彩Flash:过关斩将II
  • 11.19精选 闪客五周年作品展
  • Advertisement

    天极无线
    待机彩图    >>更多
    多彩动画    >>更多
    美妙和弦    >>更多
    天使在唱歌
    壁虎漫步
    PrettyBoy
    LoveLoveLove
    我是你的小小狗
    单身情歌
    十面埋伏
    祝酒歌
    回心转意
    波斯猫
    太委屈
    S.H.E
    潘玮柏
    M2M
    蔡依林
    阿牛
    林志炫
    陈弈迅
    刀郎
    黑龙
    S.H.E
    陶晶莹
    情人玫瑰坊
    音乐风云
    新片速递
    神秘测试
    都市约会
    ·天极彩信天天精彩
    ·图铃梦工厂下载无限!
    ·找寻童真,卡通专题
    ·夏日激情交友社区!
    ·星座运程,预测人生

    CSEEK搜索