我们在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() |
相关图文阅读
频道图文推荐
健 康 咨 询
时 尚 咨 询
相关专题
- Wlan组网----家庭专题 (4184篇文章)
- 数字小键盘指法练习 (5501次浏览)
- 用WinSock控件编写网络聊天器 (2638次浏览)
- C++Builder注册表编程实例详解 (1568次浏览)
- C++ Builder VCL库函数简介 (1348次浏览)
- 在 C++ Builder中利用串行通信控件编程 (1213次浏览)
- C++ Builder中消息处理过程及应用 (1038次浏览)
- 将指定目录的结构装入TreeView中 (990次浏览)
- 用C++ Builder3 制作记事本 (818次浏览)
- Windows多线程间同步事件的控制方法 (787次浏览)
- C++Builder开发Web应用程序 (746次浏览)



