程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> VC >> vc教程 >> VC++實現動畫彈出/彈入式窗口

VC++實現動畫彈出/彈入式窗口

編輯:vc教程

  網絡螞蟻這個軟件一定不會陌生,它的下載速度,斷點續傳的功能都給我們留下了深刻的印象,同時它的軟件界面也是相當棒的。在NetAnt的1.23版中,當下載任務完成或出錯時,在主窗口的中央會以動畫的方式展開一個窗口,報告當前下載的狀況;當用戶關閉窗口時,窗口又以收縮的方式關閉起來。那麼這個動畫窗口是怎樣實現的呢?本例就來討論一下在Visual C++中如何實現這種動畫窗口。

  一、 實現方法

  要實現這種動畫窗口的編程效果,主要用到WindowsAPI中的AnimateWindow()函數,通過在窗口的創建或消毀過程中調用該函數,來實現開啟和關閉程序時達到所希望的動畫窗口效果。AnimateWindow()函數所提供的動畫效果十分豐富,我們可以在自己的程序中選擇各種不同的動畫效果,增強程序的趣味性。為使讀者對AnimateWindow函數有一個基本了解,我們先對該函數做一個簡單介紹,該函數的原型為:

BOOL AnimateWindow(HWND hWnd,DWORD dwTime,DWord dwFlags)

  該函數能在顯示與隱藏窗口時產生兩種特殊類型的動畫效果:滾動動畫和滑動動畫。如果函數成功,返回值為非零;如果函數失敗,返回值為零。在下列情況下函數將失敗:窗口使用了窗口邊界、窗口已經可見仍要顯示窗口、窗口已經隱藏仍要隱藏窗口。函數參數hWnd指定產生動畫的窗口句柄;參數dwTime指明動畫持續的時間(以微秒計),完成一個動畫的標准時間為200微秒;參數dwFags指定動畫類型。這個參數可以是一個或多個下列標志的組合:

AW_SLIDE:使用滑動類型。缺省則為滾動動畫類型。當使用AW_CENTER標志時,這個標志就被忽略;

AW_ACTIVATE:激活窗口,在使用了AW_HIDE標志後不能使用這個標志;

AW_BLEND:實現淡出效果。只有當hWnd為頂層窗口的時候才可以使用此標志;

AW_HIDE:隱藏窗口,缺省則顯示窗口;

AW_CENTER:若使用了AW_HIDE標志,則使窗口向內重疊,即收縮窗口,若未使用AW_HIDE標志,則使窗口向外擴展,即展開窗口;

AW_HOR_POSITIVE:自左向右顯示窗口,該標志可以在滾動動畫和滑動動畫中使用,當使用AW_CENTER標志時,該標志將被忽略;

AW_VER_POSITIVE:自頂向下顯示窗口,該標志可以在滾動動畫和滑動動畫中使用,當使用AW_CENTER標志時,該標志將被忽略;

AW_VER_NEGATIVE:自下向上顯示窗口,該標志可以在滾動動畫和滑動動畫中使用,當使用AW_CENTER標志時,該標志將被忽略;

  二、 編程步驟

  1、 啟動Visual C++6.0,生成一個單文檔視圖結構的應用程序,程序命名為"AnmiateWindow";

  2、 使用Class Wizard在CMainFrame類中增加WM_CLOSE消息處理函數;

  3、 添加代碼,編譯運行程序;

  三、 程序代碼

  ////////////////////////////////////////////////////
  int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
  {
   if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
    return -1;
   if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD   WS_VISIBLE  
  CBRS_TOP  CBRS_GRIPPER   CBRS_TOOLTIPS   CBRS_FLYBY  
  CBRS_SIZE_DYNAMIC)   !m_wndToolBar.LoadToolBar(IDR_MAINFRAME))
   {
    TRACE0("Failed to create toolbarn");
    return -1; // fail to create
   }
   if (!m_wndStatusBar.Create(this)   !m_wndStatusBar.SetIndicators(indicators,
  sizeof(indicators)/sizeof(UINT)))
   {
    TRACE0("Failed to create status barn");
    return -1; // fail to create
   }
   // TODO: Delete these three lines if you don’t want the toolbar to
   // be dockable
   m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
   EnableDocking(CBRS_ALIGN_ANY);
   DockControlBar(&m_wndToolBar);
   CenterWindow();//使窗口運行時居於屏幕正中央
   AnimateWindow(GetSafeHwnd(),500,AW_CENTER);//動畫方式打開窗口
   return 0;
  }
  void CMainFrame::OnClose()
  {
   // TODO: Add your message handler code here and/or call default
   AnimateWindow(GetSafeHwnd(),500,AW_CENTER AW_HIDE);
   //在窗口關閉時,同樣以動畫的方式結束
   CFrameWnd::OnClose();
  }
  void CMainFrame::OnUpdateFrameTitle(BOOL Nada)
  {
   //本函數用於修改窗口標題欄
   CString csAppName;
   csAppName.Format(AFX_IDS_APP_TITLE);
   SetWindowText("Visual C++6.0編程序實例");
  }

  四、小結

  上面我們使用API函數實現了窗口的動態彈出與彈入,還有一種辦法可以達到同樣的效果,就是使用定時器,定時修改一個矩形尺寸的大小,然後用MoveWindow ()函數將當前窗口移動到該矩形位置上顯示。有興趣的讀者朋友可以按照這個思路動手實驗一下。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved