信息產業部電子第二十二研究所青島分所 郎銳
引言 隨著網絡技術的發展,網頁的實現語言也由最初靜止的超文本標識語言(HTML)發展到了現在廣泛使用的動態超文本標識語言(DHTML),由于在這種新標識語言中可以使用CSS(層疊式樣式表單)、JavaScript和VBScript等腳本語言以及其他的一些外部COM控件因此其可編程能力得到大大的加強,尤其是Java語言的興起更起到推波助瀾的作用。由于Java是一種功能非常強大的網絡語言,因此在網頁設計時往往借助其來實現一些實現起來頗為復雜但卻十分美觀別致的網頁特效。雖然在另一種功能強大且素有"Windows 外科手術刀"之稱的VC++下對于某些特效也可以通過編程實現,但實現過程往往比較復雜,比如 模擬焰火或煙霧的運動過程(動畫)就需要用到DirectDraw等高級編程技術,其實現難度遠大于網頁特效的實現過程。正因如此,本文就對如何把實現起來較簡單的用DHTML開發的網頁特效移植到VC++下展開討論。
1 DHTML實現的網頁特效 編寫網頁的HTML/DHTML語言區別于以往的編程語言的一個最大特點就是源碼公開,當看到一個好的網頁時可以通過"查看源文件"看到作者是如何組織、設計該網頁的,而且可以從代碼級上對其進行分析。當我們看到其他一些好的應用程序時只能根據自己的編程經驗和程序的實現功能來對程序的設計思路和實現方法進行猜測,而不少好的功能在無源碼的情況下無法再次編程實現以為我所用,而這些在網頁設計上則不存在任何問題,可以通過參考他人寫的比較好的代碼來提高自己的設計水平。 前面已經提到過,DHTML語言的實現可以通過CSS、各種腳本語言、控件和JavaApplet等予以實現,其中JavaApplet可以輕易設計出一些非常令人嘆服的網頁特效。下圖所示的網頁就是一個用JavaApplet插件實現的非常逼真的模擬焰火運動過程的特效網頁。可以通過查看源文件來觀察其實現代碼:
…… …… 其中FireWork.class是整個模擬過程的核心,其部分主要源碼如下:
…… public class FireWork extends java.applet.Applet { public void init() { int width,height; symantec.itools.lang.Context.setApplet(this); //{{INIT_CONTROLS setLayout(null); width = this.size().width; height = this.size().height; setSize(width,height); setForeground(new Color(16711935)); setBackground(new Color(0)); firework1 = new symantec.itools.multimedia.Firework(); firework1.setBounds(0,0,width,height); add(firework1); //}} } //{{DECLARE_CONTROLS symantec.itools.multimedia.Firework firework1; //}} } …… 其需要有IE 4.0、Netscape 4.03或更高版本瀏覽器的支持。
2 在VC++中引入特效網頁 在DHTML下可以借助.class文件以插件的形式輕松實現對焰火的真實模擬,而如要通過VC++來實現類似的效果,雖然也可以通過DirectX技術中的DirectDraw技術加以實現,但僅對于該技術本身而言就足以使一個普通程序員感到吃力,更何況此時尚沒有把火焰的模擬算法考慮在內!既然用DHTML實現網頁特效比較容易,那么可以設想:先通過DHTML做好一含有指定特效的網頁,然后想辦法把該網頁通過編程的手段將其嵌入到VC++設計的程序中,即用混合編程的方法實現在VC++下的特效設計。 混合編程可以很好的把兩種或更多語言的優點融合在一起,通過優勢互補實現單一語言所不能實現的特殊功能。VC++憑借其強大的編程手段可以很好地同VB、Delphi甚至匯編進行混合編程,以期能達到最佳效果。對于HTML/DHTML語言,VC++ 6.0在MFC(微軟基本類庫)中提供有一個從CView派生出來的子類CHtmlView。在用VC++進行程序設計時可以將視類從CHtmlView中派生,以繼承其對HTML/DHTML的支持特性,從而能很簡便方式實現對網頁的嵌入。
2.1 程序框架的建立 在建立程序框架時可以根據需要選取不同的形式,但必須保證在最后一步選則以CHtmlView為基類。如果沒有選擇,或要使已有程序具備上述功能也可以通過搜尋與替換將視類頭文件和源文件中所有的CView替換成CHtmlView,以完成基類的轉換。
2.2 特效網頁的嵌入 通過MSDN幫助查看其成員函數可以得知Navigate2();函數可以在客戶區顯示指定的網頁(網絡上的或本地的)該函數的原形如下:
void Navigate2( LPITEMIDLIST pIDL, DWORD dwFlags = 0, LPCTSTR lpszTargetFrameName = NULL );
void Navigate2( LPCTSTR lpszURL, DWORD dwFlags = 0, LPCTSTR lpszTargetFrameName = NULL, LPCTSTR lpszHeaders = NULL, LPVOID lpvPostData = NULL, DWORD dwPostDataLen = 0 );
void Navigate2( LPCTSTR lpszURL, DWORD dwFlags, CByteArray& baPostedData, LPCTSTR lpszTargetFrameName = NULL, LPCTSTR lpszHeader = NULL ); 盡管原形各不相同,但最主要的參數是第一個參數,它指定了網絡上網頁的URL(統一資源定位符)或是本地機上的網頁的存放路徑,需要特別指出,這里的存放路徑必須是完整的絕對路徑,相對路徑將會導致失敗。因此為了保證程序在路徑改變后能正常工作,需要在顯示網頁之前通過GetModuleFileName()函數動態判斷程序的當前存放路徑。下面將特效網頁嵌入部分的主要實現代碼介紹如下:
…… //獲取到當前應用程序存放的全路徑,如C:\Windows\nope.exe形式 char exeFullPath[MAX_PATH]; GetModuleFileName(NULL,exeFullPath,MAX_PATH); //將路徑分離出來,得到如C:\Windows\的形式 CString string;
string.Format("%s",exeFullPath); exeFullPath[string.GetLength()-9]='\0'; string.Format("%s",exeFullPath); //在路徑后添加特效網頁的路徑,得到如C:\Windows\test.html的形式 string+="test.html"; //在客戶區顯示具有特效的網頁 Navigate2(string,NULL,NULL); …… 經過DHTML網頁嵌入后的VC++程序的運行效果如上圖所示,在程序中適當的應用網頁特效可以起到美化界面,加 強人機友好程度等較好的效果。
3 小結 本文通過對CHtmlView的派生繼承實現了在VC++下嵌入DHTML語言,并可借助所嵌入的DHTML語言實現一些在VC++中難以做到的或是實現起來頗為復雜的特效,并以此豐富程序的人機界面。本文所述思想具有較好的通用性。程序在Windows 98下,由Microsoft Visual C++ 6.0編譯通過,瀏覽器為IE 6.0。
|