摘要: 本文通過在VC中將外部swf格式文件內嵌為VC的內部資源,使其在程序運行過程中從資源動態釋放到臨時文件,從而實現VC對Flash動畫的播放。
引言
Flash動畫由於可以很方便地把用戶的想象通過動畫顯現出來,使原本只屬於專業制作人員的動畫制作變的異乎尋常的快捷、方便。由於Flash制作的動畫在層次、內容、表現形式等諸多方面均比較出色,因此在網絡上得到迅猛的發展,更有不少廠商用Flash在互聯網上做起了廣告和產品演示,效果絲毫不比視頻的差,而體積則要小的多。Flash不僅在網絡上有廣泛的應用,在普通的應用程序中也可以借助Flash實現一些VC、Delphi等編程語言所難以實現的特效,比如在一些演示版的程序中完全可以將程序運行前的閃屏用Flash來制作。本文下面將通過對內嵌資源的動態釋放來實現VC對Flash動畫的播放,並給出了部分實現代碼。
嵌資源的動態釋放
Flash動畫在此是作為程序的一個模塊,雖然也可以以文件的形式作為一個外部資源來使用,但為了避免因外部模塊遺失而造成程序的非正常運行,可將由Flash 5.0預先制作好的swf格式的文件以資源的形式打包到應用程序中去,而在程序運行時再將其從資源恢復到文件,使用完畢再通過程序將其從磁盤刪除。
在導入資源時由於swf格式文件並非VC的標准資源,所以在導入時需要在"Resource type"欄指定資源類型"SWF",特別需要注意的是在此必須要包含引號。加入到資源後可以通過資源視圖看到導入的SWF資源是以二進制形式保存的,一但加入就不能再通過資源視圖對其進行編輯了。
在使用SWF資源前首先要將其動態從應用程序中釋放到文件中才可對資源做進一步的使用。可先通過宏MAKEINTRESOURCE()將資源標識號IDR_SWF轉換成字符串Name,再分別通過FindResource()、LoadResource()函數查找、裝載該資源到內存:
CString Type="swf";
HRSRC res=FindResource (NULL,Name,Type);
HGLOBAL gl=LoadResource (NULL,res);
當資源加載到內存後,還要通過對資源內存的鎖定來返回指向資源內存的地址的指針,並籍此實現資源從內存到磁盤的保存,至於存盤的操作則由文件函數CreateFile()、和WriteFile()來完成:
LPVOID lp=LockResource(gl); //返回指向資源內存的地址的指針。
CString filename="Temp.swf"; //保存的臨時文件名
// CREATE_ALWAYS為不管文件存不存在都產生新文件。
fp= CreateFile(filename ,GENERIC_WRITE,0,NULL,CREATE_ALWAYS,0,NULL);
DWord a;
//sizeofResource 得到資源文件的大小
if (!WriteFile (fp,lp,SizeofResource (NULL,res),&a,NULL))
return false;
CloseHandle (fp); //關閉句柄
FreeResource (gl); //釋放內存
通過上述代碼,可將SWF資源從應用程序中提取並釋放到臨時文件Temp.swf中,在此後只對此臨時文件操作,與程序內嵌資源無關。
Flash動畫的播放
swf格式的Flash動畫通常主要應用在網頁上,也就是說IE浏覽器本身可以支持Flash動畫的播放。這樣就不必再單獨編寫用於播放swf文件的代碼,從而大大減少編程的工作量。在VC ++ 6.0中新增了一個從CView派生的、用於處理網頁的視類CHtmlVIEw,由於該類是以Internet Explorer為後台支持,因此在創建工程時只需在最後一步指定視類從CHtmlView派生就可以使程序不編一行代碼而具備IE浏覽器的網頁顯示能力。
程序剛生成的時候缺省的連接主頁是為微軟公司的主頁,需要對此修改,使程序在執行時立即顯示剛才提取出來的Flash臨時文件Temp.swf。顯示缺省主頁的代碼是在視類的初始化函數中進行的:
void CEmbedModuleVIEw::OnInitialUpdate()
{
CHtmlVIEw::OnInitialUpdate();
Navigate2(_T("http://www.microsoft.com"),NULL,NULL);
}
顯然要將Navigate2()函數的第一個參數改成Temp.swf的存放路徑。剛才在釋放資源到文件時並沒有指定絕對路徑,因此釋放出來的資源文件應當和應用程序處於同一目錄。但是在此處如果不寫明絕對路徑是無法顯示該臨時文件的。
$False$獲取該臨時文件的絕對路徑可用如下方法實現:先獲取應用程序本身的絕對路徑,然後去處應用程序全名(程序名和擴展名)此時得到的是應用程序和臨時文件所處文件夾的路徑,最後只需在此基礎上加上臨時文件的文件名Temp.swf即可得到臨時文件的全路徑。下面是實現的主要代碼:
//獲取應用程序的全路徑
char exeFullPath[MAX_PATH];
GetModuleFileName(NULL,exeFullPath,MAX_PATH);
//將其格式化為字符串
m_TempFile.Format("%s",exeFullPath);
//去掉應用程序的全名(15為應用程序文件全名的長度)
exeFullPath[m_TempFile.GetLength()-15]=''\0'';
//得到應用程序所在路徑
m_TempFile.Format("%s",exeFullPath);
//得到臨時文件的全路徑
m_TempFile+="Temp.swf";
最後將得到的臨時文件的全路徑m_TempFile作為參數傳遞給Navigate2()即可在程序運行時把Flash動畫作為主頁而顯示(如下圖所示)。
由於臨時文件Temp.swf是在程序運行過程中從應用程序的資源中提取出來的,因此在程序退出之前需要將其刪除。一般是在消息WM_DESTORY的響應函數裡通過DeleteFile()函數來加以實現的。
小結
本文通過對CHtmlVIEw和內嵌資源的動態釋放實現了Flash動畫在VC程序中的播放,並對資源的動態釋放作了較為清晰的描述。通過類似的方法,可以將動態鏈接庫、Html文件等程序模塊作為資源嵌入其中,在使用時再動態釋放到臨時文件,這樣可有效避免文件模塊過多時的雜亂以及程序模塊丟失導致程序非正常運行等情況的發生。本文所述程序在Windows 98下,由Microsoft Visual C++ 6.0編譯通過。Flash動畫由 Macromedia Flash 5.0制作,所需浏覽器支持為Internet Explorer 6.0。