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