網站建設| 數據庫類| 圖形圖象| 程序設計| 現代辦公| 操作系統| 考試認證| 網絡技術| 軟件工程| 電腦相關| 文學作品
網站開發| 網頁制作| 操作系統| 圖象圖形| 考試認證| 數據庫類| 程序設計| 硬件技術| 現代辦公| 網絡技術| 笑話頻道
 
您的位置: 電腦書庫首頁-> 電腦文摘-> 程序設計-> C++Builder-> 用C++Builder開發動畫DLL

用C++Builder開發動畫DLL
作者:佚名 來源:InterNet 加入時間:2005-1-28
相關文章
  • C++Builder中集合的處理
  • 用C++Builder 建立數據庫VCL使用經驗
  • C++Builder定制系統菜單
  • 相關書籍:
  • C++Builder6.0界面實例開發
  • c++builder6編程實例精講
  • 我們在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()

    [文章錄入員:nancy]

    相關文章
  • C++Builder中集合的處理
  • 用C++Builder 建立數據庫VCL使用經驗
  • C++Builder定制系統菜單
  • 相關書籍:
  • C++Builder6.0界面實例開發
  • c++builder6編程實例精講
  • 本站推薦內容

    近期主機類熱搜關鍵詞:
    美國服務器 美國服務器租用 海外服務器租用 國外服務器租用

    C++Builder
    C/C++/VC
    C++Builder
    Basic/VB類
    Delphi/Pascal
    Java編程
    FORTRAN
    其它
    電腦教程閱讀排行
    ·模擬鍵盤按鍵 自動輸入文字
    ·在C++Builer中多線程的實...
    ·C++ Builder構建算二十...
    ·C++ Builder中消息處理...
    ·用C++ Builder實現桌布...
    ·用C++ Builder實現網絡...
    ·用C++ Builder開發多層...
    ·用C++Builder 建立數據...
    ·用BCB開發有身份認證功能的Em...
    ·個性凸現的動畫 特技效果
    福建22选5号码走势图