明輝手游網(wǎng)中心:是一個(gè)免費(fèi)提供流行視頻軟件教程、在線學(xué)習(xí)分享的學(xué)習(xí)平臺(tái)!

在VC++中借助DHTML增加特效

[摘要]信息產(chǎn)業(yè)部電子第二十二研究所青島分所 郎銳 引言 隨著網(wǎng)絡(luò)技術(shù)的發(fā)展,網(wǎng)頁(yè)的實(shí)現(xiàn)語(yǔ)言也由最初靜止的超文本標(biāo)識(shí)語(yǔ)言(HTML)發(fā)展到了現(xiàn)在廣泛使用的動(dòng)態(tài)超文本標(biāo)識(shí)語(yǔ)言(DHTML),由于在這種新標(biāo)識(shí)語(yǔ)...
信息產(chǎn)業(yè)部電子第二十二研究所青島分所 郎銳

引言
隨著網(wǎng)絡(luò)技術(shù)的發(fā)展,網(wǎng)頁(yè)的實(shí)現(xiàn)語(yǔ)言也由最初靜止的超文本標(biāo)識(shí)語(yǔ)言(HTML)發(fā)展到了現(xiàn)在廣泛使用的動(dòng)態(tài)超文本標(biāo)識(shí)語(yǔ)言(DHTML),由于在這種新標(biāo)識(shí)語(yǔ)言中可以使用CSS(層疊式樣式表單)、JavaScript和VBScript等腳本語(yǔ)言以及其他的一些外部COM控件因此其可編程能力得到大大的加強(qiáng),尤其是Java語(yǔ)言的興起更起到推波助瀾的作用。由于Java是一種功能非常強(qiáng)大的網(wǎng)絡(luò)語(yǔ)言,因此在網(wǎng)頁(yè)設(shè)計(jì)時(shí)往往借助其來(lái)實(shí)現(xiàn)一些實(shí)現(xiàn)起來(lái)頗為復(fù)雜但卻十分美觀別致的網(wǎng)頁(yè)特效。雖然在另一種功能強(qiáng)大且素有"Windows 外科手術(shù)刀"之稱的VC++下對(duì)于某些特效也可以通過(guò)編程實(shí)現(xiàn),但實(shí)現(xiàn)過(guò)程往往比較復(fù)雜,比如
模擬焰火或煙霧的運(yùn)動(dòng)過(guò)程(動(dòng)畫)就需要用到DirectDraw等高級(jí)編程技術(shù),其實(shí)現(xiàn)難度遠(yuǎn)大于網(wǎng)頁(yè)特效的實(shí)現(xiàn)過(guò)程。正因如此,本文就對(duì)如何把實(shí)現(xiàn)起來(lái)較簡(jiǎn)單的用DHTML開發(fā)的網(wǎng)頁(yè)特效移植到VC++下展開討論。

1 DHTML實(shí)現(xiàn)的網(wǎng)頁(yè)特效
編寫網(wǎng)頁(yè)的HTML/DHTML語(yǔ)言區(qū)別于以往的編程語(yǔ)言的一個(gè)最大特點(diǎn)就是源碼公開,當(dāng)看到一個(gè)好的網(wǎng)頁(yè)時(shí)可以通過(guò)"查看源文件"看到作者是如何組織、設(shè)計(jì)該網(wǎng)頁(yè)的,而且可以從代碼級(jí)上對(duì)其進(jìn)行分析。當(dāng)我們看到其他一些好的應(yīng)用程序時(shí)只能根據(jù)自己的編程經(jīng)驗(yàn)和程序的實(shí)現(xiàn)功能來(lái)對(duì)程序的設(shè)計(jì)思路和實(shí)現(xiàn)方法進(jìn)行猜測(cè),而不少好的功能在無(wú)源碼的情況下無(wú)法再次編程實(shí)現(xiàn)以為我所用,而這些在網(wǎng)頁(yè)設(shè)計(jì)上則不存在任何問(wèn)題,可以通過(guò)參考他人寫的比較好的代碼來(lái)提高自己的設(shè)計(jì)水平。
前面已經(jīng)提到過(guò),DHTML語(yǔ)言的實(shí)現(xiàn)可以通過(guò)CSS、各種腳本語(yǔ)言、控件和JavaApplet等予以實(shí)現(xiàn),其中JavaApplet可以輕易設(shè)計(jì)出一些非常令人嘆服的網(wǎng)頁(yè)特效。下圖所示的網(wǎng)頁(yè)就是一個(gè)用JavaApplet插件實(shí)現(xiàn)的非常逼真的模擬焰火運(yùn)動(dòng)過(guò)程的特效網(wǎng)頁(yè)。可以通過(guò)查看源文件來(lái)觀察其實(shí)現(xiàn)代碼:

……

……
其中FireWork.class是整個(gè)模擬過(guò)程的核心,其部分主要源碼如下:

……
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++中引入特效網(wǎng)頁(yè)
在DHTML下可以借助.class文件以插件的形式輕松實(shí)現(xiàn)對(duì)焰火的真實(shí)模擬,而如要通過(guò)VC++來(lái)實(shí)現(xiàn)類似的效果,雖然也可以通過(guò)DirectX技術(shù)中的DirectDraw技術(shù)加以實(shí)現(xiàn),但僅對(duì)于該技術(shù)本身而言就足以使一個(gè)普通程序員感到吃力,更何況此時(shí)尚沒有把火焰的模擬算法考慮在內(nèi)!既然用DHTML實(shí)現(xiàn)網(wǎng)頁(yè)特效比較容易,那么可以設(shè)想:先通過(guò)DHTML做好一含有指定特效的網(wǎng)頁(yè),然后想辦法把該網(wǎng)頁(yè)通過(guò)編程的手段將其嵌入到VC++設(shè)計(jì)的程序中,即用混合編程的方法實(shí)現(xiàn)在VC++下的特效設(shè)計(jì)。
混合編程可以很好的把兩種或更多語(yǔ)言的優(yōu)點(diǎn)融合在一起,通過(guò)優(yōu)勢(shì)互補(bǔ)實(shí)現(xiàn)單一語(yǔ)言所不能實(shí)現(xiàn)的特殊功能。VC++憑借其強(qiáng)大的編程手段可以很好地同VB、Delphi甚至匯編進(jìn)行混合編程,以期能達(dá)到最佳效果。對(duì)于HTML/DHTML語(yǔ)言,VC++ 6.0在MFC(微軟基本類庫(kù))中提供有一個(gè)從CView派生出來(lái)的子類CHtmlView。在用VC++進(jìn)行程序設(shè)計(jì)時(shí)可以將視類從CHtmlView中派生,以繼承其對(duì)HTML/DHTML的支持特性,從而能很簡(jiǎn)便方式實(shí)現(xiàn)對(duì)網(wǎng)頁(yè)的嵌入。

2.1 程序框架的建立
在建立程序框架時(shí)可以根據(jù)需要選取不同的形式,但必須保證在最后一步選則以CHtmlView為基類。如果沒有選擇,或要使已有程序具備上述功能也可以通過(guò)搜尋與替換將視類頭文件和源文件中所有的CView替換成CHtmlView,以完成基類的轉(zhuǎn)換。

2.2 特效網(wǎng)頁(yè)的嵌入
通過(guò)MSDN幫助查看其成員函數(shù)可以得知Navigate2();函數(shù)可以在客戶區(qū)顯示指定的網(wǎng)頁(yè)(網(wǎng)絡(luò)上的或本地的)該函數(shù)的原形如下:

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 );
盡管原形各不相同,但最主要的參數(shù)是第一個(gè)參數(shù),它指定了網(wǎng)絡(luò)上網(wǎng)頁(yè)的URL(統(tǒng)一資源定位符)或是本地機(jī)上的網(wǎng)頁(yè)的存放路徑,需要特別指出,這里的存放路徑必須是完整的絕對(duì)路徑,相對(duì)路徑將會(huì)導(dǎo)致失敗。因此為了保證程序在路徑改變后能正常工作,需要在顯示網(wǎng)頁(yè)之前通過(guò)GetModuleFileName()函數(shù)動(dòng)態(tài)判斷程序的當(dāng)前存放路徑。下面將特效網(wǎng)頁(yè)嵌入部分的主要實(shí)現(xiàn)代碼介紹如下:

……
//獲取到當(dāng)前應(yīng)用程序存放的全路徑,如C:\Windows\nope.exe形式
char exeFullPath[MAX_PATH];
GetModuleFileName(NULL,exeFullPath,MAX_PATH);
//將路徑分離出來(lái),得到如C:\Windows\的形式
CString string;





string.Format("%s",exeFullPath);
exeFullPath[string.GetLength()-9]='\0';
string.Format("%s",exeFullPath);
//在路徑后添加特效網(wǎng)頁(yè)的路徑,得到如C:\Windows\test.html的形式
string+="test.html";
//在客戶區(qū)顯示具有特效的網(wǎng)頁(yè)
Navigate2(string,NULL,NULL);
……
經(jīng)過(guò)DHTML網(wǎng)頁(yè)嵌入后的VC++程序的運(yùn)行效果如上圖所示,在程序中適當(dāng)?shù)膽?yīng)用網(wǎng)頁(yè)特效可以起到美化界面,加
強(qiáng)人機(jī)友好程度等較好的效果。

3 小結(jié)
本文通過(guò)對(duì)CHtmlView的派生繼承實(shí)現(xiàn)了在VC++下嵌入DHTML語(yǔ)言,并可借助所嵌入的DHTML語(yǔ)言實(shí)現(xiàn)一些在VC++中難以做到的或是實(shí)現(xiàn)起來(lái)頗為復(fù)雜的特效,并以此豐富程序的人機(jī)界面。本文所述思想具有較好的通用性。程序在Windows 98下,由Microsoft Visual C++ 6.0編譯通過(guò),瀏覽器為IE 6.0。