在MFC和ATL工程中加入GIF動畫(CPictureEx,CPitureExWnd)
1、你的對話方塊中加入一個靜態文字控制元件(Static Text)或圖片控制元件(Picture Control),Group Box也可以;
2、給控制元件的ID改個名字如IDC_MYPICTURE;
3、利用ClassWizard給控制元件新增變數。如:Category-Control,Variable type-CStatic;
4、在對話方塊的標頭檔案中用CPictureEx替換CStatic(當然不要忘記在你的工程中加入PictureEx.h和PictureEx.cpp,並#include "PictureEx.h");
5、在OnInitDialog(或者其他什麼你喜歡的地方)加入下面的程式碼:
if (m_Picture.Load(_T("mypicture.gif")))
m_Picture.Draw();
6、欣賞一下你的動畫:)
你可以像處理標準的CStatic一樣處理CPictureEx,可以手動建立它(實際上,當你的工程視窗不是對話方塊時,你必須得這樣),呼叫CPictureEx::Create(), 接著呼叫CPicureEx::Load()和CPicture::Draw()。
二、 ATL工程中加入GIF動畫
ATL版的CPitureExWnd使用也是以上步驟,但是第三點中不同的是,沒有ClassWizard的幫助,你須手工加入一個CPictureExWnd型別的變數,並加入以下程式碼在你的WM_INITDIALOG訊息處理程式中:
HWND hWnd = GetDlgItem(IDC_MYPIC);
if (hWnd) {
m_wndBanner.SubclassWindow(hWnd);//m_wndBanner即手工新增的變數
}
之後,你可以呼叫CPictureExWnd::Load()和CPicureExWnd::Draw()。當然,你也可以直接呼叫CPictureExWnd::Create,CPictureExWnd只是一個普通的視窗,這個普通的視窗的視窗程式中含有一些擴充套件的函式而已。
可用的介面函式有:
-
BOOL Load(...) - 裝載一個GIF併為顯示準備一個物件;
- BOOL Draw() - 顯示GIF或GIF動畫;
- void Stop() - 停止動畫;
- void UnLoad() - 停止動畫並釋放所有資源;
- void SetBkColor(COLORREF) - 設定背景顏色(透明區域);
- COLORREF GetBkColor() - 取得背景顏色;
- BOOL IsGIF() - 判斷是否GIF;
- BOOL IsAnimatedGIF() - 判斷是否GIF動畫;
- BOOL IsPlaying() - 判斷動畫是否在播放中;
- SIZE GetSize() - 獲取當前圖的尺寸;
- int GetFrameCount() - 獲取當前動畫的幀數;
- BOOL GetPaintRect(RECT *lpRect) - 獲取當前繪圖區域;
- BOOL SetPaintRect(const RECT *lpRect) - 設定繪圖區域;
- CPictureEx[Wnd]::Load有三個版本的過載函式:
- BOOL Load(LPCTSTR szFileName);//此版本過載函式的引數是圖的路徑,返回值是成功已否的布林值。
- BOOL Load(HGLOBAL hGlobal, DWORD dwSize);//此版本的引數是GlobalAlloc使用GMEM_MOVABLE標記分配的全域性記憶體塊的控制代碼及其大小。該函式不會釋放記憶體,所以記得用GlobalFree釋放記憶體。
- BOOL Load(LPCTSTR szResourceName,LPCTSTR szResourceType);//此版本從資源中獲取圖片名和圖片型別。例如:
- m_Picture.Load(MAKEINTRESOURCE(IDR_MYPIC),_T("GIFTYPE"));
注:裝載一個圖片後,呼叫CPictureEx[Wnd]::Draw()顯示它。如果是一個GIF動畫,Draw函式會建立一個背景執行緒去播放動畫;如果是一個靜止的圖片,它會被OleLoadPicture/IPicture直接顯示。你可以呼叫CPictureEx[Wnd]::Stop()在任意時刻停止播放執行緒。如果你不但想終止播放執行緒,還想釋放資源,使用CPictureEx[Wnd]::UnLoad()。注意:CPictureEx[Wnd]::Load自動呼叫Unload()函式。
預設地,背景被COLOR_3DFACE填充(即對話方塊的背景顏色)。如果你需要改變背景顏色,可在呼叫CPictureEx[Wnd]::Load()後呼叫CPictureEx[Wnd]::SetBkColor(COLORREF)。